SmallInteger may be to small for file positions
authorStefan Vogel <sv@exept.de>
Thu, 05 Feb 2004 12:36:00 +0100
changeset 7870 6918dd01864c
parent 7869 597a8faaf603
child 7871 5c357f1ba0c9
SmallInteger may be to small for file positions
FileStream.st
--- a/FileStream.st	Wed Feb 04 11:20:17 2004 +0100
+++ b/FileStream.st	Thu Feb 05 12:36:00 2004 +0100
@@ -717,7 +717,7 @@
         } while ((currentPosition < 0) && (__threadErrno == EINTR));
 
         if (currentPosition >= 0) {
-            RETURN ( __MKSMALLINT(currentPosition) );
+            RETURN ( __MKINT(currentPosition) );
         }
         __INST(lastErrorNumber) = __MKSMALLINT(__threadErrno);
     }
@@ -738,41 +738,39 @@
     OBJ fp;
     long nP;
 
-    if ((__INST(canPosition) != false) 
-     || (newPos == __MKSMALLINT(0))) {
-        if ((fp = __INST(filePointer)) != nil) {
-            if (__isSmallInteger(newPos)) {
-                f = __FILEVal(fp);
-                nP = (long)__intVal(newPos);
-                if (nP < 0) nP = 0;
+    if ((__INST(canPosition) != false) || (newPos == __MKSMALLINT(0))) {
+        if ((fp = __INST(filePointer)) != nil && __isInteger(newPos)) {
+            f = __FILEVal(fp);
+            nP = (long)__signedLongIntVal(newPos);
+            /* better return error here? */
+            if (nP < 0) nP = 0;
 
-                do {
+            do {
 #ifdef WIN32
-                    __threadErrno = 0;
-                    if (__INST(buffered) == true) {                                          
-                        ret = STX_C_CALL3( "fseek", fseek, f, nP, SEEK_SET);    
-                    } else {                                                    
-                        __INST(readAhead) = nil;                            
-                        ret = STX_C_CALL3( "lseek", lseek, fileno(f), nP, SEEK_SET); 
-                    }
+                __threadErrno = 0;
+                if (__INST(buffered) == true) {                                          
+                    ret = STX_C_CALL3( "fseek", fseek, f, nP, SEEK_SET);    
+                } else {                                                    
+                    __INST(readAhead) = nil;                            
+                    ret = STX_C_CALL3( "lseek", lseek, fileno(f), nP, SEEK_SET); 
+                }
 #else
-                    if (__INST(buffered) == true) {
-                        ret = fseek(f, nP, SEEK_SET);
-                    } else {
-                        ret = lseek(fileno(f), nP, SEEK_SET);
-                    }
+                if (__INST(buffered) == true) {
+                    ret = fseek(f, nP, SEEK_SET);
+                } else {
+                    ret = lseek(fileno(f), nP, SEEK_SET);
+                }
 #endif
-                } while ((ret < 0) && (__threadErrno == EINTR));
-                if (ret >= 0) {
-                    __INST(position) = newPos;
-                    /*
-                     * just to make certain ...
-                     */
-                    __INST(hitEOF) = false;
-                    RETURN ( self );
-                }
-                __INST(lastErrorNumber) = __MKSMALLINT(__threadErrno);
+            } while ((ret < 0) && (__threadErrno == EINTR));
+            if (ret >= 0) {
+                __INST(position) = newPos;
+                /*
+                 * just to make certain ...
+                 */
+                __INST(hitEOF) = false;
+                RETURN ( self );
             }
+            __INST(lastErrorNumber) = __MKSMALLINT(__threadErrno);
         }
     }
 %}.
@@ -1386,7 +1384,7 @@
 !FileStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.97 2004-01-14 13:04:57 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.98 2004-02-05 11:36:00 stefan Exp $'
 ! !
 
 FileStream initialize!