diff -r 54bf614c5585 -r 36567dd3b8d1 FileStream.st --- a/FileStream.st Mon Aug 03 11:59:53 2015 +0200 +++ b/FileStream.st Mon Aug 03 12:00:06 2015 +0200 @@ -235,18 +235,18 @@ this and an error is raised, if a position: is attemted. I know, this is ugly, but what else could we do ? Late note: who cares for VMS these days? - (and how much useless effort has been put in the past, - to support lousy operating systems?) + (and how much useless effort has been put in the past, + to support lousy operating systems?) [instance variables:] - pathName the file's path (if known) - canPosition positionable - read above comment + pathName the file's path (if known) + canPosition positionable - read above comment [author:] - Claus Gittinger + Claus Gittinger [see also:] - Filename DirectoryStream PipeStream Socket + Filename DirectoryStream PipeStream Socket " ! @@ -449,48 +449,48 @@ |nameString random prevRandom prevNameString newTempFilename stream| [ - prevRandom := random. - prevNameString := nameString. + prevRandom := random. + prevNameString := nameString. - "Use random numbers in order to improve the security - by making the generated names less predictable" - [ - random := RandomGenerator new nextInteger. - ] doWhile:[random = prevRandom]. + "Use random numbers in order to improve the security + by making the generated names less predictable" + [ + random := RandomGenerator new nextInteger. + ] doWhile:[random = prevRandom]. - nameString := template bindWith:(OperatingSystem getProcessId) with:random. + nameString := template bindWith:(OperatingSystem getProcessId) with:random. - aDirectoryOrNil isNil ifTrue:[ - newTempFilename := nameString. - ] ifFalse:[ - newTempFilename := aDirectoryOrNil asFilename constructString:nameString. - ]. + aDirectoryOrNil isNil ifTrue:[ + newTempFilename := nameString. + ] ifFalse:[ + newTempFilename := aDirectoryOrNil asFilename constructString:nameString. + ]. - [ - stream := self open:newTempFilename withMode:#(CREATE_NEW GENERIC_READ_WRITE). - ] on:OpenError do:[:ex| - ex errorCategory ~~ #existingReferentSignal ifTrue:[ - "some fundamental error, raise exception" - ex reject. - ]. - prevNameString = nameString ifTrue:[ - "no more names - probably a bad template" - ex reject. - ]. - "file exists, retry another one" - ]. + [ + stream := self open:newTempFilename withMode:#(CREATE_NEW GENERIC_READ_WRITE). + ] on:OpenError do:[:ex| + ex errorCategory ~~ #existingReferentSignal ifTrue:[ + "some fundamental error, raise exception" + ex reject. + ]. + prevNameString = nameString ifTrue:[ + "no more names - probably a bad template" + ex reject. + ]. + "file exists, retry another one" + ]. ] doWhile:[ - stream isNil and:[prevNameString ~= nameString] "/ if namestring didn't change, the template is bad + stream isNil and:[prevNameString ~= nameString] "/ if namestring didn't change, the template is bad ]. ^ stream "temp files in '/tmp': - FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo%1_%2' + FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo%1_%2' This must fail on the second try: - FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo' - FileStream newTemporaryIn:'c:\temp' asFilename nameTemplate:'foo' + FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo' + FileStream newTemporaryIn:'c:\temp' asFilename nameTemplate:'foo' " "temp files somewhere @@ -893,19 +893,19 @@ Therefore, this method is reimplemented here (from ExternalStream)" outStream isExternalStream ifTrue:[ - pos := self position. - n := self size - pos. - nWritten := OperatingSystem - copyFromFd:self fileDescriptor - toFd:outStream fileDescriptor - startIndex:pos - count:n. - nWritten > 0 ifTrue:[ - self position:pos+nWritten. - ]. - nWritten = n ifTrue:[ - ^ self - ]. + pos := self position. + n := self size - pos. + nWritten := OperatingSystem + copyFromFd:self fileDescriptor + toFd:outStream fileDescriptor + startIndex:pos + count:n. + nWritten > 0 ifTrue:[ + self position:pos+nWritten. + ]. + nWritten = n ifTrue:[ + ^ self + ]. ]. ^ super copyToEndInto:outStream bufferSize:bufferSize. @@ -936,35 +936,35 @@ off_t truncateSize; if ((fp != nil) && (__INST(mode) != @symbol(readonly))) { - if (__isSmallInteger(newSize)) { - truncateSize = __intVal(newSize); - if (truncateSize < 0) { - goto getOutOfHere; - } - } else { - truncateSize = __signedLongIntVal(newSize); - if (truncateSize < 0) { - goto getOutOfHere; - } - if (truncateSize == 0) { - if (sizeof(truncateSize) == 8) { - if (__signedLong64IntVal(newSize, &truncateSize) == 0 || truncateSize < 0) { - goto getOutOfHere; - } - } else { - goto getOutOfHere; - } - } - } + if (__isSmallInteger(newSize)) { + truncateSize = __intVal(newSize); + if (truncateSize < 0) { + goto getOutOfHere; + } + } else { + truncateSize = __signedLongIntVal(newSize); + if (truncateSize < 0) { + goto getOutOfHere; + } + if (truncateSize == 0) { + if (sizeof(truncateSize) == 8) { + if (__signedLong64IntVal(newSize, &truncateSize) == 0 || truncateSize < 0) { + goto getOutOfHere; + } + } else { + goto getOutOfHere; + } + } + } - f = __FILEVal(fp); + f = __FILEVal(fp); - if (__INST(buffered) == true) { - fflush(f); - fseek(f, 0L, SEEK_END); /* needed in stdio */ - } - ftruncate(fileno(f), truncateSize); - RETURN (self); + if (__INST(buffered) == true) { + fflush(f); + fseek(f, 0L, SEEK_END); /* needed in stdio */ + } + ftruncate(fileno(f), truncateSize); + RETURN (self); } getOutOfHere: ; #endif @@ -972,7 +972,7 @@ handle isNil ifTrue:[self errorNotOpen. ^ self]. (mode == #readonly) ifTrue:[self errorReadOnly. ^ self]. newSize < 0 ifTrue:[ - self error:'wrong arg'. + self error:'wrong arg'. ]. self errorUnsupportedOperation @@ -986,7 +986,7 @@ s close. Transcript showCR:(f fileSize). - f remove. + f remove. " ! ! @@ -1001,61 +1001,61 @@ off_t currentPosition; if (__INST(handle) != nil) { - do { - f = __FILEVal(__INST(handle)); + do { + f = __FILEVal(__INST(handle)); #ifdef WIN32 - __threadErrno = 0; - if (__INST(buffered) == true) { + __threadErrno = 0; + if (__INST(buffered) == true) { # if 0 - currentPosition = STX_C_CALL1( "ftell", ftell, f); + currentPosition = STX_C_CALL1( "ftell", ftell, f); # else - currentPosition = ftell(f); - __threadErrno = errno; + currentPosition = ftell(f); + __threadErrno = errno; # endif - } else { - OBJ rA = __INST(readAhead); - off_t offs = 0; + } else { + OBJ rA = __INST(readAhead); + off_t offs = 0; - if (rA != nil) { - __INST(readAhead) = nil; - offs = -1; - } + if (rA != nil) { + __INST(readAhead) = nil; + offs = -1; + } # if 0 - currentPosition = STX_C_CALL3( "lseek", lseek, fileno(f), offs, SEEK_CUR); + currentPosition = STX_C_CALL3( "lseek", lseek, fileno(f), offs, SEEK_CUR); # else - currentPosition = lseek(fileno(f), offs, SEEK_CUR); - __threadErrno = errno; + currentPosition = lseek(fileno(f), offs, SEEK_CUR); + __threadErrno = errno; # endif - } + } #else /* !WIN32 */ - if (__INST(buffered) == true) { + if (__INST(buffered) == true) { #ifdef _LFS_LARGEFILE - currentPosition = ftello(f); + currentPosition = ftello(f); #else - currentPosition = ftell(f); + currentPosition = ftell(f); #endif /* ! _LFS_LARGEFILE */ - } else { - currentPosition = lseek(fileno(f), (off_t)0, SEEK_CUR); - } + } else { + currentPosition = lseek(fileno(f), (off_t)0, SEEK_CUR); + } #endif /* !WIN32 */ - } while ((currentPosition < 0) && (__threadErrno == EINTR)); + } while ((currentPosition < 0) && (__threadErrno == EINTR)); - if (currentPosition >= 0) { - OBJ rslt; + if (currentPosition >= 0) { + OBJ rslt; - if (sizeof(currentPosition) == 8) { - rslt = __MKINT64 (¤tPosition); - } else { - rslt = __MKINT(currentPosition); - } - RETURN ( rslt ); - } - error = __mkSmallInteger(__threadErrno); + if (sizeof(currentPosition) == 8) { + rslt = __MKINT64 (¤tPosition); + } else { + rslt = __MKINT(currentPosition); + } + RETURN ( rslt ); + } + error = __mkSmallInteger(__threadErrno); } %}. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self ioError:error. + lastErrorNumber := error. + ^ self ioError:error. ]. handle isNil ifTrue:[^ self errorNotOpen]. ^ self primitiveFailed @@ -1071,96 +1071,96 @@ OBJ fp; if ((__INST(canPosition) != false) || (newPos == __mkSmallInteger(0))) { - if ((fp = __INST(handle)) != nil) { + if ((fp = __INST(handle)) != nil) { #if defined(_LFS_LARGE_FILE) && !defined(WIN32) # define FSEEK fseeko - off_t nP; + off_t nP; #else #define FSEEK fseek - long nP; + long nP; #endif - if (__isSmallInteger(newPos)) { - nP = __intVal(newPos); - if (nP < 0) { - __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); - goto getOutOfHere; - } - } else { - nP = __signedLongIntVal(newPos); - if (nP < 0) { - __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); - goto getOutOfHere; - } - if (nP == 0) { - if (sizeof(nP) == 8) { - if (__signedLong64IntVal(newPos, &nP) == 0 || nP < 0) { - __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); - goto getOutOfHere; - } - } else { - __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); - goto getOutOfHere; - } - } - } + if (__isSmallInteger(newPos)) { + nP = __intVal(newPos); + if (nP < 0) { + __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); + goto getOutOfHere; + } + } else { + nP = __signedLongIntVal(newPos); + if (nP < 0) { + __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); + goto getOutOfHere; + } + if (nP == 0) { + if (sizeof(nP) == 8) { + if (__signedLong64IntVal(newPos, &nP) == 0 || nP < 0) { + __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); + goto getOutOfHere; + } + } else { + __INST(lastErrorNumber) = __mkSmallInteger(EINVAL); + goto getOutOfHere; + } + } + } - f = __FILEVal(fp); + f = __FILEVal(fp); - do { + do { #if defined(DO_WRAP_CALL_FSEEK) - __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); - } - __threadErrno = errno; + if (__INST(buffered) == true) { + ret = FSEEK(f, nP, SEEK_SET); + } else { + ret = lseek(fileno(f), nP, SEEK_SET); + } + __threadErrno = errno; #endif - } while ((ret < 0) && (__threadErrno == EINTR)); - if (ret >= 0) { - __INST(position) = newPos; __STORE(self, newPos); - /* - * just to make certain ... - */ - __INST(hitEOF) = false; - RETURN ( self ); - } - error = __mkSmallInteger(__threadErrno); - } + } while ((ret < 0) && (__threadErrno == EINTR)); + if (ret >= 0) { + __INST(position) = newPos; __STORE(self, newPos); + /* + * just to make certain ... + */ + __INST(hitEOF) = false; + RETURN ( self ); + } + error = __mkSmallInteger(__threadErrno); + } } getOutOfHere: ; #undef FSEEK %}. canPosition == false ifTrue:[ - "/ position by rewinding & re-reading everything up-to - "/ that point. - ^ self slowPosition:newPos + "/ position by rewinding & re-reading everything up-to + "/ that point. + ^ self slowPosition:newPos ]. error notNil ifTrue:[ - lastErrorNumber := error. - (OperatingSystem errorSymbolForNumber:error) == #EINVAL ifTrue:[ - "/ invalid position - ^ self positionError. - ]. - "/ assume I/O error - ^ self ioError:error. + lastErrorNumber := error. + (OperatingSystem errorSymbolForNumber:error) == #EINVAL ifTrue:[ + "/ invalid position + ^ self positionError. + ]. + "/ assume I/O error + ^ self ioError:error. ]. handle isNil ifTrue:[^ self errorNotOpen]. rslt := self positionFile:handle position:newPos. rslt >= 0 ifTrue:[ - position := newPos. + position := newPos. ] ifFalse:[ - hitEOF := true. + hitEOF := true. ] ! @@ -1192,39 +1192,39 @@ off_t ret; if (__INST(handle) != nil) { - f = __FILEVal(__INST(handle)); - __INST(position) = nil; /* i.e. unknown */ - do { + f = __FILEVal(__INST(handle)); + __INST(position) = nil; /* i.e. unknown */ + do { #ifdef WIN32 - __threadErrno = 0; - if (__INST(buffered) == true) { - ret = STX_C_CALL3( "fseek", fseek, f, 0L, SEEK_END); - } else { - __INST(readAhead) = nil; - ret = STX_C_CALL3( "lseek", lseek, fileno(f), 0L, SEEK_END); - } + __threadErrno = 0; + if (__INST(buffered) == true) { + ret = STX_C_CALL3( "fseek", fseek, f, 0L, SEEK_END); + } else { + __INST(readAhead) = nil; + ret = STX_C_CALL3( "lseek", lseek, fileno(f), 0L, SEEK_END); + } #else - if (__INST(buffered) == true) { + if (__INST(buffered) == true) { #ifdef _LFS_LARGE_FILE - ret = fseeko(f, (off_t)0, SEEK_END); + ret = fseeko(f, (off_t)0, SEEK_END); #else - ret = fseek(f, 0L, SEEK_END); + ret = fseek(f, 0L, SEEK_END); #endif - } else { - ret = lseek(fileno(f), (off_t)0, SEEK_END); - } + } else { + ret = lseek(fileno(f), (off_t)0, SEEK_END); + } #endif - } while ((ret < 0) && (__threadErrno == EINTR)); - if (ret >= 0) { - RETURN ( self ); - } - error = __mkSmallInteger(__threadErrno); + } while ((ret < 0) && (__threadErrno == EINTR)); + if (ret >= 0) { + RETURN ( self ); + } + error = __mkSmallInteger(__threadErrno); } %}. error notNil ifTrue:[ - lastErrorNumber := error. - self ioError:error. - ^ self. + lastErrorNumber := error. + self ioError:error. + ^ self. ]. handle isNil ifTrue:[^ self errorNotOpen]. ^ self primitiveFailed @@ -1236,28 +1236,28 @@ This is required to reposition nonPositionable streams, such as tape-streams or variable-record-RMS files under VMS. Caveat: - This should really be done transparently by the stdio library." + This should really be done transparently by the stdio library." |buffer amount pos0Based| self isReadable ifFalse:[ - "/ sorry - ^ self positionError + "/ sorry + ^ self positionError ]. buffer := ByteArray new:8*1024. (position isNil "/ i.e. unknown or:[newPos < (pos0Based := self position)]) ifTrue:[ - self reset. - pos0Based := self position. + self reset. + pos0Based := self position. ]. [pos0Based < newPos] whileTrue:[ - amount := (buffer size) min:(newPos-pos0Based). - (self nextBytes:amount into:buffer startingAt:1) ~~ amount ifTrue:[ - ^ self positionError - ]. - pos0Based := self position. + amount := (buffer size) min:(newPos-pos0Based). + (self nextBytes:amount into:buffer startingAt:1) ~~ amount ifTrue:[ + ^ self positionError + ]. + pos0Based := self position. ]. "/ ('FileStream [info]: slow position - please convert ''' , pathName printString , ''' to streamLF format') infoPrintCR. ! ! @@ -1349,369 +1349,369 @@ int pass = 0; if (!__isNonNilObject(encodedPathName) - || !(__isStringLike(openmode) || __isArrayLike(openmode))) - goto badArgument; + || !(__isStringLike(openmode) || __isArrayLike(openmode))) + goto badArgument; retry: #ifdef __VMS__ if (__isStringLike(encodedPathName)) { - do { - /* - * allow passing additional RMS arguments. - * stupid: DEC does not seem to offer an interface for passing a char **. - */ - __threadErrno = 0; + do { + /* + * allow passing additional RMS arguments. + * stupid: DEC does not seem to offer an interface for passing a char **. + */ + __threadErrno = 0; - { - if (__isArray(attributeSpec)) { - OBJ *ap = __ArrayInstPtr(attributeSpec)->a_element; - int numAttrib = 0; - int i; + { + if (__isArray(attributeSpec)) { + OBJ *ap = __ArrayInstPtr(attributeSpec)->a_element; + int numAttrib = 0; + int i; - numAttrib = __arraySize(attributeSpec); - for (i=0; i MAXPATHLEN) l = MAXPATHLEN; - for (i=0; i MAXPATHLEN) l = MAXPATHLEN; + for (i=0; i= 0) { - __threadErrno = 0; - f = fdopen(fd, __openmode); - if (f == NULL) { - close(fd); // fdopen failed, close before retry. - } - } + if (fd >= 0) { + __threadErrno = 0; + f = fdopen(fd, __openmode); + if (f == NULL) { + close(fd); // fdopen failed, close before retry. + } + } } # endif /* not WIN32 */ @@ -1719,81 +1719,81 @@ if (f == NULL) { - /* - * If no filedescriptors available, try to finalize - * possibly collected fd's and try again. - */ - if ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass == 0) { - pass = 1; - __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0); - __SSEND0(@global(ObjectMemory), @symbol(finalize), 0); - goto retry; - } + /* + * If no filedescriptors available, try to finalize + * possibly collected fd's and try again. + */ + if ((__threadErrno == ENFILE || __threadErrno == EMFILE) && pass == 0) { + pass = 1; + __SSEND0(@global(ObjectMemory), @symbol(scavenge), 0); + __SSEND0(@global(ObjectMemory), @symbol(finalize), 0); + goto retry; + } badArgument: getOutOfHere: - error = __mkSmallInteger(__threadErrno); - __INST(position) = nil; + error = __mkSmallInteger(__threadErrno); + __INST(position) = nil; } else { #ifdef __VMS__ - /* - * check to see if this is positionable ... - */ - __INST(canPosition) = false; + /* + * check to see if this is positionable ... + */ + __INST(canPosition) = false; # ifndef _POSIX_C_SOURCE - { - struct stat statBuffer; + { + struct stat statBuffer; - if (fstat(fileno(f), &statBuffer) >= 0) { - switch (statBuffer.st_fab_rfm) { - case FAB$C_UDF: /* undefined (also stream binary) */ - case FAB$C_VAR: /* variable length records */ - case FAB$C_VFC: /* variable fixed control */ - case FAB$C_STM: /* RMS-11 stream (valid only for sequen) */ - default: - __INST(canPosition) = false; - break; + if (fstat(fileno(f), &statBuffer) >= 0) { + switch (statBuffer.st_fab_rfm) { + case FAB$C_UDF: /* undefined (also stream binary) */ + case FAB$C_VAR: /* variable length records */ + case FAB$C_VFC: /* variable fixed control */ + case FAB$C_STM: /* RMS-11 stream (valid only for sequen) */ + default: + __INST(canPosition) = false; + break; - case FAB$C_FIX: /* fixed length records */ - case FAB$C_STMLF: /* LF stream (valid only for sequential) */ - case FAB$C_STMCR: /* CR stream (valid only for sequential) */ - __INST(canPosition) = true; - break; - } - } - } + case FAB$C_FIX: /* fixed length records */ + case FAB$C_STMLF: /* LF stream (valid only for sequential) */ + case FAB$C_STMCR: /* CR stream (valid only for sequential) */ + __INST(canPosition) = true; + break; + } + } + } # endif #else /* not VMS */ - __INST(canPosition) = true; + __INST(canPosition) = true; #endif /* not VMS */ - if (@global(FileOpenTrace) == true) { - console_fprintf(stderr, "fopen %s [FileStream] -> %x\n", __stringVal(pathName), f); - } - if (f != NULL) { - OBJ fp; + if (@global(FileOpenTrace) == true) { + console_fprintf(stderr, "fopen %s [FileStream] -> %"_lx_"\n", __stringVal(pathName), (INT)f); + } + if (f != NULL) { + OBJ fp; - wasBlocked = __BLOCKINTERRUPTS(); + wasBlocked = __BLOCKINTERRUPTS(); #if 0 - // The original code was: - __INST(handle) = fp = __MKEXTERNALADDRESS(f); __STORE(self, fp); - // but for that, gcc generates wrong code, which loads self (volatile) into - // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp. - // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old - // object. + // The original code was: + __INST(handle) = fp = __MKEXTERNALADDRESS(f); __STORE(self, fp); + // but for that, gcc generates wrong code, which loads self (volatile) into + // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp. + // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old + // object. #else - fp = __MKEXTERNALADDRESS(f); - __INST(handle) = fp; - __STORE(self, fp); + fp = __MKEXTERNALADDRESS(f); + __INST(handle) = fp; + __STORE(self, fp); #endif - } + } } %}. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self openError:error. + lastErrorNumber := error. + ^ self openError:error. ]. handle isNil ifTrue:[ - ^ self openError:0. + ^ self openError:0. ]. position := 0. @@ -1873,12 +1873,12 @@ handle := self openFile:pathName withMode:openmode attributes:attributeSpec. handle isNil ifTrue:[ - "this happens, if proceeding from an OpenError raised in #openFile..." - ^ nil. + "this happens, if proceeding from an OpenError raised in #openFile..." + ^ nil. ]. position := 0. buffered isNil ifTrue:[ - buffered := true. "default is buffered" + buffered := true. "default is buffered" ]. ! @@ -2013,10 +2013,10 @@ unsigned int size; if (__INST(handle) != nil) { - f = __FILEVal(__INST(handle)); - if ((size = filesize(fileno(f))) >= 0) { - RETURN ( __MKUINT(size) ); - } + f = __FILEVal(__INST(handle)); + if ((size = filesize(fileno(f))) >= 0) { + RETURN ( __MKUINT(size) ); + } } #else struct stat buf; @@ -2024,38 +2024,38 @@ int fd; if (__INST(handle) != nil) { - f = __FILEVal(__INST(handle)); - fd = fileno(f); - do { - ret = fstat(fd, &buf); - } while ((ret < 0) && (__threadErrno == EINTR)); - if (ret >= 0) { - OBJ rslt; + f = __FILEVal(__INST(handle)); + fd = fileno(f); + do { + ret = fstat(fd, &buf); + } while ((ret < 0) && (__threadErrno == EINTR)); + if (ret >= 0) { + OBJ rslt; - if (sizeof(buf.st_size) == 8) { - rslt = __MKINT64(&buf.st_size); - } else { - rslt = __MKINT(buf.st_size); - } - RETURN(rslt); - } - error = __mkSmallInteger(__threadErrno); + if (sizeof(buf.st_size) == 8) { + rslt = __MKINT64(&buf.st_size); + } else { + rslt = __MKINT(buf.st_size); + } + RETURN(rslt); + } + error = __mkSmallInteger(__threadErrno); } #endif %}. "could add a fall-back here: - oldPosition := self position. - self setToEnd. - sz := self position. - self position:oldPosition. - ^ sz + oldPosition := self position. + self setToEnd. + sz := self position. + self position:oldPosition. + ^ sz " error notNil ifTrue:[ - lastErrorNumber := error. - self ioError:error. - ^ self. + lastErrorNumber := error. + self ioError:error. + ^ self. ]. handle isNil ifTrue:[^ self errorNotOpen]. ^ self primitiveFailed @@ -2106,11 +2106,11 @@ !FileStream class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.180 2015-03-12 13:52:37 stefan Exp $' + ^ '$Header$' ! version_CVS - ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.180 2015-03-12 13:52:37 stefan Exp $' + ^ '$Header$' ! !