From 1d09fb169b45671e47586e9d0ed811212dd9ba74 Mon Sep 17 00:00:00 2001 From: Chris Apers Date: Sat, 25 Feb 2006 20:34:13 +0000 Subject: Rename those files so that: - fucntions can also be used in C projects - functions really replace same functions from MSL instead of having multiple definitions for C and C++ svn-id: r20887 --- backends/PalmOS/Src/missing/_stdio.cpp | 645 ------------------------------- backends/PalmOS/Src/missing/_stdlib.cpp | 130 ------- backends/PalmOS/Src/missing/_string.cpp | 121 ------ backends/PalmOS/Src/missing/_time.cpp | 85 ---- backends/PalmOS/Src/missing/_unistd.cpp | 41 -- backends/PalmOS/Src/missing/ext_stdio.c | 645 +++++++++++++++++++++++++++++++ backends/PalmOS/Src/missing/ext_stlib.c | 130 +++++++ backends/PalmOS/Src/missing/ext_string.c | 121 ++++++ backends/PalmOS/Src/missing/ext_time.c | 85 ++++ backends/PalmOS/Src/missing/ext_unistd.c | 41 ++ 10 files changed, 1022 insertions(+), 1022 deletions(-) delete mode 100644 backends/PalmOS/Src/missing/_stdio.cpp delete mode 100644 backends/PalmOS/Src/missing/_stdlib.cpp delete mode 100644 backends/PalmOS/Src/missing/_string.cpp delete mode 100644 backends/PalmOS/Src/missing/_time.cpp delete mode 100644 backends/PalmOS/Src/missing/_unistd.cpp create mode 100644 backends/PalmOS/Src/missing/ext_stdio.c create mode 100644 backends/PalmOS/Src/missing/ext_stlib.c create mode 100644 backends/PalmOS/Src/missing/ext_string.c create mode 100644 backends/PalmOS/Src/missing/ext_time.c create mode 100644 backends/PalmOS/Src/missing/ext_unistd.c (limited to 'backends/PalmOS/Src/missing') diff --git a/backends/PalmOS/Src/missing/_stdio.cpp b/backends/PalmOS/Src/missing/_stdio.cpp deleted file mode 100644 index c973e64552..0000000000 --- a/backends/PalmOS/Src/missing/_stdio.cpp +++ /dev/null @@ -1,645 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include - -#define CACHE_SIZE 1024 -enum { - MODE_BUFREAD = 1, - MODE_BUFWRITE, - MODE_BUFNONE -}; - -FILE gStdioOutput = {0,0,0,0,0,0}; -static void dummy(Boolean) {}; - -static LedProc gStdioLedProc = dummy; -static UInt16 gStdioVolRefNum = vfsInvalidVolRef; -static UInt32 gCacheSize = CACHE_SIZE; - -// TODO : implement "errno" - -void StdioInit(UInt16 volRefNum, const Char *output) { // DONE - gStdioVolRefNum = volRefNum; - gStdioOutput.mode = MODE_BUFWRITE; - - VFSFileDelete(gStdioVolRefNum, output); - VFSFileCreate(gStdioVolRefNum, output); - VFSFileOpen (gStdioVolRefNum, output,vfsModeWrite, &gStdioOutput.fileRef); -} - -void StdioSetLedProc(LedProc ledProc) { // DONE - if (ledProc) - gStdioLedProc = ledProc; - else - gStdioLedProc = dummy; -} - -void StdioSetCacheSize(UInt32 s) { // DONE - gCacheSize = s; -} - -void StdioRelease() { // DONE - // there is no cache on stdout/stderr - VFSFileClose(gStdioOutput.fileRef); -} - -UInt16 fclose(FILE *stream) { // DONE - UInt32 numBytesWritten; - Err e; - - if (stream->cacheSize) { - if (stream->bufSize > 0 && stream->mode == MODE_BUFWRITE) - VFSFileWrite(stream->fileRef, stream->bufSize, stream->cache, &numBytesWritten); - - MemPtrFree(stream->cache); - } - - e = VFSFileClose(stream->fileRef); - e = MemPtrFree(stream); - - return e; -} - -UInt16 feof(FILE *stream) { // DONE - Err e; - - if (stream->cacheSize) { - switch (stream->mode) { - case MODE_BUFWRITE: - return 0; // never set in this mode - case MODE_BUFREAD: - if (stream->bufSize > 0) - return 0; - break; - } - } - - e = VFSFileEOF(stream->fileRef); - return e; -} - -UInt16 ferror(FILE *stream) { - return (stream->err); -} - -Int16 fgetc(FILE *stream) { - UInt32 numBytesRead; - Char c; - - numBytesRead = fread(&c, 1, 1, stream); - return (int)(numBytesRead == 1 ? c : EOF); -} - -Char *fgets(Char *s, UInt32 n, FILE *stream) { - UInt32 numBytesRead; - - numBytesRead = fread(s, n, 1, stream); - if (numBytesRead) { - UInt32 reset = 0; - Char *endLine = StrChr(s, '\n'); - - if (endLine >= s) { - reset = (endLine - s); - s[reset] = 0; - reset = numBytesRead - (reset + 1); - fseek(stream, -reset, SEEK_CUR); - } - - return s; - } - - return NULL; -} - -FILE *fopen(const Char *filename, const Char *type) { // DONE - Err err; - UInt16 openMode; - Boolean cache = true; - FILE *fileP = (FILE *)MemPtrNew(sizeof(FILE)); - - if (!fileP) - return NULL; - - MemSet(fileP, sizeof(FILE), 0); - - if (StrCompare(type,"r")==0 || StrCompare(type,"rb")==0) { - fileP->mode = MODE_BUFREAD; - openMode = vfsModeRead; - - } else if (StrCompare(type,"w")==0 || StrCompare(type,"wb")==0) { - fileP->mode = MODE_BUFWRITE; - openMode = vfsModeCreate|vfsModeWrite; - - } else { - cache = false; - fileP->mode = MODE_BUFNONE; - openMode = vfsModeReadWrite; - } - - if (cache) { - fileP->cacheSize = gCacheSize; - if (gCacheSize) fileP->cache = (UInt8 *)malloc(gCacheSize); // was MemGluePtrNew - if (!fileP->cache) fileP->cacheSize = 0; - } - - if (openMode & vfsModeRead) { - // if read file : - // first try to load from the specfied card - err = VFSFileOpen (gStdioVolRefNum, filename, openMode, &fileP->fileRef); - //if err (not found ?) parse each avalaible card for the specified file - if (err) { - UInt16 volRefNum; - UInt32 volIterator = vfsIteratorStart|vfsIncludePrivateVolumes; - while (volIterator != vfsIteratorStop) { - err = VFSVolumeEnumerate(&volRefNum, &volIterator); - - if (!err) { - err = VFSFileOpen (volRefNum, filename, openMode, &fileP->fileRef); - if (!err) - return fileP; - } - } - } else { - return fileP; - } - } else { - // if write file : - // use only the specified card - err = VFSFileDelete(gStdioVolRefNum, filename); // delete it if exists - err = VFSFileCreate(gStdioVolRefNum, filename); - openMode = vfsModeWrite; - if (!err) { - err = VFSFileOpen (gStdioVolRefNum, filename, openMode, &fileP->fileRef); - if (!err) - return fileP; - } - } - - if (fileP->cacheSize) - MemPtrFree(fileP->cache); - - MemPtrFree(fileP); // prevent memory leak - return NULL; -} - -UInt32 fread(void *ptr, UInt32 size, UInt32 nitems, FILE *stream) { // DONE - Err e = errNone; - UInt32 numBytesRead, rsize = (size * nitems); - - // try to read on a write only stream ? - if (stream->mode == MODE_BUFWRITE || !rsize) - return 0; - - // cached ? - if (stream->cacheSize) { - // empty buffer ? fill it if required - if (stream->bufSize == 0 && rsize < stream->cacheSize) { - gStdioLedProc(true); - e = VFSFileRead(stream->fileRef, stream->cacheSize, stream->cache, &numBytesRead); - gStdioLedProc(false); - stream->bufSize = numBytesRead; - stream->bufPos = 0; - } - - // we have the data in the cache - if (stream->bufSize >= rsize) { - MemMove(ptr, (stream->cache + stream->bufPos), rsize); - stream->bufPos += rsize; - stream->bufSize -= rsize; - numBytesRead = rsize; - - // not enough but something ? - } else if (stream->bufSize > 0) { - UInt8 *next = (UInt8 *)ptr; - MemMove(ptr, (stream->cache + stream->bufPos), stream->bufSize); - rsize -= stream->bufSize; - gStdioLedProc(true); - e = VFSFileRead(stream->fileRef, rsize, (next + stream->bufSize), &numBytesRead); - gStdioLedProc(false); - numBytesRead += stream->bufSize; - stream->bufSize = 0; - stream->bufPos = 0; - - // nothing in the cache ? - } else { - gStdioLedProc(true); - e = VFSFileRead(stream->fileRef, rsize, ptr, &numBytesRead); - gStdioLedProc(false); - } - - // no ? direct read - } else { - gStdioLedProc(true); - e = VFSFileRead(stream->fileRef, rsize, ptr, &numBytesRead); - gStdioLedProc(false); - } - - if (e == errNone || e == vfsErrFileEOF) - return (UInt32)(numBytesRead / size); - - return 0; -} - -UInt32 fwrite(const void *ptr, UInt32 size, UInt32 nitems, FILE *stream) { // DONE - Err e = errNone; - UInt32 numBytesWritten = (size * nitems); - - // try to write on a read only stream ? - if (stream->mode == MODE_BUFREAD || !numBytesWritten) - return 0; - - // cached ? - if (stream->cacheSize) { - // can cache it ? - if ((stream->bufSize + numBytesWritten) <= stream->cacheSize) { - MemMove((stream->cache + stream->bufSize), ptr, numBytesWritten); - stream->bufSize += numBytesWritten; - - // not enough room ? write cached data and new data - } else { - gStdioLedProc(true); - e = VFSFileWrite(stream->fileRef, stream->bufSize, stream->cache, &numBytesWritten); - e = VFSFileWrite(stream->fileRef, (size * nitems), ptr, &numBytesWritten); - gStdioLedProc(false); - stream->bufSize = 0; - } - - // no ? direct write - } else { - gStdioLedProc(true); - e = VFSFileWrite(stream->fileRef, (size * nitems), ptr, &numBytesWritten); - gStdioLedProc(false); - } - - if ((e == errNone || e == vfsErrFileEOF)) { - return (UInt32)(numBytesWritten / size); - } - - return 0; -} - -Int16 fseek(FILE *stream, Int32 offset, Int32 whence) { // DONE - UInt32 numBytesWritten; - Err e; - - if (stream->cacheSize) { - switch (stream->mode) { - case MODE_BUFWRITE: - e = VFSFileWrite(stream->fileRef, stream->bufSize, stream->cache, &numBytesWritten); - stream->bufSize = 0; - break; - - case MODE_BUFREAD: - // reposition file postion if needed - if (whence == SEEK_CUR) - e = VFSFileSeek(stream->fileRef, vfsOriginCurrent, -stream->bufSize); - stream->bufSize = 0; - stream->bufPos = 0; - break; - } - } - - e = VFSFileSeek(stream->fileRef, whence, offset); - return (e ? -1 : 0); -} - -Int32 ftell(FILE *stream) { // DONE - Err e; - UInt32 filePos; - - e = VFSFileTell(stream->fileRef ,&filePos); - - if (stream->cacheSize) { - switch (stream->mode) { - case MODE_BUFWRITE: - filePos += stream->bufSize; - break; - - case MODE_BUFREAD: - filePos -= stream->bufSize; - break; - } - } - - if (e) return -1; // errno = ? - return filePos; -} - -Int32 fprintf(FILE *stream, const Char *formatStr, ...) { // DONE - UInt32 numBytesWritten; - Char buf[256]; - va_list va; - - if (!stream->fileRef) - return 0; - - va_start(va, formatStr); - vsprintf(buf, formatStr, va); - va_end(va); - - numBytesWritten = fwrite(buf, StrLen(buf), 1, stream); - return numBytesWritten; -} - -Int32 printf(const Char *format, ...) { // DONE - UInt32 numBytesWritten; - Char buf[256]; - va_list va; - - if (!stdout->fileRef) - return 0; - - va_start(va, format); - vsprintf(buf, format, va); - va_end(va); - - numBytesWritten = fwrite(buf, StrLen(buf), 1, stdout); - return numBytesWritten; -} - -Int32 sprintf(Char* s, const Char* formatStr, ...) { - Int16 count; - va_list va; - - va_start(va, formatStr); - count = vsprintf(s, formatStr, va); - va_end(va); - - return count; -} - -Int32 snprintf(Char* s, UInt32 len, const Char* formatStr, ...) { - // len is ignored - Int16 count; - va_list va; - - va_start(va, formatStr); - count = vsprintf(s, formatStr, va); - va_end(va); - - return count; -} - - -/* WARNING : vsprintf - * ------- - * This function can handle only %[+- ][.0][field length][sxXdoiucp] format strings - * compiler option : 4byte int mode only ! - * - * TODO : check http://www.ijs.si/software/snprintf/ for a portable implementation of vsnprintf - * This one make use of sprintf so need to check if it works with PalmOS. - */ - -static Char *StrIToBase(Char *s, Int32 i, UInt8 b) { - const Char *conv = "0123456789ABCDEF"; - Char o; - Int16 c, n = 0; - Int32 div, mod; - - do { - div = i / b; - mod = i % b; - - s[n++] = *(conv + mod); - i = div; - - } while (i >= b); - - if (i > 0) { - s[n + 0] = *(conv + i); - s[n + 1] = 0; - } else { - s[n + 0] = 0; - n--; - } - - for (c=0; c <= (n >> 1); c++) { - o = s[c]; - s[c] = s[n - c]; - s[n - c]= o; - } - - return s; -} - -static void StrProcC_(Char *ioStr, UInt16 maxLen) { - Char *found; - Int16 length; - - while (found = StrStr(ioStr, "`c`")) { - if (found[3] == 0) { // if next char is NULL - length = maxLen - (found - ioStr + 2); - MemMove(found, found + 4, length); - maxLen -= 2; - } - } -} - -static void StrProcXO(Char *ioStr, UInt16 maxLen, Char *tmp) { - Char *found, *last, mod, fill; - Int16 len, count, next; - Int32 val; - - while (found = StrChr(ioStr, '`')) { - last = StrChr(found + 1, '`'); - - if (!last) - return; - - *last = 0; - next = 0; - fill = *(found + 1); - mod = *(found + 2); - count = StrAToI(found + 3); - - len = maxLen - (last - ioStr); - MemMove(found, (last + 1), len); - - // x and X always 8char on palmos ... o set to 8char (not supported on palmos) - while ((found[next] == '0' || found[next] == ' ') && next < 8) // WARNING : reduce size only (TODO ?) - next++; - - // convert to base 8 - if (mod == 'o') { - StrNCopy(tmp, found + next, 8 - next); - tmp[8 - next] = 0; - val = StrAToI(tmp); - StrIToBase(tmp, val, 8); // now we have the same but in octal - next = 8 - StrLen(tmp); - MemMove(found + next, tmp, StrLen(tmp)); - } else { - // if val is 0, keep last 0 - if (next == 8) - next = 7; - } - - if ((8 - next) > count) - count = 8 - next; - - if (count == 0) - count = 1; - - len = maxLen - (found - ioStr) - (8 - count); - MemSet(found, next, fill); - MemMove(found, found + (8 - count), len); - - // ... and upper case - if (mod == 'x') { - while (count--) { - if (*found >='A' && *found <='F') - *found = (*found + 32); - found++; - } - } - } -} - -Int32 vsprintf(Char* s, const Char* formatStr, _Palm_va_list argParam) { - Char format[256], result[256], tmp[32]; - - Char *found, *mod, *num; - UInt32 next; - Boolean zero; - Int16 count, len; - - MemSet(format, sizeof(format), 'x'); - MemSet(result, sizeof(result), 'y'); - MemSet(tmp, sizeof(tmp), 'z'); - - StrCopy(format,formatStr); // copy actual formatStr to temp buffer - next = 0; // start of the string - - while (found = StrChr(format + next, '%')) { - mod = found + 1; - - if (*mod == '%') { // just a % ? - mod++; - - } else { - if (*mod == '+' || - *mod == '-' || - *mod == ' ' ) // skip - mod++; - - if (*mod == '0' || - *mod == '.' ) { - *mod++ = '0'; - zero = true; - } else { - zero = false; - } - - num = mod; - while ( *mod >= '0' && - *mod <= '9' ) // search format char - mod++; - - // get the numeric value - if (num < mod) { - StrNCopy(tmp, num, mod - num); - tmp[mod - num] = 0; - count = StrAToI(tmp); - } else { - count = 0; - } - - if (*mod == 'l') // already set to %...l(x) ? - mod++; - - // prepare new format -#if !defined(PALMOS_ARM) - if (*mod == 'c') { - StrCopy(tmp, "`c`%c%c"); - - } else -#endif - if (*mod == 'p') { - StrCopy(tmp, "%08lX"); // %x = %08X in palmos - - } else { - len = 0; - - switch (*mod) { - case 'x': - case 'X': - case 'o': - tmp[0] = '`'; - tmp[1] = (zero) ? '0' : ' '; - tmp[2] = *mod; - StrIToA(tmp + 3, count); - len += StrLen(tmp); - tmp[len++] = '`'; - tmp[len] = 0; - - if (*mod == 'o') { // set as base 10 num and convert later - *mod = 'd'; - count = 8; // force 8char - } - - break; - } - - StrNCopy(tmp + len, found, (num - found)); - len += (num - found); - - if (count) { - StrIToA(tmp + len, count); - len += StrLen(tmp + len); - } - - if (*mod == 'd' || - *mod == 'i' || - *mod == 'x' || - *mod == 'X' || - *mod == 'u' - ) { - tmp[len++] = 'l'; - } - - tmp[len + 0] = *mod; - tmp[len + 1] = 0; - } - - mod++; - MemMove(found + StrLen(tmp), mod, StrLen(mod) + 1); - StrNCopy(found, tmp, StrLen(tmp)); - mod = found + StrLen(tmp); - } - - next = (mod - format); - } - - // Copy result in a temp buffer to process last formats - StrVPrintF(result, format, argParam); -#if !defined(PALMOS_ARM) - StrProcC_(result, 256); -#endif - StrProcXO(result, 256, tmp); - StrCopy(s, result); - - return StrLen(s); -} diff --git a/backends/PalmOS/Src/missing/_stdlib.cpp b/backends/PalmOS/Src/missing/_stdlib.cpp deleted file mode 100644 index 11a242145a..0000000000 --- a/backends/PalmOS/Src/missing/_stdlib.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -#define memNewChunkFlagAllowLarge 0x1000 -SysAppInfoPtr SysGetAppInfo(SysAppInfoPtr *uiAppPP, SysAppInfoPtr *actionCodeAppPP) SYS_TRAP(sysTrapSysGetAppInfo); - -void *bsearch(const void *key, const void *base, UInt32 nmemb, UInt32 size, int (*compar)(const void *, const void *)) { -#ifdef PALMOS_68K - Int32 position; - if (SysBinarySearch(base, nmemb, size, (SearchFuncPtr)compar, key, 0, &position, true)) - return (void *)((UInt32)base + size * position); -#else - int i; - for (i = 0; i < nmemb; i++) - if (compar(key, (void*)((UInt32)base + size * i)) == 0) - return (void*)((UInt32)base + size * i); -#endif - - return NULL; -} - -long strtol(const char *s, char **endptr, int base) { - // WARNING : only base = 10 supported - long val = StrAToI(s); - - if (endptr) { - Char str[maxStrIToALen]; - StrIToA(str, val); - - if (StrNCompare(s, str, StrLen(str)) == 0) - *endptr = (char *)s + StrLen(str); - } - - return val; -} - -MemPtr __malloc(UInt32 size) { - MemPtr newP = NULL; - - if (size <= 65000) { - newP = MemPtrNew(size); - } else { - SysAppInfoPtr appInfoP; - UInt16 ownerID; - UInt16 attr; - - ownerID = ((SysAppInfoPtr)SysGetAppInfo(&appInfoP, &appInfoP))->memOwnerID; - attr = ownerID|memNewChunkFlagAllowLarge|memNewChunkFlagNonMovable; - - newP = MemChunkNew(0, size, attr); - } - - return newP; -} - -MemPtr calloc(UInt32 nelem, UInt32 elsize) { - MemPtr newP; - UInt32 size = (nelem * elsize); - - newP = malloc(size); // was MemGluePtrNew - - if (newP) - MemSet(newP,size,0); - - return newP; -} - -Err free(MemPtr memP) { - if (memP) - return MemPtrFree(memP); - return memErrInvalidParam; -} - -MemPtr realloc(MemPtr oldP, UInt32 size) { - MemPtr newP; - - if (oldP != NULL) - if (MemPtrResize(oldP, size) == 0) - return oldP; - - newP = malloc(size); // was MemPtrNew - - if (oldP!=NULL) { - MemMove(newP,oldP,MemPtrSize(oldP)); - MemPtrFree(oldP); - } - - return newP; -} - -ErrJumpBuf stdlib_errJumpBuf; -#define ERR_MAGIC 0xDADA - -void exit(Int16 status) { -#if (defined(PALMOS_ARM) && defined(COMPILE_ZODIAC)) - SysEventType event; - event.eType = sysEventKeyDownEvent; -#else - EventType event; - event.eType = keyDownEvent; -#endif - event.data.keyDown.chr = vchrLaunch; - event.data.keyDown.modifiers = commandKeyMask; - EvtAddUniqueEventToQueue(&event, 0, true); - - ErrLongJump(stdlib_errJumpBuf, status == 0 ? 0xDADA : status); -} diff --git a/backends/PalmOS/Src/missing/_string.cpp b/backends/PalmOS/Src/missing/_string.cpp deleted file mode 100644 index a02c360ceb..0000000000 --- a/backends/PalmOS/Src/missing/_string.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -void *memchr(const void *s, int c, UInt32 n) { - UInt32 chr; - for(chr = 0; chr < n;chr++,((UInt8 *)s)++) - if ( *((UInt8 *)s) == c) - return (void *)s; - - return NULL; -} - -UInt32 strspn(const char *s1, const char *s2) { - UInt32 chr = 0; - - while ( chr < strlen(s1) && - strchr(s2, s1[chr]) ) - chr++; - - return chr; -} - -static Char *StrTokNext = NULL; - -Char *strtok(Char *str, const Char *sep) { - Char *position = NULL, - *found, - *end; - - UInt16 loop = 0, - chars= StrLen(sep); - - str = (str)?(str):(StrTokNext); - StrTokNext = NULL; - - if (!str) - return NULL; - - end = str+StrLen(str); - - while (loop found) - position = found; - } - - if (position == NULL) - if (str==end) - return NULL; - else - return str; - - position[0] = 0; - StrTokNext = position+1; - - return str; -} - -Char *strpbrk(const Char *s1, const Char *s2) { - Char *found; - UInt32 n; - - for (n=0; n <= StrLen(s2); n++) { - found = StrChr(s1, s2[n]); - if (found) - return found; - } - - return NULL; -} - -Char *strrchr(const Char *s, int c) { - UInt32 chr; - UInt32 n = StrLen(s); - - for(chr = n; chr >= 0; chr--) - if ( *((UInt8 *)s+chr) == c) - return (Char *)(s+chr); - - return NULL; -} - -Char *strdup(const Char *s1) { - Char* buf = (Char *)MemPtrNew(StrLen(s1)+1); - - if(buf) - StrCopy(buf, s1); - - return buf; -} \ No newline at end of file diff --git a/backends/PalmOS/Src/missing/_time.cpp b/backends/PalmOS/Src/missing/_time.cpp deleted file mode 100644 index 5de64062b0..0000000000 --- a/backends/PalmOS/Src/missing/_time.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -time_t time(time_t *tloc) { - // get ROM version - UInt32 romVersion; - Err e = FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); - - // since 1/1/1904 12AM. - UInt32 secs = TimGetSeconds(); - - // form 1/1/1904 12AM to 1/1/1970 12AM - DateTimeType Epoch = {0, 0, 0, 1, 1, 1970, 0}; - - secs -= TimDateTimeToSeconds(&Epoch); - - // DST really supported from OS v4.0 - if (romVersion >= sysMakeROMVersion(4,0,0,sysROMStageRelease,0)) - secs -= (PrefGetPreference(prefTimeZone) + PrefGetPreference(prefDaylightSavingAdjustment)) * 60; - else - secs -= (PrefGetPreference(prefMinutesWestOfGMT) - 720) * 60; - - if (tloc) - *tloc = secs; - - return (secs); -} - - -struct tm *localtime(const time_t *timer) { - static struct tm tmDate; - DateTimeType dt; - UInt32 secs = *timer; - - // get ROM version - UInt32 romVersion; - Err e = FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); - - // form 1/1/1904 12AM to 1/1/1970 12AM - DateTimeType Epoch = {0, 0, 0, 1, 1, 1970, 0}; - - // timer supposed to be based on Epoch - secs += TimDateTimeToSeconds(&Epoch); - - // DST really supported from OS v4.0 - if (romVersion >= sysMakeROMVersion(4,0,0,sysROMStageRelease,0)) - secs += (PrefGetPreference(prefTimeZone) + PrefGetPreference(prefDaylightSavingAdjustment)) * 60; - else - secs += (PrefGetPreference(prefMinutesWestOfGMT) - 720) * 60; // no sure about this one - - TimSecondsToDateTime (secs, &dt); - - tmDate.tm_sec = dt.second; - tmDate.tm_min = dt.minute; - tmDate.tm_hour = dt.hour; - tmDate.tm_mday = dt.day; - tmDate.tm_mon = dt.month - 1; - tmDate.tm_year = dt.year - 1900; - tmDate.tm_wday = dt.weekDay; - - return &tmDate; -} diff --git a/backends/PalmOS/Src/missing/_unistd.cpp b/backends/PalmOS/Src/missing/_unistd.cpp deleted file mode 100644 index 91f2e8e3e5..0000000000 --- a/backends/PalmOS/Src/missing/_unistd.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -const Char *gUnistdCWD = NULL; - -// currently used only to retreive savepath -Char *getcwd(Char *buf, UInt32 size) { - Char *copy = buf; - - if (gUnistdCWD) { - if (!copy) - copy = (Char *)MemPtrNew(StrLen(gUnistdCWD)); // this may never occured - - StrCopy(copy, gUnistdCWD); - } - - return copy; -} \ No newline at end of file diff --git a/backends/PalmOS/Src/missing/ext_stdio.c b/backends/PalmOS/Src/missing/ext_stdio.c new file mode 100644 index 0000000000..c973e64552 --- /dev/null +++ b/backends/PalmOS/Src/missing/ext_stdio.c @@ -0,0 +1,645 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include +#include +#include + +#define CACHE_SIZE 1024 +enum { + MODE_BUFREAD = 1, + MODE_BUFWRITE, + MODE_BUFNONE +}; + +FILE gStdioOutput = {0,0,0,0,0,0}; +static void dummy(Boolean) {}; + +static LedProc gStdioLedProc = dummy; +static UInt16 gStdioVolRefNum = vfsInvalidVolRef; +static UInt32 gCacheSize = CACHE_SIZE; + +// TODO : implement "errno" + +void StdioInit(UInt16 volRefNum, const Char *output) { // DONE + gStdioVolRefNum = volRefNum; + gStdioOutput.mode = MODE_BUFWRITE; + + VFSFileDelete(gStdioVolRefNum, output); + VFSFileCreate(gStdioVolRefNum, output); + VFSFileOpen (gStdioVolRefNum, output,vfsModeWrite, &gStdioOutput.fileRef); +} + +void StdioSetLedProc(LedProc ledProc) { // DONE + if (ledProc) + gStdioLedProc = ledProc; + else + gStdioLedProc = dummy; +} + +void StdioSetCacheSize(UInt32 s) { // DONE + gCacheSize = s; +} + +void StdioRelease() { // DONE + // there is no cache on stdout/stderr + VFSFileClose(gStdioOutput.fileRef); +} + +UInt16 fclose(FILE *stream) { // DONE + UInt32 numBytesWritten; + Err e; + + if (stream->cacheSize) { + if (stream->bufSize > 0 && stream->mode == MODE_BUFWRITE) + VFSFileWrite(stream->fileRef, stream->bufSize, stream->cache, &numBytesWritten); + + MemPtrFree(stream->cache); + } + + e = VFSFileClose(stream->fileRef); + e = MemPtrFree(stream); + + return e; +} + +UInt16 feof(FILE *stream) { // DONE + Err e; + + if (stream->cacheSize) { + switch (stream->mode) { + case MODE_BUFWRITE: + return 0; // never set in this mode + case MODE_BUFREAD: + if (stream->bufSize > 0) + return 0; + break; + } + } + + e = VFSFileEOF(stream->fileRef); + return e; +} + +UInt16 ferror(FILE *stream) { + return (stream->err); +} + +Int16 fgetc(FILE *stream) { + UInt32 numBytesRead; + Char c; + + numBytesRead = fread(&c, 1, 1, stream); + return (int)(numBytesRead == 1 ? c : EOF); +} + +Char *fgets(Char *s, UInt32 n, FILE *stream) { + UInt32 numBytesRead; + + numBytesRead = fread(s, n, 1, stream); + if (numBytesRead) { + UInt32 reset = 0; + Char *endLine = StrChr(s, '\n'); + + if (endLine >= s) { + reset = (endLine - s); + s[reset] = 0; + reset = numBytesRead - (reset + 1); + fseek(stream, -reset, SEEK_CUR); + } + + return s; + } + + return NULL; +} + +FILE *fopen(const Char *filename, const Char *type) { // DONE + Err err; + UInt16 openMode; + Boolean cache = true; + FILE *fileP = (FILE *)MemPtrNew(sizeof(FILE)); + + if (!fileP) + return NULL; + + MemSet(fileP, sizeof(FILE), 0); + + if (StrCompare(type,"r")==0 || StrCompare(type,"rb")==0) { + fileP->mode = MODE_BUFREAD; + openMode = vfsModeRead; + + } else if (StrCompare(type,"w")==0 || StrCompare(type,"wb")==0) { + fileP->mode = MODE_BUFWRITE; + openMode = vfsModeCreate|vfsModeWrite; + + } else { + cache = false; + fileP->mode = MODE_BUFNONE; + openMode = vfsModeReadWrite; + } + + if (cache) { + fileP->cacheSize = gCacheSize; + if (gCacheSize) fileP->cache = (UInt8 *)malloc(gCacheSize); // was MemGluePtrNew + if (!fileP->cache) fileP->cacheSize = 0; + } + + if (openMode & vfsModeRead) { + // if read file : + // first try to load from the specfied card + err = VFSFileOpen (gStdioVolRefNum, filename, openMode, &fileP->fileRef); + //if err (not found ?) parse each avalaible card for the specified file + if (err) { + UInt16 volRefNum; + UInt32 volIterator = vfsIteratorStart|vfsIncludePrivateVolumes; + while (volIterator != vfsIteratorStop) { + err = VFSVolumeEnumerate(&volRefNum, &volIterator); + + if (!err) { + err = VFSFileOpen (volRefNum, filename, openMode, &fileP->fileRef); + if (!err) + return fileP; + } + } + } else { + return fileP; + } + } else { + // if write file : + // use only the specified card + err = VFSFileDelete(gStdioVolRefNum, filename); // delete it if exists + err = VFSFileCreate(gStdioVolRefNum, filename); + openMode = vfsModeWrite; + if (!err) { + err = VFSFileOpen (gStdioVolRefNum, filename, openMode, &fileP->fileRef); + if (!err) + return fileP; + } + } + + if (fileP->cacheSize) + MemPtrFree(fileP->cache); + + MemPtrFree(fileP); // prevent memory leak + return NULL; +} + +UInt32 fread(void *ptr, UInt32 size, UInt32 nitems, FILE *stream) { // DONE + Err e = errNone; + UInt32 numBytesRead, rsize = (size * nitems); + + // try to read on a write only stream ? + if (stream->mode == MODE_BUFWRITE || !rsize) + return 0; + + // cached ? + if (stream->cacheSize) { + // empty buffer ? fill it if required + if (stream->bufSize == 0 && rsize < stream->cacheSize) { + gStdioLedProc(true); + e = VFSFileRead(stream->fileRef, stream->cacheSize, stream->cache, &numBytesRead); + gStdioLedProc(false); + stream->bufSize = numBytesRead; + stream->bufPos = 0; + } + + // we have the data in the cache + if (stream->bufSize >= rsize) { + MemMove(ptr, (stream->cache + stream->bufPos), rsize); + stream->bufPos += rsize; + stream->bufSize -= rsize; + numBytesRead = rsize; + + // not enough but something ? + } else if (stream->bufSize > 0) { + UInt8 *next = (UInt8 *)ptr; + MemMove(ptr, (stream->cache + stream->bufPos), stream->bufSize); + rsize -= stream->bufSize; + gStdioLedProc(true); + e = VFSFileRead(stream->fileRef, rsize, (next + stream->bufSize), &numBytesRead); + gStdioLedProc(false); + numBytesRead += stream->bufSize; + stream->bufSize = 0; + stream->bufPos = 0; + + // nothing in the cache ? + } else { + gStdioLedProc(true); + e = VFSFileRead(stream->fileRef, rsize, ptr, &numBytesRead); + gStdioLedProc(false); + } + + // no ? direct read + } else { + gStdioLedProc(true); + e = VFSFileRead(stream->fileRef, rsize, ptr, &numBytesRead); + gStdioLedProc(false); + } + + if (e == errNone || e == vfsErrFileEOF) + return (UInt32)(numBytesRead / size); + + return 0; +} + +UInt32 fwrite(const void *ptr, UInt32 size, UInt32 nitems, FILE *stream) { // DONE + Err e = errNone; + UInt32 numBytesWritten = (size * nitems); + + // try to write on a read only stream ? + if (stream->mode == MODE_BUFREAD || !numBytesWritten) + return 0; + + // cached ? + if (stream->cacheSize) { + // can cache it ? + if ((stream->bufSize + numBytesWritten) <= stream->cacheSize) { + MemMove((stream->cache + stream->bufSize), ptr, numBytesWritten); + stream->bufSize += numBytesWritten; + + // not enough room ? write cached data and new data + } else { + gStdioLedProc(true); + e = VFSFileWrite(stream->fileRef, stream->bufSize, stream->cache, &numBytesWritten); + e = VFSFileWrite(stream->fileRef, (size * nitems), ptr, &numBytesWritten); + gStdioLedProc(false); + stream->bufSize = 0; + } + + // no ? direct write + } else { + gStdioLedProc(true); + e = VFSFileWrite(stream->fileRef, (size * nitems), ptr, &numBytesWritten); + gStdioLedProc(false); + } + + if ((e == errNone || e == vfsErrFileEOF)) { + return (UInt32)(numBytesWritten / size); + } + + return 0; +} + +Int16 fseek(FILE *stream, Int32 offset, Int32 whence) { // DONE + UInt32 numBytesWritten; + Err e; + + if (stream->cacheSize) { + switch (stream->mode) { + case MODE_BUFWRITE: + e = VFSFileWrite(stream->fileRef, stream->bufSize, stream->cache, &numBytesWritten); + stream->bufSize = 0; + break; + + case MODE_BUFREAD: + // reposition file postion if needed + if (whence == SEEK_CUR) + e = VFSFileSeek(stream->fileRef, vfsOriginCurrent, -stream->bufSize); + stream->bufSize = 0; + stream->bufPos = 0; + break; + } + } + + e = VFSFileSeek(stream->fileRef, whence, offset); + return (e ? -1 : 0); +} + +Int32 ftell(FILE *stream) { // DONE + Err e; + UInt32 filePos; + + e = VFSFileTell(stream->fileRef ,&filePos); + + if (stream->cacheSize) { + switch (stream->mode) { + case MODE_BUFWRITE: + filePos += stream->bufSize; + break; + + case MODE_BUFREAD: + filePos -= stream->bufSize; + break; + } + } + + if (e) return -1; // errno = ? + return filePos; +} + +Int32 fprintf(FILE *stream, const Char *formatStr, ...) { // DONE + UInt32 numBytesWritten; + Char buf[256]; + va_list va; + + if (!stream->fileRef) + return 0; + + va_start(va, formatStr); + vsprintf(buf, formatStr, va); + va_end(va); + + numBytesWritten = fwrite(buf, StrLen(buf), 1, stream); + return numBytesWritten; +} + +Int32 printf(const Char *format, ...) { // DONE + UInt32 numBytesWritten; + Char buf[256]; + va_list va; + + if (!stdout->fileRef) + return 0; + + va_start(va, format); + vsprintf(buf, format, va); + va_end(va); + + numBytesWritten = fwrite(buf, StrLen(buf), 1, stdout); + return numBytesWritten; +} + +Int32 sprintf(Char* s, const Char* formatStr, ...) { + Int16 count; + va_list va; + + va_start(va, formatStr); + count = vsprintf(s, formatStr, va); + va_end(va); + + return count; +} + +Int32 snprintf(Char* s, UInt32 len, const Char* formatStr, ...) { + // len is ignored + Int16 count; + va_list va; + + va_start(va, formatStr); + count = vsprintf(s, formatStr, va); + va_end(va); + + return count; +} + + +/* WARNING : vsprintf + * ------- + * This function can handle only %[+- ][.0][field length][sxXdoiucp] format strings + * compiler option : 4byte int mode only ! + * + * TODO : check http://www.ijs.si/software/snprintf/ for a portable implementation of vsnprintf + * This one make use of sprintf so need to check if it works with PalmOS. + */ + +static Char *StrIToBase(Char *s, Int32 i, UInt8 b) { + const Char *conv = "0123456789ABCDEF"; + Char o; + Int16 c, n = 0; + Int32 div, mod; + + do { + div = i / b; + mod = i % b; + + s[n++] = *(conv + mod); + i = div; + + } while (i >= b); + + if (i > 0) { + s[n + 0] = *(conv + i); + s[n + 1] = 0; + } else { + s[n + 0] = 0; + n--; + } + + for (c=0; c <= (n >> 1); c++) { + o = s[c]; + s[c] = s[n - c]; + s[n - c]= o; + } + + return s; +} + +static void StrProcC_(Char *ioStr, UInt16 maxLen) { + Char *found; + Int16 length; + + while (found = StrStr(ioStr, "`c`")) { + if (found[3] == 0) { // if next char is NULL + length = maxLen - (found - ioStr + 2); + MemMove(found, found + 4, length); + maxLen -= 2; + } + } +} + +static void StrProcXO(Char *ioStr, UInt16 maxLen, Char *tmp) { + Char *found, *last, mod, fill; + Int16 len, count, next; + Int32 val; + + while (found = StrChr(ioStr, '`')) { + last = StrChr(found + 1, '`'); + + if (!last) + return; + + *last = 0; + next = 0; + fill = *(found + 1); + mod = *(found + 2); + count = StrAToI(found + 3); + + len = maxLen - (last - ioStr); + MemMove(found, (last + 1), len); + + // x and X always 8char on palmos ... o set to 8char (not supported on palmos) + while ((found[next] == '0' || found[next] == ' ') && next < 8) // WARNING : reduce size only (TODO ?) + next++; + + // convert to base 8 + if (mod == 'o') { + StrNCopy(tmp, found + next, 8 - next); + tmp[8 - next] = 0; + val = StrAToI(tmp); + StrIToBase(tmp, val, 8); // now we have the same but in octal + next = 8 - StrLen(tmp); + MemMove(found + next, tmp, StrLen(tmp)); + } else { + // if val is 0, keep last 0 + if (next == 8) + next = 7; + } + + if ((8 - next) > count) + count = 8 - next; + + if (count == 0) + count = 1; + + len = maxLen - (found - ioStr) - (8 - count); + MemSet(found, next, fill); + MemMove(found, found + (8 - count), len); + + // ... and upper case + if (mod == 'x') { + while (count--) { + if (*found >='A' && *found <='F') + *found = (*found + 32); + found++; + } + } + } +} + +Int32 vsprintf(Char* s, const Char* formatStr, _Palm_va_list argParam) { + Char format[256], result[256], tmp[32]; + + Char *found, *mod, *num; + UInt32 next; + Boolean zero; + Int16 count, len; + + MemSet(format, sizeof(format), 'x'); + MemSet(result, sizeof(result), 'y'); + MemSet(tmp, sizeof(tmp), 'z'); + + StrCopy(format,formatStr); // copy actual formatStr to temp buffer + next = 0; // start of the string + + while (found = StrChr(format + next, '%')) { + mod = found + 1; + + if (*mod == '%') { // just a % ? + mod++; + + } else { + if (*mod == '+' || + *mod == '-' || + *mod == ' ' ) // skip + mod++; + + if (*mod == '0' || + *mod == '.' ) { + *mod++ = '0'; + zero = true; + } else { + zero = false; + } + + num = mod; + while ( *mod >= '0' && + *mod <= '9' ) // search format char + mod++; + + // get the numeric value + if (num < mod) { + StrNCopy(tmp, num, mod - num); + tmp[mod - num] = 0; + count = StrAToI(tmp); + } else { + count = 0; + } + + if (*mod == 'l') // already set to %...l(x) ? + mod++; + + // prepare new format +#if !defined(PALMOS_ARM) + if (*mod == 'c') { + StrCopy(tmp, "`c`%c%c"); + + } else +#endif + if (*mod == 'p') { + StrCopy(tmp, "%08lX"); // %x = %08X in palmos + + } else { + len = 0; + + switch (*mod) { + case 'x': + case 'X': + case 'o': + tmp[0] = '`'; + tmp[1] = (zero) ? '0' : ' '; + tmp[2] = *mod; + StrIToA(tmp + 3, count); + len += StrLen(tmp); + tmp[len++] = '`'; + tmp[len] = 0; + + if (*mod == 'o') { // set as base 10 num and convert later + *mod = 'd'; + count = 8; // force 8char + } + + break; + } + + StrNCopy(tmp + len, found, (num - found)); + len += (num - found); + + if (count) { + StrIToA(tmp + len, count); + len += StrLen(tmp + len); + } + + if (*mod == 'd' || + *mod == 'i' || + *mod == 'x' || + *mod == 'X' || + *mod == 'u' + ) { + tmp[len++] = 'l'; + } + + tmp[len + 0] = *mod; + tmp[len + 1] = 0; + } + + mod++; + MemMove(found + StrLen(tmp), mod, StrLen(mod) + 1); + StrNCopy(found, tmp, StrLen(tmp)); + mod = found + StrLen(tmp); + } + + next = (mod - format); + } + + // Copy result in a temp buffer to process last formats + StrVPrintF(result, format, argParam); +#if !defined(PALMOS_ARM) + StrProcC_(result, 256); +#endif + StrProcXO(result, 256, tmp); + StrCopy(s, result); + + return StrLen(s); +} diff --git a/backends/PalmOS/Src/missing/ext_stlib.c b/backends/PalmOS/Src/missing/ext_stlib.c new file mode 100644 index 0000000000..11a242145a --- /dev/null +++ b/backends/PalmOS/Src/missing/ext_stlib.c @@ -0,0 +1,130 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include + +#define memNewChunkFlagAllowLarge 0x1000 +SysAppInfoPtr SysGetAppInfo(SysAppInfoPtr *uiAppPP, SysAppInfoPtr *actionCodeAppPP) SYS_TRAP(sysTrapSysGetAppInfo); + +void *bsearch(const void *key, const void *base, UInt32 nmemb, UInt32 size, int (*compar)(const void *, const void *)) { +#ifdef PALMOS_68K + Int32 position; + if (SysBinarySearch(base, nmemb, size, (SearchFuncPtr)compar, key, 0, &position, true)) + return (void *)((UInt32)base + size * position); +#else + int i; + for (i = 0; i < nmemb; i++) + if (compar(key, (void*)((UInt32)base + size * i)) == 0) + return (void*)((UInt32)base + size * i); +#endif + + return NULL; +} + +long strtol(const char *s, char **endptr, int base) { + // WARNING : only base = 10 supported + long val = StrAToI(s); + + if (endptr) { + Char str[maxStrIToALen]; + StrIToA(str, val); + + if (StrNCompare(s, str, StrLen(str)) == 0) + *endptr = (char *)s + StrLen(str); + } + + return val; +} + +MemPtr __malloc(UInt32 size) { + MemPtr newP = NULL; + + if (size <= 65000) { + newP = MemPtrNew(size); + } else { + SysAppInfoPtr appInfoP; + UInt16 ownerID; + UInt16 attr; + + ownerID = ((SysAppInfoPtr)SysGetAppInfo(&appInfoP, &appInfoP))->memOwnerID; + attr = ownerID|memNewChunkFlagAllowLarge|memNewChunkFlagNonMovable; + + newP = MemChunkNew(0, size, attr); + } + + return newP; +} + +MemPtr calloc(UInt32 nelem, UInt32 elsize) { + MemPtr newP; + UInt32 size = (nelem * elsize); + + newP = malloc(size); // was MemGluePtrNew + + if (newP) + MemSet(newP,size,0); + + return newP; +} + +Err free(MemPtr memP) { + if (memP) + return MemPtrFree(memP); + return memErrInvalidParam; +} + +MemPtr realloc(MemPtr oldP, UInt32 size) { + MemPtr newP; + + if (oldP != NULL) + if (MemPtrResize(oldP, size) == 0) + return oldP; + + newP = malloc(size); // was MemPtrNew + + if (oldP!=NULL) { + MemMove(newP,oldP,MemPtrSize(oldP)); + MemPtrFree(oldP); + } + + return newP; +} + +ErrJumpBuf stdlib_errJumpBuf; +#define ERR_MAGIC 0xDADA + +void exit(Int16 status) { +#if (defined(PALMOS_ARM) && defined(COMPILE_ZODIAC)) + SysEventType event; + event.eType = sysEventKeyDownEvent; +#else + EventType event; + event.eType = keyDownEvent; +#endif + event.data.keyDown.chr = vchrLaunch; + event.data.keyDown.modifiers = commandKeyMask; + EvtAddUniqueEventToQueue(&event, 0, true); + + ErrLongJump(stdlib_errJumpBuf, status == 0 ? 0xDADA : status); +} diff --git a/backends/PalmOS/Src/missing/ext_string.c b/backends/PalmOS/Src/missing/ext_string.c new file mode 100644 index 0000000000..a02c360ceb --- /dev/null +++ b/backends/PalmOS/Src/missing/ext_string.c @@ -0,0 +1,121 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include + +void *memchr(const void *s, int c, UInt32 n) { + UInt32 chr; + for(chr = 0; chr < n;chr++,((UInt8 *)s)++) + if ( *((UInt8 *)s) == c) + return (void *)s; + + return NULL; +} + +UInt32 strspn(const char *s1, const char *s2) { + UInt32 chr = 0; + + while ( chr < strlen(s1) && + strchr(s2, s1[chr]) ) + chr++; + + return chr; +} + +static Char *StrTokNext = NULL; + +Char *strtok(Char *str, const Char *sep) { + Char *position = NULL, + *found, + *end; + + UInt16 loop = 0, + chars= StrLen(sep); + + str = (str)?(str):(StrTokNext); + StrTokNext = NULL; + + if (!str) + return NULL; + + end = str+StrLen(str); + + while (loop found) + position = found; + } + + if (position == NULL) + if (str==end) + return NULL; + else + return str; + + position[0] = 0; + StrTokNext = position+1; + + return str; +} + +Char *strpbrk(const Char *s1, const Char *s2) { + Char *found; + UInt32 n; + + for (n=0; n <= StrLen(s2); n++) { + found = StrChr(s1, s2[n]); + if (found) + return found; + } + + return NULL; +} + +Char *strrchr(const Char *s, int c) { + UInt32 chr; + UInt32 n = StrLen(s); + + for(chr = n; chr >= 0; chr--) + if ( *((UInt8 *)s+chr) == c) + return (Char *)(s+chr); + + return NULL; +} + +Char *strdup(const Char *s1) { + Char* buf = (Char *)MemPtrNew(StrLen(s1)+1); + + if(buf) + StrCopy(buf, s1); + + return buf; +} \ No newline at end of file diff --git a/backends/PalmOS/Src/missing/ext_time.c b/backends/PalmOS/Src/missing/ext_time.c new file mode 100644 index 0000000000..5de64062b0 --- /dev/null +++ b/backends/PalmOS/Src/missing/ext_time.c @@ -0,0 +1,85 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include + +time_t time(time_t *tloc) { + // get ROM version + UInt32 romVersion; + Err e = FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); + + // since 1/1/1904 12AM. + UInt32 secs = TimGetSeconds(); + + // form 1/1/1904 12AM to 1/1/1970 12AM + DateTimeType Epoch = {0, 0, 0, 1, 1, 1970, 0}; + + secs -= TimDateTimeToSeconds(&Epoch); + + // DST really supported from OS v4.0 + if (romVersion >= sysMakeROMVersion(4,0,0,sysROMStageRelease,0)) + secs -= (PrefGetPreference(prefTimeZone) + PrefGetPreference(prefDaylightSavingAdjustment)) * 60; + else + secs -= (PrefGetPreference(prefMinutesWestOfGMT) - 720) * 60; + + if (tloc) + *tloc = secs; + + return (secs); +} + + +struct tm *localtime(const time_t *timer) { + static struct tm tmDate; + DateTimeType dt; + UInt32 secs = *timer; + + // get ROM version + UInt32 romVersion; + Err e = FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); + + // form 1/1/1904 12AM to 1/1/1970 12AM + DateTimeType Epoch = {0, 0, 0, 1, 1, 1970, 0}; + + // timer supposed to be based on Epoch + secs += TimDateTimeToSeconds(&Epoch); + + // DST really supported from OS v4.0 + if (romVersion >= sysMakeROMVersion(4,0,0,sysROMStageRelease,0)) + secs += (PrefGetPreference(prefTimeZone) + PrefGetPreference(prefDaylightSavingAdjustment)) * 60; + else + secs += (PrefGetPreference(prefMinutesWestOfGMT) - 720) * 60; // no sure about this one + + TimSecondsToDateTime (secs, &dt); + + tmDate.tm_sec = dt.second; + tmDate.tm_min = dt.minute; + tmDate.tm_hour = dt.hour; + tmDate.tm_mday = dt.day; + tmDate.tm_mon = dt.month - 1; + tmDate.tm_year = dt.year - 1900; + tmDate.tm_wday = dt.weekDay; + + return &tmDate; +} diff --git a/backends/PalmOS/Src/missing/ext_unistd.c b/backends/PalmOS/Src/missing/ext_unistd.c new file mode 100644 index 0000000000..91f2e8e3e5 --- /dev/null +++ b/backends/PalmOS/Src/missing/ext_unistd.c @@ -0,0 +1,41 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include + +const Char *gUnistdCWD = NULL; + +// currently used only to retreive savepath +Char *getcwd(Char *buf, UInt32 size) { + Char *copy = buf; + + if (gUnistdCWD) { + if (!copy) + copy = (Char *)MemPtrNew(StrLen(gUnistdCWD)); // this may never occured + + StrCopy(copy, gUnistdCWD); + } + + return copy; +} \ No newline at end of file -- cgit v1.2.3