home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
linuxmafia.com 2016
/
linuxmafia.com.tar
/
linuxmafia.com
/
pub
/
palmos
/
progect-src-0.20.tar.gz
/
progect-src-0.20.tar
/
progect-0.20
/
doc.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-10-26
|
9KB
|
442 lines
/* -*-Mode:C; tab-width:4; indent-tabs-mode:t; c-file-style:"stroustrup";-*- */
// $Id: doc.c,v 1.5 2000/10/22 18:35:27 burgbach Exp $
//
// DOC format read/write access module.
//
#include "progect.h"
#include "progectRsc.h"
#include "task.h"
#include "doc.h"
ExportHeaddings_t ExportHeaddings[EXPORT_NUMLEVELS] =
{
{
"\n\n\n\n"
"=========================\n"
"", "\n"
"=========================\n",
""
},
{
"\n"
"", "\n"
"---------------------",
""
},
{
" * ", "",
""
},
{
" - ", "",
" "
},
{
" >", "",
" "
},
{ "", "", "" },
{ "", "", "" }, { "", "", "" }, { "", "", "" },
{ "", "", "" }, { "", "", "" }, { "", "", "" }
};
static DmOpenRef docdb;
static DocInfo_t* info;
static char* putp;
static char* docrcd;
static UInt16 docrcdlen;
static UInt8 autonum[EXPORT_NUMLEVELS];
/****************************************************************************
* 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* str,
char* lineprefix, char* 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)
{
static char const szNL[] = "\n";
LocalID docdbID;
MemPtr rcd;
Int16 nCurrLevel = -1;
UInt16 index;
MemHandle h;
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 ;
}
//
// Initialize DOC headder
//
info = (DocInfo_t*)MemPtrNew(sizeof(DocInfo_t));
info->version = DOC_UNCOMPRESSED;
info->crap = 0;
info->uncompsizeoftext = 0;
info->count = 0;
info->uncomplength = 4096;
info->morecrap = 0;
//
// export each records
//
putp = docrcd = MemPtrNew(4096);
docrcdlen = 0;
last++;
for (index = first; index < last; index++)
{
char tmpbuff[20];
TaskExtendedRecordType* pTask;
Char* desc;
h = DmQueryRecord(gdbP, index);
pTask = MemHandleLock(h);
// ignore done task if it's require
if (! gMemoExportPrefs.exportDone &&
( pTask->fields.task.completed == 10 ||
pTask->fields.task.completed == ACTION_OK) )
{
MemHandleUnlock(h);
continue;
}
// calc level.
if (nCurrLevel < pTask->attr.bits.level - FIRST_LEVEL &&
pTask->attr.bits.level - FIRST_LEVEL < EXPORT_NUMLEVELS)
autonum[pTask->attr.bits.level - FIRST_LEVEL] = 0;
nCurrLevel = pTask->attr.bits.level - FIRST_LEVEL;
// calc autonumber
if (nCurrLevel < EXPORT_NUMLEVELS)
autonum[nCurrLevel]++;
// TODO: put auto number
putString(ExportHeaddings[nCurrLevel].szDescPrefix, NULL, NULL);
desc = TaskGetDescriptionByTaskPtr(pTask);
putString(desc, NULL, NULL);
MemPtrFree(desc);
// put progress
if (gMemoExportPrefs.exportProgress)
{
if (pTask->fields.task.completed > ACTION)
putString(
((pTask->fields.task.completed == ACTION_OK)? "[x]": "[ ]"),
NULL, NULL);
else
{
StrIToA(tmpbuff, pTask->fields.task.completed);
putString(tmpbuff, "[", "0%]");
}
}
// put dueDate
if (gMemoExportPrefs.exportDueDate && pTask->fields.task.dueDate.month)
{
DateToAscii(pTask->fields.task.dueDate.month,
pTask->fields.task.dueDate.day,
pTask->fields.task.dueDate.year + YEAR_OFFSET,
gDateFormat, tmpbuff);
putString(tmpbuff, "(", ")");
}
// put priority
if (gMemoExportPrefs.exportPriority &&
pTask->fields.task.priority > 0 && pTask->fields.task.priority < 7)
{
StrIToA(tmpbuff, pTask->fields.task.priority);
putString(tmpbuff, " <", ">");
}
putString(ExportHeaddings[nCurrLevel].szDescSuffix, NULL, NULL);
putString((char*)szNL, NULL, NULL);
// put note
if (gMemoExportPrefs.exportNote &&
*(&pTask->fields.task.description + StrLen(&pTask->fields.task.description) + 1) != '\0')
{
putString(&pTask->fields.task.description + StrLen(&pTask->fields.task.description) + 1,
( (nCurrLevel < EXPORT_NUMLEVELS)?
ExportHeaddings[nCurrLevel].szLinePrefix : NULL),
NULL);
putString((char*)szNL, NULL, NULL);
}
MemHandleUnlock(h);
}
flushDocBuffer();
MemPtrFree(docrcd);
//
// Make DOC headder record
//
{
index = 0;
h = DmNewRecord(docdb, &index, sizeof(DocInfo_t));
rcd = MemHandleLock(h);
DmWrite(rcd, 0, info, sizeof(DocInfo_t));
MemHandleUnlock(h);
DmReleaseRecord(docdb, index, true);
}
MemPtrFree(info);
} // void ExportToDoc(UInt16 cardNo, char const* name, UInt16 first, UInt16 last)