Fix FILE-POSITION REPOSITION-FILE and FILE-SIZE. Now use double precision offsets.
authorphil@softsynth.com <phil@softsynth.com@b0a0988d-7f52-0410-8c73-4f6cdee1a2cf>
Sun, 1 Aug 2010 21:41:34 +0000 (21:41 +0000)
committerphil@softsynth.com <phil@softsynth.com@b0a0988d-7f52-0410-8c73-4f6cdee1a2cf>
Sun, 1 Aug 2010 21:41:34 +0000 (21:41 +0000)
csrc/pf_inner.c
csrc/pf_io.h
releases.txt

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
index c31cdc4..5ee78f4 100644 (file)
@@ -84,8 +84,8 @@ void ioTerm( void );
        cell_t sdFlushFile( FileStream * Stream  );\r
        cell_t sdReadFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  );\r
        cell_t sdWriteFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  );\r
        cell_t sdFlushFile( FileStream * Stream  );\r
        cell_t sdReadFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  );\r
        cell_t sdWriteFile( void *ptr, cell_t Size, int32_t nItems, FileStream * Stream  );\r
-       cell_t sdSeekFile( FileStream * Stream, cell_t Position, int32_t Mode );\r
-       cell_t sdTellFile( FileStream * Stream );\r
+       cell_t sdSeekFile( FileStream * Stream, off_t Position, int32_t Mode );\r
+       off_t sdTellFile( FileStream * Stream );\r
        cell_t sdCloseFile( FileStream * Stream );\r
        cell_t sdInputChar( FileStream *stream );\r
        \r
        cell_t sdCloseFile( FileStream * Stream );\r
        cell_t sdInputChar( FileStream *stream );\r
        \r
@@ -118,8 +118,8 @@ void ioTerm( void );
                #define sdFlushFile     fflush\r
                #define sdReadFile      fread\r
                #define sdWriteFile     fwrite\r
                #define sdFlushFile     fflush\r
                #define sdReadFile      fread\r
                #define sdWriteFile     fwrite\r
-               #define sdSeekFile      fseek\r
-               #define sdTellFile      ftell\r
+               #define sdSeekFile      fseeko\r
+               #define sdTellFile      ftello\r
                #define sdCloseFile     fclose\r
                #define sdInputChar     fgetc\r
                \r
                #define sdCloseFile     fclose\r
                #define sdInputChar     fgetc\r
                \r
index 2e5e4e1..62f3502 100644 (file)
@@ -1,6 +1,10 @@
 Release History for pForth - a Portable ANS-like Forth written in ANSI 'C'\r
 \r
 Documentation for pForth at http://www.softsynth.com/pforth/\r
 Release History for pForth - a Portable ANS-like Forth written in ANSI 'C'\r
 \r
 Documentation for pForth at http://www.softsynth.com/pforth/\r
+
+V??
+    - Fixed REPOSITION-FILE FILE-SIZE and FILE-POSITION.
+      They used to use single precision offset. Now use double as specified.
 \r
 V26  5/20/2010
     - 64-bit support for M* UM/MOD etc by Aleksej Saushev. Thanks Aleksej!
 \r
 V26  5/20/2010
     - 64-bit support for M* UM/MOD etc by Aleksej Saushev. Thanks Aleksej!