--- 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!