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

📄 doc.c

📁 个人日程管理系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*-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, "&lt;");  pp += 4; break;		case '>': StrCopy(pp, "&gt;");  pp += 4; break;		case '&': StrCopy(pp, "&amp;"); pp += 5; break;//		case ' ': StrCopy(pp, "&nbsp;"); 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 + -