📄 doc.c
字号:
/* -*-Mode:C; tab-width:4; indent-tabs-mode:t; c-file-style:"stroustrup";-*- */// $Id: doc.c,v 1.12 2003/09/04 21:09:35 rick_price Exp $//// DOC format read/write access module.//#include "progect.h"#include "progectRsc.h"#include "task.h"#include "doc.h"#define DOC_EXPORT_LEVELS_MAX 6static DmOpenRef docdb;static DocInfo_t* info;static char* putp;static char* docrcd;static UInt16 docrcdlen;static UInt8 autonum[DOC_EXPORT_LEVELS_MAX];static Int16 nCurrLevel = -1;static void ExportTask_RawText(UInt16 index, TaskExtendedRecordType* pTask);static void ExportTask_HtmlUL(UInt16 index, TaskExtendedRecordType* pTask);static void ExportTask_HtmlHeading(UInt16 index,TaskExtendedRecordType* pTask);static void ExportTask_HtmlTable(UInt16 index, TaskExtendedRecordType* pTask);static char* encodeHTML(char const* src);static char const szNL[] = "\n";static char const szEmpty[] = { '\0' };static char const szHtmlPrefix[] ="<HTML>\n<HEAD>\n""<!-- LINK REL=stylesheet HREF=your_stylesheet.css TYPE=text/css -->\n""<LINK REL=stylesheet HREF=progect.css TYPE=text/css>\n""</HEAD>\n""<BODY class=progect>\n";static char const szHtmlSuffix[] = "</BODY>\n</HTML>";struct{ char const* szDescPrefix; char const* szDescSuffix; char const* szLinePrefix;} gDocExportHeadings[DOC_EXPORT_LEVELS_MAX] = { { "\n\n\n\n" "=========================\n" "", "\n" "=========================\n", szEmpty }, { "\n" "", "\n" "---------------------", szEmpty }, { " * ", szEmpty, szEmpty }, { " - ", szEmpty, " " }, { " >", szEmpty, " " }, { szEmpty, szEmpty, szEmpty },};typedef struct{ char const* szDocPrefix; char const* szDocSuffix; char const* szLevelPrefix; char const* szLevelSuffix; void (*fnProc)(UInt16 index, TaskExtendedRecordType* pTask);} DocExportFormatInfo_t;DocExportFormatInfo_t gDocExportFormatInfo[] = { { szEmpty, szEmpty, szEmpty, szEmpty, ExportTask_RawText }, { szHtmlPrefix, szHtmlSuffix, "<UL>\n", "</UL>\n", ExportTask_HtmlUL }, { szHtmlPrefix, szHtmlSuffix, szEmpty, szEmpty, ExportTask_HtmlHeading }, { "<HTML>\n<HEAD>\n" "<!-- LINK REL=stylesheet HREF=your_stylesheet.css TYPE=text/css -->\n" "<!-- LINK REL=stylesheet HREF=progect.css TYPE=text/css -->\n" "</HEAD>\n" "<BODY class=progect>\n" "<TABLE>\n", "</TABLE>\n" "</BODY>\n" "</HTML>\n", szEmpty, szEmpty, ExportTask_HtmlTable }};/**************************************************************************** * Name : encodeHTML * Desc : encode for HTML format * Parm : * Out : * Auth : seagull, 19.11.2000 * Mod : lb, 08.05.2001 * fixed <BR> length, thanks to lordofthefiles@users.sourceforge.net ***************************************************************************/static char* encodeHTML(char const* src){ UInt16 len = 0; char const* p; char* dst; char* pp; // calc dst length for (p = src; *p; p++) switch (*p) { case '<': case '>': len += 4; break; case '&': case ' ':// case ' ': case '\n': len += 5; break; default: len++; } // encode target str pp = dst = MemPtrNew(len + 1); for (p = src; *p; p++) switch (*p) { case '<': StrCopy(pp, "<"); pp += 4; break; case '>': StrCopy(pp, ">"); pp += 4; break; case '&': StrCopy(pp, "&"); pp += 5; break;// case ' ': StrCopy(pp, " "); pp += 5; break; case '\n': StrCopy(pp, "<BR>"); pp += 4; break; default: *pp++ = *p; } *pp = '\0'; return dst;} // static char* encodeHTML(char const* src)/**************************************************************************** * Name : compressDocBuffer * Desc : compress the DOC buffer (docrcd) * Parm : * Out : * Auth : seagull, 05.10.2000 (import from zDoc) ***************************************************************************/static void compressDocBuffer(void){#if 1 return ;#else int i, j;#define DISP_BITS 11#define COUNT_BITS 3 char *pBuffer; char *pHit; char *pPrevHit; char *pTestHead; char *pTestTail; char *pEnd; unsigned int dist, compound, k; char* pTmpBuff; int nTmpLen; Boolean space = false; pHit = pPrevHit = pTestHead = pBuffer = docrcd; pEnd = docrcd + docrcdlen; pTmpBuff = MemPtrNew(6000); nTmpLen = 0; for (pTestTail = pTestHead + 1; pTestHead != pEnd; pTestTail++) { if (pTestHead - pPrevHit > ((1 << DISP_BITS) - 1)) pPrevHit = pTestHead - ((1 << DISP_BITS) - 1); pHit = pPrevHit; for (i = pTestHead - pPrevHit + 1 ; i > 0; i--, pHit++) if (! *pHit == *pTestHead && MemCmp(pHit, pTestHead, pTestTail - pTestHead)) break; if (! i || pHit == pTestHead || pTestTail-pTestHead > (1 << COUNT_BITS) + 2 || pTestTail == pEnd) { if (pTestTail-pTestHead < 4) { unsigned char ch = pTestHead[0]; int iDest = nTmpLen; unsigned char *dest = pTmpBuff; if (space) { if (src >= 0x40 && ch <= 0x7f) dest[iDest++] = ch ^ 0x80; else { dest[iDest++] = ' '; if (ch >= 0x80 || (ch != 0 && ch <= 8)) dest[iDest++] = 1; dest[iDest++] = ch; } space = false; } else { if (src == ' ') space = true; else { if (ch >= 0x80 || (ch != 0 && ch <= 8)) dest[iDest++] = 1; dest[iDest++] = ch; } } nTmpLen = iDest; pTestHead++; } else { if (space) { pTmpBuff[nTmpLen++] = ' '; space = false; } dist = pTestHead - pPrevHit; compound = (dist << COUNT_BITS) + pTestTail-pTestHead-4; pTmpBuff[nTmpLen++] = 0x80 + (compound >> 8); pTmpBuff[nTmpLen++] = compound & 0xff; pTestHead = pTestTail - 1; } pPrevHit = pBuffer; } else pPrevHit = pHit; if (pTestTail == pEnd) pTestTail--; } if (space) pTmpBuff[nTmpLen++] = ' '; for (i=k=0; i < b->len; i++, k++) { pTmpBuff[k] = pTmpBuff[i]; if (pTmpBuff[k] >= 0x80 && pTmpBuff[k] < 0xc0) pTmpBuff[++k] = pTmpBuff[++i]; else if (pTmpBuff[k] == 1) { pTmpBuff[k+1] = pTmpBuff[i+1]; while (i + 2 < nTmpLen && pTmpBuff[i+2] == 1 && pTmpBuff[k] < 8) { pTmpBuff[k]++; pTmpBuff[k+b->buf[k]] = pTmpBuff[i+3]; i += 2; } k += pTmpBuff[k]; i++; } } MemMove(docrcd, pTmpBuff, pTmpLen); MemPtrFree(pTmpBuff); docrcdlen = nTmpBuff; return k;#endif}/**************************************************************************** * Name : flushDocBuffer * Desc : flush doc cache buffer pointed by docrcd. * Parm : * Out : * Auth : seagull, 03.10.2000 ***************************************************************************/static void flushDocBuffer(void){ UInt16 index; MemHandle h; MemPtr p; index = dmMaxRecordIndex; h = DmNewRecord(docdb, &index, docrcdlen); if (!h) return; p = MemHandleLock(h); compressDocBuffer(); DmWrite(p, 0, docrcd, docrcdlen); MemHandleUnlock(h); DmReleaseRecord(docdb, index, true); info->count++;}/**************************************************************************** * Name : putString * Desc : put the string on doc cache buffer * Parm : * -> target string * -> prefix for each lines * -> suffix for each lines * Out : * Auth : seagull, 03.10.2000 ***************************************************************************/static void putString(char const* str, char const* lineprefix, char const* linesuffix){ if (lineprefix) putString(lineprefix, NULL, NULL); // skip empty line on document head. if (info->uncompsizeoftext == 0) while (*str && *str == '\n') str++; while (*str) { if (docrcdlen >= 4096) { flushDocBuffer(); putp = docrcd; docrcdlen = 0; } if (str[0] == '\n' && str[1] != '\0') { if (linesuffix) putString(linesuffix, NULL, NULL); *putp++ = *str++; if (lineprefix) putString(lineprefix, NULL, NULL); } else *putp++ = *str++; docrcdlen++; info->uncompsizeoftext++; } if (linesuffix) putString(linesuffix, NULL, NULL);}/**************************************************************************** * Name : ExportToDoc * Desc : export current project to doc text * Parm : * -> cardNo of doc DB to generate * -> name generate doc DB name * Out : * Auth : seagull, 03.10.2000 ***************************************************************************/void ExportToDoc(UInt16 cardNo, char const* name, UInt16 first, UInt16 last){ LocalID docdbID; MemPtr rcd; UInt16 index; MemHandle h; DocExportFormatInfo_t* fmt = &gDocExportFormatInfo[gMemoExportPrefs.exportDocFormat]; Int16 nLevelOpened = 0; UInt16 dbAttributes; nCurrLevel = -1; docdbID = DmFindDatabase(cardNo, name); if (docdbID) { MessageBox(StrDocAlreadyExist); return ; } // // create and open DB // DmCreateDatabase(cardNo, name, DocCreatorID, DocTypeID, false); if (! (docdbID = DmFindDatabase(cardNo, name)) || ! (docdb = DmOpenDatabase(cardNo, docdbID, dmModeReadWrite)) ) { DEBUG1("can't create DB"); return ; } if (DmDatabaseInfo(cardNo, docdbID, NULL, &dbAttributes, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { DEBUG1("can't get DB info"); return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -