*** empty log message ***
authorClaus Gittinger <cg@exept.de>
Tue, 18 Dec 2001 19:49:58 +0100
changeset 6336 7accea3927f8
parent 6335 8286bc57d05e
child 6337 d1320ad45f57
*** empty log message ***
Win32OperatingSystem.st
--- a/Win32OperatingSystem.st	Tue Dec 18 14:46:21 2001 +0100
+++ b/Win32OperatingSystem.st	Tue Dec 18 19:49:58 2001 +0100
@@ -8532,7 +8532,7 @@
 !
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.104 2001-12-11 20:13:22 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.105 2001-12-18 18:49:58 cg Exp $'
 ! !
 
 !Win32OperatingSystem::Win32FILEHandle methodsFor:'release'!
@@ -8559,7 +8559,7 @@
 !
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.104 2001-12-11 20:13:22 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.105 2001-12-18 18:49:58 cg Exp $'
 ! !
 
 !Win32OperatingSystem::Win32Handle methodsFor:'io'!
@@ -8572,11 +8572,14 @@
 
 %{
     unsigned char *extPtr;
+    int bufferIsExternalBytes;
+    int mustFreeBuffer = 0;
     int nRead = -1;
     HANDLE hFile = (HANDLE)(__externalAddressVal(self));
     DWORD cntWanted, offs, cntRead;
     int bufferSize;
-    OBJ sz;
+    char miniBuffer[32];
+    BOOL ok;
 
     if ((hFile == 0) || (hFile == INVALID_HANDLE_VALUE)) {
         errSym = @symbol(errorNotOpen);
@@ -8587,33 +8590,70 @@
         goto bad;
     }
     cntWanted = __smallIntegerVal(count);
-    offs = __smallIntegerVal(firstIndex) - 1;
-
-    if (! __isExternalBytes(aByteBuffer)) {
-        errSym = @symbol(badBuffer);
+    if (cntWanted <= 0) {
+        errSym = @symbol(badCount);
         goto bad;
     }
-        
-    extPtr = (char *)(__externalBytesAddress(aByteBuffer));
-    sz = __externalBytesSize(aByteBuffer);
-    if (! __isSmallInteger(sz)) {
-        errSym = @symbol(badBufferSize);
+    offs = __smallIntegerVal(firstIndex) - 1;
+    if (offs < 0) {
+        errSym = @symbol(badOffset);
         goto bad;
     }
-    bufferSize = __smallIntegerVal(sz);
-
-    if ((offs >= 0)
-     && (cntWanted >= 0)
-     && (bufferSize >= (cntWanted + offs))) {
-        BOOL ok;
-
-        ok = ReadFile(hFile, extPtr+offs, cntWanted, &cntRead, 0 /* lpOverlapped */);
-        if (ok == TRUE) {
-            RETURN (__mkSmallInteger(cntRead));
+
+    bufferIsExternalBytes = __isExternalBytes(aByteBuffer);
+    if (! bufferIsExternalBytes) {
+        if (__isByteArray(aByteBuffer)) {
+            bufferSize = __byteArraySize(aByteBuffer);
+        } else if (__isString(aByteBuffer)) {
+            bufferSize = __stringSize(aByteBuffer);
+        } else {
+            errSym = @symbol(badBuffer);
+            goto bad;
+        }
+        if (bufferSize < (cntWanted + offs)) {
+            errSym = @symbol(badBufferSize);
+            goto bad;
+        }
+        if (cntWanted <= sizeof(miniBuffer)) {
+            extPtr = miniBuffer;
+        } else {
+            extPtr = malloc(cntWanted);
+            mustFreeBuffer = 1;
         }
-        errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
-    }
+    } else {        
+        OBJ sz;
+
+        extPtr = (char *)(__externalBytesAddress(aByteBuffer));
+        sz = __externalBytesSize(aByteBuffer);
+        if (! __isSmallInteger(sz)) {
+            errSym = @symbol(badBufferSize);
+            goto bad;
+        }
+        bufferSize = __smallIntegerVal(sz);
+        if (bufferSize < (cntWanted + offs)) {
+            errSym = @symbol(badBufferSize);
+            goto bad;
+        }
+        extPtr = extPtr + offs;
+    }
+
+    ok = ReadFile(hFile, extPtr, cntWanted, &cntRead, 0 /* lpOverlapped */);
+    if (ok == TRUE) {
+        if (! bufferIsExternalBytes) {
+            /* copy over */
+            memcpy(__byteArrayVal(aByteBuffer)+offs, extPtr, cntRead);
+            if (mustFreeBuffer) {
+                free(extPtr);
+            }
+        }
+        RETURN (__mkSmallInteger(cntRead));
+    }
+    errorNumber = __mkSmallInteger( __WIN32_ERR(GetLastError()) );
+
 bad: ;   
+    if (mustFreeBuffer) {
+        free(extPtr);
+    }
 %}.
 
     errorNumber isNil ifTrue:[
@@ -8632,6 +8672,74 @@
     "
 !
 
+seekTo:newPosition from:whence
+    "whence is one of:
+        #begin
+        #current
+        #end
+    "
+
+    |errSym errorNumber|
+
+%{
+    HANDLE hFile = (HANDLE)(__externalAddressVal(self));
+    DWORD moveHow;
+    LONG posLo, posHi = 0;
+    __uint64__ pos64, newPos64;
+
+    if ((hFile == 0) || (hFile == INVALID_HANDLE_VALUE)) {
+        errSym = @symbol(errorNotOpen);
+        goto bad;
+    }
+
+    if (whence == @symbol(begin)) {
+        moveHow = FILE_BEGIN;
+    } else if (whence == @symbol(current)) {
+        moveHow = FILE_CURRENT;
+    } else if (whence == @symbol(end)) {
+        moveHow = FILE_END;
+    } else {
+        errSym = @symbol(badArgument2);
+        goto bad;
+    }
+
+    if (__signedLong64IntVal(newPosition, &pos64) == 0) {
+        errSym = @symbol(badArgument);
+        goto bad;
+    }
+    posLo = pos64.lo;
+    posHi = pos64.hi;
+
+    posLo = SetFilePointer(hFile, posLo, &posHi, moveHow);
+    if (posLo == 0xFFFFFFFF) {
+        int lastError;
+
+        /* can be either an error, or a valid low-word */
+        lastError = GetLastError();
+        if (lastError != NO_ERROR) {
+            errorNumber = __mkSmallInteger( __WIN32_ERR(lastError) );
+            goto bad;
+        }
+    }
+
+    if (posHi == 0) {
+        RETURN (__MKUINT( posLo ));
+    }
+    newPos64.lo = posLo;
+    newPos64.hi = posHi;
+
+    RETURN ( __MKUINT64(&newPos64) );
+
+bad: ;   
+%}.
+
+    errorNumber isNil ifTrue:[
+        self error:'invalid argument(s): ', errSym.
+    ] ifFalse:[
+        (OperatingSystem errorHolderForNumber:errorNumber) reportError
+    ].
+!
+
 writeBytes:count from:aByteBuffer startingAt:firstIndex
     "write count bytes from a byte-buffer;
      Return the number of bytes written (negative on error)"
@@ -8721,6 +8829,6 @@
 !Win32OperatingSystem class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.104 2001-12-11 20:13:22 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.105 2001-12-18 18:49:58 cg Exp $'
 ! !
 Win32OperatingSystem initialize!