scummvm/backends/PalmOS/Src/missing/_stdio.cpp
2003-04-30 11:37:10 +00:00

344 lines
9 KiB
C++
Raw Blame History

#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<6C>
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);;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////