diff options
Diffstat (limited to 'backends/PalmOS/Src/missing/_stdio.cpp')
-rw-r--r-- | backends/PalmOS/Src/missing/_stdio.cpp | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/backends/PalmOS/Src/missing/_stdio.cpp b/backends/PalmOS/Src/missing/_stdio.cpp new file mode 100644 index 0000000000..5d22b04bbc --- /dev/null +++ b/backends/PalmOS/Src/missing/_stdio.cpp @@ -0,0 +1,344 @@ +#include "stdio.h" +#include "extend.h" +/////////////////////////////////////////////////////////////////////////////// +//FileRef gLogFile; + +static void DrawStatus(Boolean show) +{ + UInt8 x,y; + UInt8 *screen = (UInt8 *)(BmpGetBits(WinGetBitmap(WinGetDisplayWindow()))); + UInt8 color = (show? gVars->indicator.on : gVars->indicator.off); + + if (gVars->screenLocked) + if (screen == gVars->flipping.pageAddr1) + screen = gVars->flipping.pageAddr2; + else + screen = gVars->flipping.pageAddr1; + + screen += 320 + 305; + for(y=0;y<3;y++) + { + for(x=0;x<14;x++) + screen[x] = color; + screen += 319; + } +} +/////////////////////////////////////////////////////////////////////////////// +UInt16 fclose(FileRef *stream) +{ + Err error = VFSFileClose(*stream); + + if (error == errNone) + MemPtrFree(stream); + +#ifdef DEBUG + FrmCustomAlert(FrmWarnAlert,"error fclose",0,0); +#endif + return error; +} +/////////////////////////////////////////////////////////////////////////////// +UInt16 feof(FileRef *stream) +{ + Err error = VFSFileEOF(*stream); + +#ifdef DEBUG + switch (error) + { + case vfsErrFileEOF: + FrmCustomAlert(FrmWarnAlert,"vfsErrFileEOF",0,0); + break; + case expErrNotOpen: + FrmCustomAlert(FrmWarnAlert,"expErrNotOpen",0,0); + break; + case vfsErrFileBadRef: + FrmCustomAlert(FrmWarnAlert,"vfsErrFileBadRef",0,0); + break; + case vfsErrIsADirectory: + FrmCustomAlert(FrmWarnAlert,"vfsErrIsADirectory",0,0); + break; + case vfsErrNoFileSystem: + FrmCustomAlert(FrmWarnAlert,"vfsErrNoFileSystem",0,0); + break; + } +#endif + + return error; +} +/////////////////////////////////////////////////////////////////////////////// +Char *fgets(Char *s, UInt32 n, FileRef *stream) +{ + UInt32 numBytesRead; + DrawStatus(true); + Err error = VFSFileRead(*stream, n, s, &numBytesRead); + DrawStatus(false); + if (error == errNone || error == vfsErrFileEOF) { + UInt32 reset = 0; + Char *endLine = StrChr(s, '\n'); + + if (endLine >= s) { + reset = (endLine - s); + s[reset] = 0; + reset = numBytesRead - (reset + 1); + VFSFileSeek(*stream, vfsOriginCurrent, -reset); + } + + return s; + } +#ifdef DEBUG + switch (error) + { + case expErrNotOpen: + FrmCustomAlert(FrmWarnAlert,"expErrNotOpen",0,0); + break; + case vfsErrFileBadRef: + FrmCustomAlert(FrmWarnAlert,"vfsErrFileBadRef",0,0); + break; + case vfsErrFileEOF: + FrmCustomAlert(FrmWarnAlert,"vfsErrFileEOF",0,0); + break; + case vfsErrFilePermissionDenied: + FrmCustomAlert(FrmWarnAlert,"vfsErrFilePermissionDenied",0,0); + break; + case vfsErrIsADirectory: + FrmCustomAlert(FrmWarnAlert,"vfsErrIsADirectory",0,0); + break; + case vfsErrNoFileSystem: + FrmCustomAlert(FrmWarnAlert,"vfsErrNoFileSystem",0,0); + break; + } +#endif + + return NULL; +} +/////////////////////////////////////////////////////////////////////////////// +FileRef *fopen(const Char *filename, const Char *type) +{ + Err err; + UInt16 openMode; + FileRef *fileRefP = (FileRef *)MemPtrNew(sizeof(FileRef *)); + + if (StrCompare(type,"r")==0) + openMode = vfsModeRead; + else if (StrCompare(type,"rb")==0) + openMode = vfsModeRead; + else if (StrCompare(type,"w")==0) + openMode = vfsModeCreate|vfsModeWrite; + else if (StrCompare(type,"wb")==0) + openMode = vfsModeCreate|vfsModeWrite; + else + openMode = vfsModeReadWrite; + + if (openMode & vfsModeRead) { + // if read file : + // first try to load from the specfied card + err = VFSFileOpen (gVars->volRefNum, filename, openMode, fileRefP); + //if err (not found ?) parse each avalaible card for the specified file + if (err) { + UInt16 volRefNum; + UInt32 volIterator = vfsIteratorStart; + while (volIterator != vfsIteratorStop) { + err = VFSVolumeEnumerate(&volRefNum, &volIterator); + + if (!err) { + err = VFSFileOpen (volRefNum, filename, openMode, fileRefP); + if (!err) + return fileRefP; + } + } + } else { + return fileRefP; + } + } else { + // if write file : + // use only the specified card + // FIXME : vfsModeCreate|vfsModeWrite will failed on OS3.5 Clié + err = VFSFileDelete(gVars->volRefNum, filename); // delete it if exists + err = VFSFileCreate(gVars->volRefNum, filename); + openMode = vfsModeWrite; + if (!err) { + err = VFSFileOpen (gVars->volRefNum, filename, openMode, fileRefP); + if (!err) + return fileRefP; + } + } + +#ifdef DEBUG + else + { + switch (err) + { + case expErrCardReadOnly: + FrmCustomAlert(FrmWarnAlert,"expErrCardReadOnly",0,0); + break; + case expErrNotOpen: + FrmCustomAlert(FrmWarnAlert,"expErrNotOpen",0,0); + break; + case vfsErrBadName: + FrmCustomAlert(FrmWarnAlert,"vfsErrBadName",0,0); + break; + case vfsErrFileNotFound: + FrmCustomAlert(FrmWarnAlert,"vfsErrFileNotFound",0,0); + break; + case vfsErrFilePermissionDenied: + FrmCustomAlert(FrmWarnAlert,"vfsErrFilePermissionDenied",0,0); + break; + case vfsErrVolumeBadRef: + FrmCustomAlert(FrmWarnAlert,"vfsErrVolumeBadRef",0,0); + break; + default: + FrmCustomAlert(FrmWarnAlert,"unknow",0,0); + break; + } + } +#endif + + MemPtrFree(fileRefP); // prevent memory leak + return NULL; +} +/////////////////////////////////////////////////////////////////////////////// +UInt32 fread(void *ptr, UInt32 size, UInt32 nitems, FileRef *stream) +{ + UInt32 numBytesRead; + DrawStatus(true); + Err error = VFSFileRead(*stream, size*nitems, ptr, &numBytesRead); + DrawStatus(false); + if (error == errNone || error == vfsErrFileEOF) + return (UInt32)(numBytesRead/size); + +#ifdef DEBUG + switch (error) + { + case expErrNotOpen: + FrmCustomAlert(FrmWarn,"expErrNotOpen",0,0); + break; + case vfsErrFileBadRef: + FrmCustomAlert(FrmWarn,"vfsErrFileBadRef",0,0); + break; + case vfsErrFileEOF: + FrmCustomAlert(FrmWarn,"vfsErrFileEOF",0,0); + break; + case vfsErrFilePermissionDenied: + FrmCustomAlert(FrmWarn,"vfsErrFilePermissionDenied",0,0); + break; + case vfsErrIsADirectory: + FrmCustomAlert(FrmWarn,"vfsErrIsADirectory",0,0); + break; + case vfsErrNoFileSystem: + FrmCustomAlert(FrmWarn,"vfsErrNoFileSystem",0,0); + break; + } +#endif + return 0; +} +/////////////////////////////////////////////////////////////////////////////// +UInt32 fwrite(const void *ptr, UInt32 size, UInt32 nitems, FileRef *stream) +{ + UInt32 numBytesWritten; + DrawStatus(true); + Err error = VFSFileWrite(*stream, size*nitems, ptr, &numBytesWritten); + DrawStatus(false); + + if (error == errNone || error == vfsErrFileEOF) + return (UInt32)(numBytesWritten/size); + + return NULL; +} +/////////////////////////////////////////////////////////////////////////////// +Int32 fseek(FileRef *stream, Int32 offset, Int32 whence) +{ + Err error = VFSFileSeek(*stream, whence, offset); + return error; +} +/////////////////////////////////////////////////////////////////////////////// +UInt32 ftell(FileRef *stream) +{ + Err e; + UInt32 filePos; + + e = VFSFileTell(*stream,&filePos); + if (e != errNone) + return e; + + return filePos; +} +/////////////////////////////////////////////////////////////////////////////// +UInt16 fprintf(FileRef *stream, const Char *format, ...) +{ + if (!*stream) + return 0; + + UInt32 numBytesWritten; + Char buf[256]; + va_list va; + + va_start(va, format); + vsprintf(buf, format, va); + va_end(va); + + VFSFileWrite (*stream, StrLen(buf), buf, &numBytesWritten); + return numBytesWritten; +} +/////////////////////////////////////////////////////////////////////////////// +Int16 printf(const Char *format, ...) +{ + if (!*stdout) + return 0; + + UInt32 numBytesWritten; + Char buf[256]; +// Char *buf = (Char *)MemPtrNew(256); + va_list va; + + va_start(va, format); + vsprintf(buf, format, va); + va_end(va); + + VFSFileWrite (*stdout, StrLen(buf), buf, &numBytesWritten); +// MemPtrFree(buf); + return numBytesWritten; +} +/////////////////////////////////////////////////////////////////////////////// +Int16 sprintf(Char* s, const Char* formatStr, ...) +{ + Char buf[256]; +// Char *buf = (Char *)MemPtrNew(256); + Int16 count; + va_list va; + + va_start(va, formatStr); + count = vsprintf(buf, formatStr, va); + va_end(va); + + StrCopy(s,buf); +// MemPtrFree(buf); + return count; +} +/////////////////////////////////////////////////////////////////////////////// +Int16 vsprintf(Char* s, const Char* formatStr, _Palm_va_list argParam) +{ + Char format[256]; + // TODO : need a better modifier + StrCopy(format,formatStr); + StrReplace(format, 256, "%ld", "%d"); + StrReplace(format, 256, "%li", "%i"); + StrReplace(format, 256, "%lx", "%x"); + StrReplace(format, 256, "%lx", "%X"); + StrReplace(format, 256, "%2ld", "%2d"); + StrReplace(format, 256, "%03ld","%.3d"); + StrReplace(format, 256, "%02ld","%.2d"); + StrReplace(format, 256, "%01ld","%.1d"); + StrReplace(format, 256, "%02ld","%02d"); + + StrReplace(format, 256, "%2ld","%2d"); + StrReplace(format, 256, "%3ld","%3d"); + StrReplace(format, 256, "%4ld","%4d"); + StrReplace(format, 256, "%5ld","%5d"); + StrReplace(format, 256, "%6ld","%6d"); + StrReplace(format, 256, "%02lx","%02x"); + + return StrVPrintF(s, format, argParam);; +} +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// |