Main Page | File List | Globals | Related Pages

memo.c

Go to the documentation of this file.
00001 
00008 /*      $Id: memo.c,v 1.6 2003/05/18 14:50:12 clavelei Exp clavelei $    */
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 }                                                          /* memo_open */
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 }                                                          /* memo_internal_close */
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 }                                                          /* memo_delete */
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;                              /* we count the null */
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);  /* quid header $$ */
00141           }
00142           if (!error)
00143             {
00144                 RecP = MemHandleLock (MemoRech);
00145                 DmWrite (RecP, WriteIndex, p, l);
00146                 WriteIndex += --l;
00147                 MemHandleUnlock (MemoRech);
00148             }
00149       }
00150 }                                                          /* memo_write */
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 }                                                          /* memo_printf */

Generated on Sun Aug 29 11:00:40 2004 for GPilotS by doxygen 1.3.4