⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdoc.c

📁 smallbasic for linux
💻 C
字号:
/**	Palm DOC files **	Nicholas Christopoulos*//**	This source code is based on ZDOC project.**	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*	ZDOC Document Reader by Zurk Technology Inc. Ver.5.0.1b4 1998-99*	http://www.geocities.com/Area51/7689/zdoc.html*	This program is distributed under the terms of the GPL v.2.0 or later.*	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/#include "sys.h"#include "pdoc.h"#define	IDREAD	0x52454164	// 'REAd'#define	IDTEXT	0x54455874	// 'TEXt'#define	MAXDOC		128#define	MAXBM		128#define	MAXTEXTSIZE	4096#define BUFSIZE 	8192#define DISP_BITS 		11#define COUNT_BITS 		3#define	ZMAXTEXTSIZE	4096int		pdoc_uncompress(byte *dest, byte *source, int len)	SEC(PDOC);/**	opens a PDOC file*	returns 0 on success*			-1 file not found*			-2 cannot open file*			-3 out of memory*			-4 generic read error*/int		pdoc_open(const char *filename, pdoc_t *doc){	LocalID		LID;	word		maxrec;	MemHandle	rec_h;	MemPtr		rec_p;	memcpy(&doc->info, 0, sizeof(pdoc_info_t));	pdoc->page.raw = MemPtrNew(MAXTEXTSIZE+1);	if	( pdoc->page.raw )	{		pdoc->page.cook = MemPtrNew(BUFSIZE+1);		if	( pdoc->page.cook )	{			pdoc->page_no = 0;			pdoc->info.count = 0;			LID = DmFindDatabase(0, (char *) filename);			if	( LID )	{				doc->db_ref = DmOpenDatabase(0, LID, dmModeReadOnly);				if	( doc->db_ref )	{					maxrec  = DmNumRecords(doc->db_ref);					rec_h = DmQueryRecord(doc->db_ref, 0);					if	( rec_h )	{						rec_p = MemHandleLock(rec_h);						MemMove(&doc->info, rec_p, sizeof(pdoc_info_t));						MemPtrUnlock(rec_p);						DmReleaseRecord(doc->db_ref, 0, 0);						if ( maxrec <= doc->info.page_count )								doc->info.page_count = maxrec -1;						doc->page_count = doc->info.page_count;						doc->text = NULL;						doc->length = 0;						doc->page_no = 0xFFFF;	// there is nothing						}					else	{						DmCloseDatabase(0, LID);						MemPtrFree(pdoc->page.raw);						MemPtrFree(pdoc->page.cook);						return -4;						}					}				else	{					MemPtrFree(pdoc->page.raw);					MemPtrFree(pdoc->page.cook);					return -2;					}				}			else	{				MemPtrFree(pdoc->page.raw);				MemPtrFree(pdoc->page.cook);				return -1;				}			}		else	{			MemPtrFree(pdoc->page.raw);			return -3;			}		}	else		return -3;	return 0;}/**	close PDOC file*/void	pdoc_close(pdoc_t *doc){	DmCloseDatabase(0, LID);	MemPtrFree(pdoc->page.raw);	MemPtrFree(pdoc->page.cook);	memcpy(&doc->info, 0, sizeof(pdoc_info_t));	doc->text = NULL;	doc->length = 0;	doc->page_no = 0xFFFF;	// there is nothing}/**	uncompress a DOC text*	returns the new length*/int		pdoc_uncompress(byte *dest, byte *source, int len){	int		i, di, n;	int		dest_len;	word	c;	for ( i = dest_len = 0; i < len; ) {		c = source[i++];		if ( c > 0 && c < 9 )	{			while ( c -- ) 				dest[dest_len ++] = source[i ++];			}		else if ( c < 0x80 )			dest[dest_len ++] = c;		else if ( c >= 0xc0 ) {			dest[dest_len ++] = ' ';			dest[dest_len ++] = c ^ 0x80; 			} 		else {			c  = (c << 8) + source[i++];			di = (c & 0x3fff) >> COUNT_BITS;			n  = (c & ((1 << COUNT_BITS)-1)) + 3;			while ( n -- ) {				dest[dest_len] = dest[dest_len - di];				dest_len ++; 				}			}		}	if ( dest_len > ZMAXTEXTSIZE )		dest_len = ZMAXTEXTSIZE; 	return dest_len;}/**	Read standard DOC record (4096KB compressed or not)*/void	pdoc_loadpage(pdoc_t *doc, int index){	MemPtr		rec_p = NULL;	MemHandle	rec_h = NULL;	int			len, ulen;	if ( doc->info.page_count < index )		doc->length = 0;	doc->page_no = index;	rec_h = DmQueryRecord(doc->db_ref, index);	rec_p = MemHandleLock(rec_h);	len = MemPtrSize(rec_p);	if ( len > MAXTEXTSIZE )		len = MAXTEXTSIZE;	ulen = doc->page.raw_len = len;	if ( doc->info.version != 2 )		// 1 = uncompressed		MemMove(doc->page.cook, rec_p, len);	else	{							// 2 = compressed		MemMove(doc->page.raw, rec_p, len);		ulen = pdoc_uncompress(doc->page.cook, doc->page.raw, len);		}	doc->page.cook[ulen] = '\0';	MemHandleUnlock(rec_h);	DmReleaseRecord(doc->db_ref, doc->page_no, 0);	doc->page.org_len = ulen;	doc->length = ulen;	doc->text = doc->page.cook;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -