Fix FILE-POSITION REPOSITION-FILE and FILE-SIZE. Now use double precision offsets.
[pforth] / csrc / pf_inner.c
index ab1e38d..59ddfff 100644 (file)
@@ -278,7 +278,7 @@ int pfCatch( ExecToken XT )
        char          *CharPtr;\r
        cell_t        *CellPtr;\r
        FileStream    *FileID;\r
        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
        ThrowCode      ExceptionReturnCode = 0;\r
        \r
 /* FIXME\r
@@ -1018,11 +1018,18 @@ DBUG(("XX ah,m,l = 0x%8x,%8x,%8x - qh,l = 0x%8x,%8x\n", ah,am,al, qh,ql ));
                case ID_FILE_SIZE: /* ( fid -- ud ior ) */\r
 /* Determine file size by seeking to end and returning position. */\r
                        FileID = (FileStream *) TOS;\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
                        endcase;\r
 \r
                case ID_FILE_WRITE: /* ( addr len fid -- ior ) */\r
@@ -1033,15 +1040,28 @@ DBUG(("XX ah,m,l = 0x%8x,%8x,%8x - qh,l = 0x%8x,%8x\n", ah,am,al, qh,ql ));
                        TOS = (Temp != Scratch) ? -3 : 0;\r
                        endcase;\r
 \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
                        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
                        endcase;\r
 \r
                case ID_FILE_RO: /* (  -- fam ) */\r