char *CharPtr;\r
cell_t *CellPtr;\r
FileStream *FileID;\r
- uint8_t *CodeBase = CODE_BASE;\r
+ uint8_t *CodeBase = (uint8_t *) CODE_BASE;\r
ThrowCode ExceptionReturnCode = 0;\r
\r
/* FIXME\r
case ID_FILE_SIZE: /* ( fid -- ud ior ) */\r
/* Determine file size by seeking to end and returning position. */\r
FileID = (FileStream *) TOS;\r
- Scratch = sdTellFile( FileID );\r
- sdSeekFile( FileID, 0, PF_SEEK_END );\r
- M_PUSH( sdTellFile( FileID ));\r
- sdSeekFile( FileID, Scratch, PF_SEEK_SET );\r
- TOS = (Scratch < 0) ? -4 : 0 ; /* !!! err num */\r
+ {\r
+ off_t endposition, offsetHi;\r
+ off_t original = sdTellFile( FileID );\r
+ sdSeekFile( FileID, 0, PF_SEEK_END );\r
+ endposition = sdTellFile( FileID );\r
+ M_PUSH(endposition);\r
+ // Just use a 0 if they are the same size.\r
+ offsetHi = (sizeof(off_t) > sizeof(cell_t)) ? (endposition >> (8*sizeof(cell_t))) : 0 ;\r
+ M_PUSH(offsetHi);\r
+ sdSeekFile( FileID, original, PF_SEEK_SET );\r
+ TOS = (original < 0) ? -4 : 0 ; /* !!! err num */\r
+ }\r
endcase;\r
\r
case ID_FILE_WRITE: /* ( addr len fid -- ior ) */\r
TOS = (Temp != Scratch) ? -3 : 0;\r
endcase;\r
\r
- case ID_FILE_REPOSITION: /* ( pos fid -- ior ) */\r
- FileID = (FileStream *) TOS;\r
- Scratch = M_POP;\r
- TOS = sdSeekFile( FileID, Scratch, PF_SEEK_SET );\r
+ case ID_FILE_REPOSITION: /* ( ud fid -- ior ) */ \r
+ {\r
+ FileID = (FileStream *) TOS;\r
+ off_t offset = M_POP;\r
+ // Avoid compiler warnings on Mac.\r
+ offset = (sizeof(off_t) > sizeof(cell_t)) ? (offset << 8*sizeof(cell_t)) : 0 ;\r
+ offset += M_POP;\r
+ TOS = sdSeekFile( FileID, offset, PF_SEEK_SET );\r
+ }\r
endcase;\r
\r
- case ID_FILE_POSITION: /* ( pos fid -- ior ) */\r
- M_PUSH( sdTellFile( (FileStream *) TOS ));\r
- TOS = 0;\r
+ case ID_FILE_POSITION: /* ( fid -- ud ior ) */\r
+ {\r
+ off_t offsetHi;\r
+ FileID = (FileStream *) TOS;\r
+ off_t position = sdTellFile( FileID );\r
+ M_PUSH(position);\r
+ // Just use a 0 if they are the same size.\r
+ offsetHi = (sizeof(off_t) > sizeof(cell_t)) ? (position >> (8*sizeof(cell_t))) : 0 ;\r
+ M_PUSH(offsetHi);\r
+ TOS = (position < 0) ? -4 : 0 ; /* !!! err num */\r
+ }\r
endcase;\r
\r
case ID_FILE_RO: /* ( -- fam ) */\r
if( FileID )\r
{\r
SAVE_REGISTERS;\r
- Scratch = ffIncludeFile( FileID );\r
+ Scratch = ffIncludeFile( FileID ); /* Also closes the file. */\r
LOAD_REGISTERS;\r
- sdCloseFile( FileID );\r
if( Scratch ) M_THROW(Scratch);\r
}\r
else\r