00001
00008
00009
00010 #include <PalmOS.h>
00011 #include <PalmCompatibility.h>
00012 #include <stdarg.h>
00013 #include "memo.h"
00014
00015 #define SIZE_INC 1000
00016
00017 #define memoPadAppType 'memo'
00018 #define memoPadDBType 'DATA'
00019 static DmOpenRef MemoPadDB;
00020 static VoidHand MemoRech;
00021 static ULong WriteIndex;
00022 static UInt MemoRecIndex;
00023
00024 static void memo_internal_close (void) MEMO_SECTION;
00025
00026
00034 Err
00035 memo_open (char *Header)
00036 {
00037 if (MemoPadDB)
00038 return (0);
00039 MemoPadDB = DmOpenDatabaseByTypeCreator (memoPadDBType, memoPadAppType, dmModeWrite);
00040 if (MemoPadDB)
00041 {
00042 MemoRecIndex = dmMaxRecordIndex;
00043 MemoRech = DmNewRecord (MemoPadDB, &MemoRecIndex, SIZE_INC);
00044 WriteIndex = 0;
00045 if (Header)
00046 memo_write (Header);
00047 }
00048 if (!MemoRech)
00049 return (1);
00050 else
00051 return (0);
00052 }
00053
00054
00055 static void
00056 memo_internal_close ()
00057 {
00058 if (MemoRech)
00059 {
00060 MemHandleResize (MemoRech, WriteIndex + 1);
00061 DmReleaseRecord (MemoPadDB, MemoRecIndex, true);
00062 }
00063 if (MemoPadDB)
00064 DmCloseDatabase (MemoPadDB);
00065 MemoRech = MemoPadDB = NULL;
00066 }
00067
00068
00077 void
00078 memo_close (char *Trailer)
00079 {
00080 if (Trailer)
00081 memo_write (Trailer);
00082 memo_internal_close ();
00083 }
00084
00085
00092 void
00093 memo_delete ()
00094 {
00095 if (MemoRech)
00096 {
00097 DmReleaseRecord (MemoPadDB, MemoRecIndex, true);
00098 DmRemoveRecord (MemoPadDB, MemoRecIndex);
00099 MemoRech = NULL;
00100 }
00101 }
00102
00103
00110 VoidHand
00111 memo_get_handle ()
00112 {
00113 return (MemoRech);
00114 }
00115
00116
00124 void
00125 memo_write (char *p)
00126 {
00127 unsigned int l;
00128 Err error;
00129 VoidPtr RecP;
00130
00131 if (MemoRech)
00132 {
00133 l = StrLen (p) + 1;
00134 if ((WriteIndex + l) > MemHandleSize (MemoRech))
00135 error = MemHandleResize (MemoRech, MemHandleSize (MemoRech) + SIZE_INC);
00136 else
00137 error = 0;
00138 if (error) {
00139 memo_internal_close ();
00140 error=memo_open(NULL);
00141 }
00142 if (!error)
00143 {
00144 RecP = MemHandleLock (MemoRech);
00145 DmWrite (RecP, WriteIndex, p, l);
00146 WriteIndex += --l;
00147 MemHandleUnlock (MemoRech);
00148 }
00149 }
00150 }
00151
00152
00161 void
00162 memo_printf (CharPtr formatStr, ...)
00163 {
00164 va_list args;
00165 char buf[256];
00166 SWord l = 0;
00167
00168 va_start (args, formatStr);
00169 l = StrVPrintF (buf + l, formatStr, args);
00170 va_end (args);
00171 ErrFatalDisplayIf (l >= sizeof (buf), "memo_printf overflow");
00172 memo_write (buf);
00173 }