📄 pdoc.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 + -