# HG changeset patch # User Jan Vrany # Date 1443764569 -3600 # Node ID 02724cc719b6b779f2bf8d44c5aca32aa755f19f # Parent 237a87b4fe8fbd01cb2219f8e33d1aba9e4122e5# Parent 4ad4472385e5c2a10430ce7af7786c3e9a0bdea5 Merge diff -r 237a87b4fe8f -r 02724cc719b6 CharacterWriteStream.st --- a/CharacterWriteStream.st Thu Oct 01 06:52:24 2015 +0200 +++ b/CharacterWriteStream.st Fri Oct 02 06:42:49 2015 +0100 @@ -41,9 +41,8 @@ documentation " This is a WriteStream, which automagically changes the underlying collection, - if a character does fit into the current collection. - - String -> Unicode16String -> Unicode32Sting + if a character does not fit into the current collection + (i.e. String -> Unicode16String -> Unicode32Sting ) [author:] Stefan Vogel (stefan@zwerg) diff -r 237a87b4fe8f -r 02724cc719b6 Dictionary.st --- a/Dictionary.st Thu Oct 01 06:52:24 2015 +0200 +++ b/Dictionary.st Fri Oct 02 06:42:49 2015 +0100 @@ -1,5 +1,3 @@ -"{ Encoding: utf8 }" - " COPYRIGHT (c) 1991 by Claus Gittinger All Rights Reserved @@ -1025,12 +1023,12 @@ In contrast to #removeKey:, this does not resize the underlying collection and therefore does NOT rehash & change the elements order. - Therefor this can be used while enumerating the receiver, + Therefore this can be used while enumerating the receiver, which is not possible if #removeKey: is used. WARNING: since no resizing is done, the physical amount of memory used by the container remains the same, although the logical size shrinks. - You may want to manually resize the receiver using #emptyCheck." + You may want to manually resize the receiver using #possiblyShrink." |index "{ Class:SmallInteger }" next "{ Class:SmallInteger }" @@ -1124,7 +1122,7 @@ WARNING: since no resizing is done, the physical amount of memory used by the container remains the same, although the logical size shrinks. - You may want to manually resize the receiver using #emptyCheck." + You may want to manually resize the receiver using #possiblyShrink." |next "{ Class:SmallInteger }" oldKey| @@ -2267,10 +2265,10 @@ !Dictionary class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/Dictionary.st,v 1.126 2015-05-15 06:54:25 cg Exp $' + ^ '$Header$' ! version_CVS - ^ '$Header: /cvs/stx/stx/libbasic/Dictionary.st,v 1.126 2015-05-15 06:54:25 cg Exp $' + ^ '$Header$' ! ! diff -r 237a87b4fe8f -r 02724cc719b6 ExternalStream.st --- a/ExternalStream.st Thu Oct 01 06:52:24 2015 +0200 +++ b/ExternalStream.st Fri Oct 02 06:42:49 2015 +0100 @@ -1,6 +1,8 @@ +"{ Encoding: utf8 }" + " COPYRIGHT (c) 1988 by Claus Gittinger - All Rights Reserved + All Rights Reserved This software is furnished under a license and may be used only in accordance with the terms of that license and with the @@ -14,15 +16,15 @@ "{ NameSpace: Smalltalk }" ReadWriteStream subclass:#ExternalStream - instanceVariableNames:'handleType handle mode buffered binary eolMode hitEOF didWrite - lastErrorNumber readAhead' - classVariableNames:'Lobby LastErrorNumber InvalidReadSignal InvalidWriteSignal - InvalidModeSignal OpenErrorSignal StreamNotOpenSignal - InvalidOperationSignal DefaultEOLMode ReadMode ReadWriteMode - WriteMode AppendMode CreateReadWriteMode StreamIOErrorSignal - FileOpenTrace' - poolDictionaries:'' - category:'Streams-External' + instanceVariableNames:'handleType handle mode buffered binary eolMode hitEOF didWrite + lastErrorNumber readAhead' + classVariableNames:'Lobby LastErrorNumber InvalidReadSignal InvalidWriteSignal + InvalidModeSignal OpenErrorSignal StreamNotOpenSignal + InvalidOperationSignal DefaultEOLMode ReadMode ReadWriteMode + WriteMode AppendMode CreateReadWriteMode StreamIOErrorSignal + FileOpenTrace MaxNonTenurableExecutors' + poolDictionaries:'' + category:'Streams-External' ! !ExternalStream primitiveDefinitions! @@ -204,7 +206,7 @@ # define DEBUGBUFFER(buf) \ if (((char *)(buf) >= __survStartPtr) \ && ((char *)(buf) < __survEndPtr)) { \ - __fatal0("read into survivor\n"); \ + __fatal0("read into survivor\n"); \ } #else @@ -227,33 +229,33 @@ // Win returns from ReadFile() with false and _threadErrno == 0 on end of pipe. // We don't know why # define READ(ret, f, cp, n, handleType) { \ - if (handleType == @symbol(socketHandle)) { \ - (ret) = __STX_WSA_NOINT_CALL4("recv", recv, (f), (cp), (n), 0); \ - } else { \ - HANDLE h = _get_osfhandle(fileno(f)); \ - if (handleType == @symbol(socketFilePointer)) { \ - (ret) = __STX_WSA_NOINT_CALL4("recv", recv, h, (cp), (n), 0);\ - } else { \ - int __res; \ - (ret) = __STX_API_NOINT_CALL5("ReadFile", ReadFile, h, (cp), (n), &__res, 0);\ - (ret) = (ret) ? __res : ((__threadErrno == EPIPE || __threadErrno == 0) ? 0 : -1); \ - } \ - } \ + if (handleType == @symbol(socketHandle)) { \ + (ret) = __STX_WSA_NOINT_CALL4("recv", recv, (f), (cp), (n), 0); \ + } else { \ + HANDLE h = _get_osfhandle(fileno(f)); \ + if (handleType == @symbol(socketFilePointer)) { \ + (ret) = __STX_WSA_NOINT_CALL4("recv", recv, h, (cp), (n), 0);\ + } else { \ + int __res; \ + (ret) = __STX_API_NOINT_CALL5("ReadFile", ReadFile, h, (cp), (n), &__res, 0);\ + (ret) = (ret) ? __res : ((__threadErrno == EPIPE || __threadErrno == 0) ? 0 : -1); \ + } \ + } \ } # define WRITE(ret, f, cp, n, handleType) { \ - if (handleType == @symbol(socketHandle)) { \ - (ret) = __STX_WSA_NOINT_CALL4("send", send, (f), (cp), (n), 0); \ - } else {\ - HANDLE h = _get_osfhandle(fileno(f)); \ - if (handleType == @symbol(socketFilePointer)) { \ - (ret) = __STX_WSA_NOINT_CALL4("send", send, h, (cp), (n), 0);\ - } else {\ - int __res; \ - (ret) = __STX_API_NOINT_CALL5("WriteFile", WriteFile, h, (cp), (n), &__res, 0);\ - (ret) = (ret) ? __res : -1; \ - } \ - } \ + if (handleType == @symbol(socketHandle)) { \ + (ret) = __STX_WSA_NOINT_CALL4("send", send, (f), (cp), (n), 0); \ + } else {\ + HANDLE h = _get_osfhandle(fileno(f)); \ + if (handleType == @symbol(socketFilePointer)) { \ + (ret) = __STX_WSA_NOINT_CALL4("send", send, h, (cp), (n), 0);\ + } else {\ + int __res; \ + (ret) = __STX_API_NOINT_CALL5("WriteFile", WriteFile, h, (cp), (n), &__res, 0);\ + (ret) = (ret) ? __res : -1; \ + } \ + } \ } # define FFLUSH(fp) fflush(fp) @@ -264,56 +266,56 @@ # define __READING__(f) \ if ((__INST(didWrite) != false) \ && (__INST(mode) == @symbol(readwrite))) { \ - __INST(didWrite) = false; \ - OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ + __INST(didWrite) = false; \ + OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ } # define __WRITING__(f) \ if ((__INST(didWrite) != true) \ && (__INST(mode) == @symbol(readwrite))) { \ - __INST(didWrite) = true; \ - OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ + __INST(didWrite) = true; \ + OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ } # define __UNGETC__(c, f, isBuffered) \ if (isBuffered) { \ - ungetc((c), (f)); \ + ungetc((c), (f)); \ } else { \ __INST(readAhead) = __mkSmallInteger((c)); \ } # define __READBYTE__(ret, f, buf, isBuffered, handleType) \ if (isBuffered) { \ - for (;;) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) >= 0) { \ - *(buf) = (ret); \ - (ret) = 1; \ - } else if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - clearerr(f); \ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ + for (;;) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) >= 0) { \ + *(buf) = (ret); \ + (ret) = 1; \ + } else if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + clearerr(f); \ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ } else { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - *(buf) = (char)__intVal(rA); \ - __INST(readAhead) = nil; \ - (ret) = 1; \ - } else { \ - for (;;) { \ - CLEAR_ERRNO; \ - READ((ret), f, buf, 1, handleType); \ - if ((ret) >= 0 || __threadErrno != EINTR) \ - break; \ - } \ - } \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + *(buf) = (char)__intVal(rA); \ + __INST(readAhead) = nil; \ + (ret) = 1; \ + } else { \ + for (;;) { \ + CLEAR_ERRNO; \ + READ((ret), f, buf, 1, handleType); \ + if ((ret) >= 0 || __threadErrno != EINTR) \ + break; \ + } \ + } \ } /* @@ -323,110 +325,110 @@ # define __READBYTES__(ret, f, buf, cnt, isBuffered, handleType) \ (ret) = 0; \ if (isBuffered) { \ - int __offs = 0; \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - clearerr(f); \ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - (buf)[__offs++] = (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + clearerr(f); \ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + (buf)[__offs++] = (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - int __offs = 0; \ - \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__offs] = __intVal(rA); \ - __INST(readAhead) = nil; \ - (ret) = 1; \ - } else { \ - CLEAR_ERRNO; \ - READ((ret), f, (buf)+__offs, (cnt)-__offs, handleType); \ - if ((ret) <= 0) { \ - if ((ret) < 0 && __threadErrno == EINTR) { \ - continue; \ - } \ - break; \ - } \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__offs] = __intVal(rA); \ + __INST(readAhead) = nil; \ + (ret) = 1; \ + } else { \ + CLEAR_ERRNO; \ + READ((ret), f, (buf)+__offs, (cnt)-__offs, handleType); \ + if ((ret) <= 0) { \ + if ((ret) < 0 && __threadErrno == EINTR) { \ + continue; \ + } \ + break; \ + } \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } # define __READAVAILBYTES__(ret, f, buf, cnt, isBuffered, handleType) \ { \ int __offs = 0; \ int oldFlags; \ - \ + \ (ret) = 0; \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - clearerr(f); \ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - (buf)[__offs++] = (ret); \ - } \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + clearerr(f); \ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + (buf)[__offs++] = (ret); \ + } \ + (ret) = __offs; \ } else { \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__offs] = __intVal(rA); \ - __INST(readAhead) = nil; \ - (ret) = 1; \ - __offs ++; \ - continue; \ - } \ - CLEAR_ERRNO; \ - { \ - int res = 0; \ - if ((handleType == @symbol(socketFilePointer) && (ioctlsocket((SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res), 1)) \ - || (handleType == @symbol(socketHandle) && (ioctlsocket((SOCKET)(f), FIONREAD, &res), 1)) \ - || (handleType == @symbol(pipeFilePointer) && (PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0, 0,0,&res,0), 1))) { \ - if (res > 0) { \ - if (res > ((cnt)-__offs)) \ - res = (cnt)-__offs; \ - READ((ret), f, (buf)+__offs, res, handleType); \ - } else { \ - (ret) = 0; \ - break; \ - } \ - } else { \ - READ((ret), f, (buf)+__offs, (cnt)-__offs, handleType); \ - } \ - } \ - if ((ret) <= 0) { \ - if (ret < 0 && __threadErrno == EINTR) \ - continue; \ - break; \ - } \ - __offs += (ret); \ - } \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__offs] = __intVal(rA); \ + __INST(readAhead) = nil; \ + (ret) = 1; \ + __offs ++; \ + continue; \ + } \ + CLEAR_ERRNO; \ + { \ + int res = 0; \ + if ((handleType == @symbol(socketFilePointer) && (ioctlsocket((SOCKET)_get_osfhandle(fileno(f)),FIONREAD,&res), 1)) \ + || (handleType == @symbol(socketHandle) && (ioctlsocket((SOCKET)(f), FIONREAD, &res), 1)) \ + || (handleType == @symbol(pipeFilePointer) && (PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0, 0,0,&res,0), 1))) { \ + if (res > 0) { \ + if (res > ((cnt)-__offs)) \ + res = (cnt)-__offs; \ + READ((ret), f, (buf)+__offs, res, handleType); \ + } else { \ + (ret) = 0; \ + break; \ + } \ + } else { \ + READ((ret), f, (buf)+__offs, (cnt)-__offs, handleType); \ + } \ + } \ + if ((ret) <= 0) { \ + if (ret < 0 && __threadErrno == EINTR) \ + continue; \ + break; \ + } \ + __offs += (ret); \ + } \ + (ret) = __offs; \ } \ } @@ -437,63 +439,63 @@ int __ooffs = obj_offs; \ int __offs = 0; \ char *buf = (char *)(obj); \ - \ + \ (ret) = 0; \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - clearerr(f); \ - /* refetch */ \ - buf = (char *)(obj); \ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - (buf)[__ooffs+__offs] = (ret); \ - __offs++; \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + clearerr(f); \ + /* refetch */ \ + buf = (char *)(obj); \ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + (buf)[__ooffs+__offs] = (ret); \ + __offs++; \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - while (__offs < (cnt)) { \ - char __buf[IO_BUFFER_SIZE]; \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__ooffs+__offs] = __intVal(rA); \ - __INST(readAhead) = nil; \ - (ret) = 1; \ - } else { \ - int l; \ - CLEAR_ERRNO; \ - l = (cnt)-__offs; \ - if ( l > IO_BUFFER_SIZE) \ - l = IO_BUFFER_SIZE; \ - READ((ret),f, __buf, l, handleType); \ - if ((ret) <= 0) { \ - if ((ret) < 0 && __threadErrno == EINTR) { \ - continue; \ - } \ - break; \ - } \ - } \ - if ((ret) > 0 ) { \ - /* refetch */ \ - buf = (char *)(obj); \ - memcpy((buf)+__ooffs+__offs,__buf,(ret)); \ - __offs += (ret); \ - } else { \ - (ret) = 0; \ - } \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + char __buf[IO_BUFFER_SIZE]; \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__ooffs+__offs] = __intVal(rA); \ + __INST(readAhead) = nil; \ + (ret) = 1; \ + } else { \ + int l; \ + CLEAR_ERRNO; \ + l = (cnt)-__offs; \ + if ( l > IO_BUFFER_SIZE) \ + l = IO_BUFFER_SIZE; \ + READ((ret),f, __buf, l, handleType); \ + if ((ret) <= 0) { \ + if ((ret) < 0 && __threadErrno == EINTR) { \ + continue; \ + } \ + break; \ + } \ + } \ + if ((ret) > 0 ) { \ + /* refetch */ \ + buf = (char *)(obj); \ + memcpy((buf)+__ooffs+__offs,__buf,(ret)); \ + __offs += (ret); \ + } else { \ + (ret) = 0; \ + } \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ } @@ -502,141 +504,141 @@ int __ooffs = obj_offs; \ int __offs = 0; \ char *buf = (char *)(obj); \ - \ + \ (ret) = 0; \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - clearerr(f); \ - /* refetch */ \ - buf = (char *)(obj);\ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - (buf)[__ooffs+__offs] = (ret); \ - __offs++; \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + clearerr(f); \ + /* refetch */ \ + buf = (char *)(obj);\ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + (buf)[__ooffs+__offs] = (ret); \ + __offs++; \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - while (__offs < (cnt)) { \ - char __buf[IO_BUFFER_SIZE]; \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__ooffs+__offs] = __intVal(rA);\ - __INST(readAhead) = nil; \ - (ret) = 1; \ - __offs++; \ - continue; \ - } \ - { \ - int res = 0; \ - int l = (cnt)-__offs; \ - CLEAR_ERRNO; \ - if (l > IO_BUFFER_SIZE) \ - l = IO_BUFFER_SIZE; \ - if ((handleType == @symbol(socketFilePointer) && (ioctlsocket((SOCKET)_get_osfhandle(fileno(f)), FIONREAD, &res), 1)) \ - || (handleType == @symbol(socketHandle) && (ioctlsocket((SOCKET)(f), FIONREAD, &res), 1)) \ - || (handleType == @symbol(pipeFilePointer) && (PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0,0,0,&res,0), 1))) { \ - if (res > 0) { \ - if (res > l) res = l; \ - READ((ret), f, __buf, res, handleType); \ - } else { \ - (ret) = 0; \ - break; \ - } \ - } else { \ - READ((ret), f, __buf, l, handleType); \ - } \ - if ((ret) <= 0) { \ - if (ret < 0 && __threadErrno == EINTR) \ - continue; \ - break; \ - } \ - } \ - if ((ret) > 0) { \ - buf = (char *)(obj); \ - memcpy((buf)+__ooffs+__offs, __buf, (ret)); \ - __offs += (ret); \ - } else { \ - (ret) = 0; \ - } \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + char __buf[IO_BUFFER_SIZE]; \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__ooffs+__offs] = __intVal(rA);\ + __INST(readAhead) = nil; \ + (ret) = 1; \ + __offs++; \ + continue; \ + } \ + { \ + int res = 0; \ + int l = (cnt)-__offs; \ + CLEAR_ERRNO; \ + if (l > IO_BUFFER_SIZE) \ + l = IO_BUFFER_SIZE; \ + if ((handleType == @symbol(socketFilePointer) && (ioctlsocket((SOCKET)_get_osfhandle(fileno(f)), FIONREAD, &res), 1)) \ + || (handleType == @symbol(socketHandle) && (ioctlsocket((SOCKET)(f), FIONREAD, &res), 1)) \ + || (handleType == @symbol(pipeFilePointer) && (PeekNamedPipe((HANDLE)_get_osfhandle(fileno(f)),0,0,0,&res,0), 1))) { \ + if (res > 0) { \ + if (res > l) res = l; \ + READ((ret), f, __buf, res, handleType); \ + } else { \ + (ret) = 0; \ + break; \ + } \ + } else { \ + READ((ret), f, __buf, l, handleType); \ + } \ + if ((ret) <= 0) { \ + if (ret < 0 && __threadErrno == EINTR) \ + continue; \ + break; \ + } \ + } \ + if ((ret) > 0) { \ + buf = (char *)(obj); \ + memcpy((buf)+__ooffs+__offs, __buf, (ret)); \ + __offs += (ret); \ + } else { \ + (ret) = 0; \ + } \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ } # define __WRITEBYTE__(ret, f, buf, isBuffered, handleType) \ if (isBuffered) { \ - for (;;) { \ - CLEAR_ERRNO; \ - ret = putc(*(buf), f); \ - if ((ret) >= 0) { \ - (ret) = 1; \ - } else if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - clearerr(f); \ - continue; \ - } \ - } else \ - (ret) = 0; \ - break; \ - } \ + for (;;) { \ + CLEAR_ERRNO; \ + ret = putc(*(buf), f); \ + if ((ret) >= 0) { \ + (ret) = 1; \ + } else if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + clearerr(f); \ + continue; \ + } \ + } else \ + (ret) = 0; \ + break; \ + } \ } else { \ - for (;;) { \ - CLEAR_ERRNO; \ - WRITE(ret,f, buf, 1, handleType); \ - if ((ret) >= 0 || __threadErrno != EINTR) \ - break; \ - } \ + for (;;) { \ + CLEAR_ERRNO; \ + WRITE(ret,f, buf, 1, handleType); \ + if ((ret) >= 0 || __threadErrno != EINTR) \ + break; \ + } \ } # define __WRITEBYTES__(ret, f, buf, cnt, isBuffered, handleType) \ (ret) = 0; \ if (isBuffered) { \ - int __offs = 0; \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = fwrite((buf)+__offs, 1, (cnt)-__offs, f);\ - if ((ret) <= 0) { \ - if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - clearerr(f); \ - continue; \ - } \ - break; \ - } else { \ - (ret) = 0; \ - } \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = fwrite((buf)+__offs, 1, (cnt)-__offs, f);\ + if ((ret) <= 0) { \ + if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + clearerr(f); \ + continue; \ + } \ + break; \ + } else { \ + (ret) = 0; \ + } \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - int __offs = 0; \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - WRITE(ret,f, (buf)+__offs, (cnt)-__offs, handleType); \ - if (ret <= 0) { \ - if (ret < 0 && __threadErrno == EINTR) { \ - continue; \ - } \ - break; \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + WRITE(ret,f, (buf)+__offs, (cnt)-__offs, handleType); \ + if (ret <= 0) { \ + if (ret < 0 && __threadErrno == EINTR) { \ + continue; \ + } \ + break; \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } # define __WRITEBYTES_OBJ__(ret, f, obj, obj_offs, cnt, isBuffered, handleType) \ @@ -644,51 +646,51 @@ int __ooffs = obj_offs; \ int __offs = 0; \ char *buf = (char *)(obj); \ - \ + \ (ret) = 0; \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - ret = fwrite((buf)+__ooffs+__offs, 1, (cnt)-__offs, f); \ - if ((ret) <= 0) { \ - if (ferror(f)) { \ - if (__threadErrno == EINTR) { \ - /* refetch */ \ - buf = (char *)(obj); \ - clearerr(f); \ - continue; \ - } \ - break; \ - } else { \ - (ret) = 0; \ - } \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + ret = fwrite((buf)+__ooffs+__offs, 1, (cnt)-__offs, f); \ + if ((ret) <= 0) { \ + if (ferror(f)) { \ + if (__threadErrno == EINTR) { \ + /* refetch */ \ + buf = (char *)(obj); \ + clearerr(f); \ + continue; \ + } \ + break; \ + } else { \ + (ret) = 0; \ + } \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - while (__offs < (cnt)) { \ - char __buf[IO_BUFFER_SIZE]; \ - int l; \ - CLEAR_ERRNO; \ - l = (cnt)-__offs; \ - if ( l > IO_BUFFER_SIZE) \ - l = IO_BUFFER_SIZE; \ - /* refetch */ \ - buf = (char *)(obj); \ - memcpy(__buf,(buf)+__ooffs+__offs,l); \ - WRITE(ret,f, __buf, l, handleType); \ - if (ret <= 0) { \ - if (ret < 0 && __threadErrno == EINTR) { \ - continue; \ - } \ - break; \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + char __buf[IO_BUFFER_SIZE]; \ + int l; \ + CLEAR_ERRNO; \ + l = (cnt)-__offs; \ + if ( l > IO_BUFFER_SIZE) \ + l = IO_BUFFER_SIZE; \ + /* refetch */ \ + buf = (char *)(obj); \ + memcpy(__buf,(buf)+__ooffs+__offs,l); \ + WRITE(ret,f, __buf, l, handleType); \ + if (ret <= 0) { \ + if (ret < 0 && __threadErrno == EINTR) { \ + continue; \ + } \ + break; \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ } @@ -699,15 +701,15 @@ # define __READING__(f) \ if ((__INST(didWrite) != false) \ && (__INST(mode) == @symbol(readwrite))) { \ - __INST(didWrite) = false; \ - OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ + __INST(didWrite) = false; \ + OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ } # define __WRITING__(f) \ if ((__INST(didWrite) != true) \ && (__INST(mode) == @symbol(readwrite))) { \ - __INST(didWrite) = true; \ - OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ + __INST(didWrite) = true; \ + OPT_FSEEK(f, 0L, SEEK_CUR); /* needed in stdio */ \ } @@ -717,73 +719,73 @@ # else /* use STDIO */ # define __UNGETC__(c, f, isBuffered) \ if (isBuffered) { \ - ungetc((c), (f)); \ + ungetc((c), (f)); \ } else { \ - __INST(readAhead) = __mkSmallInteger((c)); \ + __INST(readAhead) = __mkSmallInteger((c)); \ } # endif /* use STDIO */ # ifdef NO_STDIO # define __READBYTE__(ret, f, buf, isBuffered, handleType) \ { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - *(buf) = __intVal(rA); \ - DEBUGBUFFER(buf); \ - __INST(readAhead) = nil; \ - (ret) = 1; \ - } else { \ - for (;;) { \ - CLEAR_ERRNO; \ - (ret) = READ(f, buf, 1, handleType); \ - DEBUGBUFFER(buf); \ - if ((ret) >= 0) break; \ - if (errno != EINTR) { \ - break; \ - } \ - __HANDLE_INTERRUPTS__; \ - } \ - } \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + *(buf) = __intVal(rA); \ + DEBUGBUFFER(buf); \ + __INST(readAhead) = nil; \ + (ret) = 1; \ + } else { \ + for (;;) { \ + CLEAR_ERRNO; \ + (ret) = READ(f, buf, 1, handleType); \ + DEBUGBUFFER(buf); \ + if ((ret) >= 0) break; \ + if (errno != EINTR) { \ + break; \ + } \ + __HANDLE_INTERRUPTS__; \ + } \ + } \ } # else /* use STDIO */ # define __READBYTE__(ret, f, buf, isBuffered, handleType) \ if (isBuffered) { \ - for (;;) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) >= 0) { \ - DEBUGBUFFER(buf); \ - *(buf) = (ret); \ - (ret) = 1; \ - } else if (ferror(f)) { \ - if (errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - clearerr(f); \ - continue; \ - } \ - } else \ - (ret) = 0; \ - break; \ - } \ + for (;;) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) >= 0) { \ + DEBUGBUFFER(buf); \ + *(buf) = (ret); \ + (ret) = 1; \ + } else if (ferror(f)) { \ + if (errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + clearerr(f); \ + continue; \ + } \ + } else \ + (ret) = 0; \ + break; \ + } \ } else { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - *(buf) = __intVal(rA); \ - DEBUGBUFFER(buf); \ - __INST(readAhead) = nil; \ - (ret) = 1; \ - } else { \ - for (;;) { \ - CLEAR_ERRNO; \ - (ret) = read(fileno(f), buf, 1); \ - DEBUGBUFFER(buf); \ - if ((ret) >= 0) break; \ - if (errno != EINTR) { \ - break; \ - } \ - __HANDLE_INTERRUPTS__; \ - } \ - } \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + *(buf) = __intVal(rA); \ + DEBUGBUFFER(buf); \ + __INST(readAhead) = nil; \ + (ret) = 1; \ + } else { \ + for (;;) { \ + CLEAR_ERRNO; \ + (ret) = read(fileno(f), buf, 1); \ + DEBUGBUFFER(buf); \ + if ((ret) >= 0) break; \ + if (errno != EINTR) { \ + break; \ + } \ + __HANDLE_INTERRUPTS__; \ + } \ + } \ } # endif /* use STDIO */ @@ -794,84 +796,84 @@ # ifdef NO_STDIO # define __READBYTES__(ret, f, buf, cnt, isBuffered, handleType) \ { \ - int __offs = 0, __cnt; \ - \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__offs] = __intVal(rA); \ - DEBUGBUFFER(buf); \ - __INST(readAhead) = nil; \ - __offs++; \ - } else { \ - CLEAR_ERRNO; \ - __cnt = READ(f, (buf)+__offs, (cnt)-__offs, handleType); \ - DEBUGBUFFER(buf); \ - if (__cnt <= 0) { \ - if (__cnt < 0 && errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - continue; \ - } \ - break; \ - } \ - __offs += __cnt; \ - } \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0, __cnt; \ + \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__offs] = __intVal(rA); \ + DEBUGBUFFER(buf); \ + __INST(readAhead) = nil; \ + __offs++; \ + } else { \ + CLEAR_ERRNO; \ + __cnt = READ(f, (buf)+__offs, (cnt)-__offs, handleType); \ + DEBUGBUFFER(buf); \ + if (__cnt <= 0) { \ + if (__cnt < 0 && errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + continue; \ + } \ + break; \ + } \ + __offs += __cnt; \ + } \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } # else /* use STDIO */ # define __READBYTES__(ret, f, buf, cnt, isBuffered, handleType) \ (ret) = 0; \ if (isBuffered) { \ - int __offs = 0; \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - clearerr(f); \ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - DEBUGBUFFER(buf); \ - (buf)[__offs++] = (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + clearerr(f); \ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + DEBUGBUFFER(buf); \ + (buf)[__offs++] = (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - int __offs = 0, __cnt; \ - int fd = fileno(f); \ - \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - DEBUGBUFFER(buf); \ - (buf)[__offs] = __intVal(rA); \ - __INST(readAhead) = nil; \ - __offs++; \ - } else { \ - CLEAR_ERRNO; \ - __cnt = read(fd, (buf)+__offs, (cnt)-__offs); \ - DEBUGBUFFER(buf); \ - if (__cnt <= 0) { \ - if (__cnt < 0 && errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - continue; \ - } \ - break; \ - } \ - __offs += __cnt; \ - } \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0, __cnt; \ + int fd = fileno(f); \ + \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + DEBUGBUFFER(buf); \ + (buf)[__offs] = __intVal(rA); \ + __INST(readAhead) = nil; \ + __offs++; \ + } else { \ + CLEAR_ERRNO; \ + __cnt = read(fd, (buf)+__offs, (cnt)-__offs); \ + DEBUGBUFFER(buf); \ + if (__cnt <= 0) { \ + if (__cnt < 0 && errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + continue; \ + } \ + break; \ + } \ + __offs += __cnt; \ + } \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } @@ -881,7 +883,7 @@ # if defined(F_GETFL) && defined(F_SETFL) && (defined(O_NONBLOCK) || defined(O_NDELAY) || defined(FNDELAY)) # define SETFLAGS(fd, flags) \ - fcntl(fd, F_SETFL, flags) + fcntl(fd, F_SETFL, flags) # if defined(O_NONBLOCK) # define __STX_NONBLOCK_FLAG O_NONBLOCK @@ -894,13 +896,13 @@ # endif # define SETNONBLOCKING(fd, oldFlags) \ - { \ - int flags = fcntl(fd, F_GETFL, 0); \ - if (flags >= 0) { \ - fcntl(fd, F_SETFL, flags | __STX_NONBLOCK_FLAG); \ - } \ - oldFlags = flags; \ - } + { \ + int flags = fcntl(fd, F_GETFL, 0); \ + if (flags >= 0) { \ + fcntl(fd, F_SETFL, flags | __STX_NONBLOCK_FLAG); \ + } \ + oldFlags = flags; \ + } # else # define SETFLAGS(fd, flags) /* nothing */ # define SETNONBLOCKING(fd, oldFlags) /* nothing */ @@ -910,52 +912,52 @@ { \ int __offs = 0, __cnt; \ int oldFlags; \ - \ + \ (ret) = 0; \ SETNONBLOCKING(fileno(f), oldFlags); \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (errno == EINTR) { \ - (ret) = 0; \ - clearerr(f); \ - break; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - (buf)[__offs++] = (ret); \ - DEBUGBUFFER(buf); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (errno == EINTR) { \ + (ret) = 0; \ + clearerr(f); \ + break; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + (buf)[__offs++] = (ret); \ + DEBUGBUFFER(buf); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - int fd = fileno(f); \ - \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__offs] = __intVal(rA); \ - DEBUGBUFFER(buf); \ - __INST(readAhead) = nil; \ - __offs++; \ - continue; \ - } \ - CLEAR_ERRNO; \ - __cnt = read(fd, (buf)+__offs, (cnt)-__offs); \ - DEBUGBUFFER(buf); \ - if (__cnt > 0) { \ - __offs += __cnt; \ - } \ - break; \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int fd = fileno(f); \ + \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__offs] = __intVal(rA); \ + DEBUGBUFFER(buf); \ + __INST(readAhead) = nil; \ + __offs++; \ + continue; \ + } \ + CLEAR_ERRNO; \ + __cnt = read(fd, (buf)+__offs, (cnt)-__offs); \ + DEBUGBUFFER(buf); \ + if (__cnt > 0) { \ + __offs += __cnt; \ + } \ + break; \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ SETFLAGS(fileno(f), oldFlags); \ } @@ -973,34 +975,34 @@ int __offs = 0; \ int __cnt; \ char *buf = (char *)(obj); \ - \ + \ (ret) = 0; \ { \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__ooffs+__offs] = __intVal(rA); \ - DEBUGBUFFER(buf); \ - __INST(readAhead) = nil; \ - __offs++; \ - } else { \ - CLEAR_ERRNO; \ - __cnt = READ(f, (buf)+__ooffs+__offs, (cnt)-__offs, handleType); \ - DEBUGBUFFER(buf); \ - if (__cnt <= 0) { \ - if (__cnt < 0 && errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - /* refetch */ \ - buf = (char *)(obj); \ - continue; \ - } \ - break; \ - } \ - __offs += __cnt; \ - } \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__ooffs+__offs] = __intVal(rA); \ + DEBUGBUFFER(buf); \ + __INST(readAhead) = nil; \ + __offs++; \ + } else { \ + CLEAR_ERRNO; \ + __cnt = READ(f, (buf)+__ooffs+__offs, (cnt)-__offs, handleType); \ + DEBUGBUFFER(buf); \ + if (__cnt <= 0) { \ + if (__cnt < 0 && errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + /* refetch */ \ + buf = (char *)(obj); \ + continue; \ + } \ + break; \ + } \ + __offs += __cnt; \ + } \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ } @@ -1012,61 +1014,61 @@ int __offs = 0; \ int __cnt; \ char *buf = (char *)(obj); \ - \ + \ (ret) = 0; \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - clearerr(f); \ - /* refetch */ \ - buf = (char *)(obj); \ - DEBUGBUFFER(buf); \ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - (buf)[__ooffs+__offs] = (ret); \ - DEBUGBUFFER(buf); \ - __offs++; \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + clearerr(f); \ + /* refetch */ \ + buf = (char *)(obj); \ + DEBUGBUFFER(buf); \ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + (buf)[__ooffs+__offs] = (ret); \ + DEBUGBUFFER(buf); \ + __offs++; \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - int fd = fileno(f); \ - \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__ooffs+__offs] = __intVal(rA); \ - DEBUGBUFFER(buf); \ - __INST(readAhead) = nil; \ - __offs++; \ - } else { \ - CLEAR_ERRNO; \ - __cnt = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \ - DEBUGBUFFER(buf); \ - if (__cnt <= 0) { \ - if (__cnt < 0 && errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - /* refetch */ \ - buf = (char *)(obj); \ - continue; \ - } \ - break; \ - } \ - __offs += __cnt; \ - } \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int fd = fileno(f); \ + \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__ooffs+__offs] = __intVal(rA); \ + DEBUGBUFFER(buf); \ + __INST(readAhead) = nil; \ + __offs++; \ + } else { \ + CLEAR_ERRNO; \ + __cnt = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \ + DEBUGBUFFER(buf); \ + if (__cnt <= 0) { \ + if (__cnt < 0 && errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + /* refetch */ \ + buf = (char *)(obj); \ + continue; \ + } \ + break; \ + } \ + __offs += __cnt; \ + } \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ } @@ -1077,56 +1079,56 @@ int __cnt; \ char *buf = (char *)(obj); \ int oldFlags; \ - \ + \ (ret) = 0; \ SETNONBLOCKING(fileno(f), oldFlags); \ - \ + \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = getc(f); \ - if ((ret) < 0) { \ - if (ferror(f)) { \ - if (errno == EINTR) { \ - clearerr(f); \ - /* refetch */ \ - buf = (char *)(obj); \ - (ret) = 0; \ - break; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - (buf)[__ooffs+__offs] = (ret); \ - DEBUGBUFFER(buf); \ - __offs++; \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = getc(f); \ + if ((ret) < 0) { \ + if (ferror(f)) { \ + if (errno == EINTR) { \ + clearerr(f); \ + /* refetch */ \ + buf = (char *)(obj); \ + (ret) = 0; \ + break; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + (buf)[__ooffs+__offs] = (ret); \ + DEBUGBUFFER(buf); \ + __offs++; \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - int fd = fileno(f); \ - \ - while (__offs < (cnt)) { \ - OBJ rA = __INST(readAhead); \ - if (rA != nil) { \ - (buf)[__ooffs+__offs] = __intVal(rA); \ - DEBUGBUFFER(buf); \ - __INST(readAhead) = nil; \ - __offs++; \ - continue; \ - } \ - CLEAR_ERRNO; \ - __cnt = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \ - DEBUGBUFFER(buf); \ - if (__cnt > 0) { \ - __offs += __cnt; \ - } \ - break; \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int fd = fileno(f); \ + \ + while (__offs < (cnt)) { \ + OBJ rA = __INST(readAhead); \ + if (rA != nil) { \ + (buf)[__ooffs+__offs] = __intVal(rA); \ + DEBUGBUFFER(buf); \ + __INST(readAhead) = nil; \ + __offs++; \ + continue; \ + } \ + CLEAR_ERRNO; \ + __cnt = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \ + DEBUGBUFFER(buf); \ + if (__cnt > 0) { \ + __offs += __cnt; \ + } \ + break; \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ SETFLAGS(fileno(f), oldFlags); \ } @@ -1136,44 +1138,44 @@ # ifdef NO_STDIO # define __WRITEBYTE__(ret, f, buf, isBuffered, handleType) \ - for (;;) { \ - CLEAR_ERRNO; \ - (ret) = WRITE(f, buf, 1, handleType); \ - if ((ret) >= 0) break; \ - if (errno != EINTR) { \ - break; \ - } \ - __HANDLE_INTERRUPTS__; \ - } + for (;;) { \ + CLEAR_ERRNO; \ + (ret) = WRITE(f, buf, 1, handleType); \ + if ((ret) >= 0) break; \ + if (errno != EINTR) { \ + break; \ + } \ + __HANDLE_INTERRUPTS__; \ + } # else /* use STDIO */ # define __WRITEBYTE__(ret, f, buf, isBuffered, handleType) \ if (isBuffered) { \ - for (;;) { \ - CLEAR_ERRNO; \ - ret = putc(*(buf), f); \ - if ((ret) >= 0) { \ - (ret) = 1; \ - } else if (ferror(f)) { \ - /* SOLARIS/SPARC (2.6) generates spurious errors with errno = 0 */ \ - if (errno == EINTR || errno == 0) { \ - __HANDLE_INTERRUPTS__; \ - clearerr(f); \ - continue; \ - } \ - } else \ - (ret) = 0; \ - break; \ - } \ + for (;;) { \ + CLEAR_ERRNO; \ + ret = putc(*(buf), f); \ + if ((ret) >= 0) { \ + (ret) = 1; \ + } else if (ferror(f)) { \ + /* SOLARIS/SPARC (2.6) generates spurious errors with errno = 0 */ \ + if (errno == EINTR || errno == 0) { \ + __HANDLE_INTERRUPTS__; \ + clearerr(f); \ + continue; \ + } \ + } else \ + (ret) = 0; \ + break; \ + } \ } else { \ - for (;;) { \ - CLEAR_ERRNO; \ - (ret) = write(fileno(f), buf, 1); \ - if ((ret) >= 0) break; \ - if (errno != EINTR) { \ - break; \ - } \ - __HANDLE_INTERRUPTS__; \ - } \ + for (;;) { \ + CLEAR_ERRNO; \ + (ret) = write(fileno(f), buf, 1); \ + if ((ret) >= 0) break; \ + if (errno != EINTR) { \ + break; \ + } \ + __HANDLE_INTERRUPTS__; \ + } \ } # endif /* use STDIO */ @@ -1185,64 +1187,64 @@ # define __WRITEBYTES__(ret, f, buf, cnt, isBuffered, handleType) \ (ret) = 0; \ { \ - int __offs = 0; \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - ret = WRITE(f, (buf)+__offs, (cnt)-__offs, handleType); \ - if (ret <= 0) { \ - if (ret < 0 && errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - continue; \ - } \ - break; \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + ret = WRITE(f, (buf)+__offs, (cnt)-__offs, handleType); \ + if (ret <= 0) { \ + if (ret < 0 && errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + continue; \ + } \ + break; \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } # else /* use STDIO */ # define __WRITEBYTES__(ret, f, buf, cnt, isBuffered, handleType) \ (ret) = 0; \ if (isBuffered) { \ - int __offs = 0; \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = fwrite((buf)+__offs, 1, (cnt)-__offs, f);\ - if ((ret) <= 0) { \ - if (ferror(f)) { \ - if (errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - clearerr(f); \ - continue; \ - } \ - } else { \ - (ret) = 0; \ - } \ - break; \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = fwrite((buf)+__offs, 1, (cnt)-__offs, f);\ + if ((ret) <= 0) { \ + if (ferror(f)) { \ + if (errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + clearerr(f); \ + continue; \ + } \ + } else { \ + (ret) = 0; \ + } \ + break; \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } else { \ - int __offs = 0; \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = write(fileno(f), (buf)+__offs, (cnt)-__offs);\ - if ((ret) <= 0) { \ - if ((ret) < 0) { \ - if (errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - continue; \ - } \ - } \ - break; \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + int __offs = 0; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = write(fileno(f), (buf)+__offs, (cnt)-__offs);\ + if ((ret) <= 0) { \ + if ((ret) < 0) { \ + if (errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + continue; \ + } \ + } \ + break; \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } # endif /* use STDIO */ @@ -1256,25 +1258,25 @@ int __ooffs = obj_offs; \ int __offs = 0; \ char *buf = (char *)(obj); \ - \ + \ (ret) = 0; \ { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - ret = WRITE(f, (buf)+__ooffs+__offs, (cnt)-__offs, handleType); \ - if (ret <= 0) { \ - if (ret < 0 && errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - /* refetch */ \ - buf = (char *)(obj); \ - continue; \ - } \ - break; \ - } \ - __offs += (ret); \ - } \ - if (__offs > 0) \ - (ret) = __offs; \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + ret = WRITE(f, (buf)+__ooffs+__offs, (cnt)-__offs, handleType); \ + if (ret <= 0) { \ + if (ret < 0 && errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + /* refetch */ \ + buf = (char *)(obj); \ + continue; \ + } \ + break; \ + } \ + __offs += (ret); \ + } \ + if (__offs > 0) \ + (ret) = __offs; \ } \ } # else /* use STDIO */ @@ -1283,48 +1285,48 @@ int __ooffs = obj_offs; \ int __offs = 0; \ char *buf = (char *)(obj); \ - \ + \ (ret) = 0; \ if (isBuffered) { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = fwrite((buf)+__ooffs+__offs, 1, (cnt)-__offs, f); \ - if ((ret) <= 0) { \ - if (ferror(f)) { \ - if (errno == EINTR) { \ - __HANDLE_INTERRUPTS__; \ - /* refetch */ \ - buf = (char *)(obj); \ - clearerr(f); \ - continue; \ - } \ - break; \ - } else { \ - (ret) = 0; \ - } \ - } \ - __offs += (ret); \ - } \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = fwrite((buf)+__ooffs+__offs, 1, (cnt)-__offs, f); \ + if ((ret) <= 0) { \ + if (ferror(f)) { \ + if (errno == EINTR) { \ + __HANDLE_INTERRUPTS__; \ + /* refetch */ \ + buf = (char *)(obj); \ + clearerr(f); \ + continue; \ + } \ + break; \ + } else { \ + (ret) = 0; \ + } \ + } \ + __offs += (ret); \ + } \ } else { \ - while (__offs < (cnt)) { \ - CLEAR_ERRNO; \ - (ret) = write(fileno(f), (buf)+__ooffs+__offs, (cnt)-__offs); \ - if ((ret) <= 0) { \ - if ((ret) < 0) { \ - if (errno == EINTR){ \ - __HANDLE_INTERRUPTS__; \ - /* refetch */ \ - buf = (char *)(obj); \ - continue; \ - } \ - } \ - break; \ - } \ - __offs += (ret); \ - } \ + while (__offs < (cnt)) { \ + CLEAR_ERRNO; \ + (ret) = write(fileno(f), (buf)+__ooffs+__offs, (cnt)-__offs); \ + if ((ret) <= 0) { \ + if ((ret) < 0) { \ + if (errno == EINTR){ \ + __HANDLE_INTERRUPTS__; \ + /* refetch */ \ + buf = (char *)(obj); \ + continue; \ + } \ + } \ + break; \ + } \ + __offs += (ret); \ + } \ } \ if (__offs > 0) \ - (ret) = __offs; \ + (ret) = __offs; \ } # endif /* use STDIO */ #endif /* unix */ @@ -1336,7 +1338,7 @@ copyright " COPYRIGHT (c) 1988 by Claus Gittinger - All Rights Reserved + All Rights Reserved This software is furnished under a license and may be used only in accordance with the terms of that license and with the @@ -1386,37 +1388,37 @@ [Instance variables:] - handleType desribes what handle is: - win32: #fileHandle, #socketHandle, - #filePointer, #socketFilePointer, #pipeFilePointer - unix: #filePointer, #socketFilePointer, #pipeFilePointer - needed for win32, which uses different APIs for the different handles (sigh) - handle used to be always a filePointer somehow mapped to an integer (FILE* - not the fd); - now, either a filePointer or a handle (win32) - mode #readwrite, #readonly or #writeonly - buffered true, if buffered (i.e. collects characters - does - not output immediately) - binary true if in binary mode (reads bytes instead of chars) - eolMode one of nil, #nl, #cr or #crlf. - determines how lines should be terminated. - nil -> newLine (as in Unix); - #crlf -> with cr-lf (as in MSDOS) - #cr -> with cr (as in VMS) - hitEOF true, if EOF was reached - - lastErrorNumber the value of errno (only valid right after the error - - updated with next i/o operation) + handleType desribes what handle is: + win32: #fileHandle, #socketHandle, + #filePointer, #socketFilePointer, #pipeFilePointer + unix: #filePointer, #socketFilePointer, #pipeFilePointer + needed for win32, which uses different APIs for the different handles (sigh) + handle used to be always a filePointer somehow mapped to an integer (FILE* - not the fd); + now, either a filePointer or a handle (win32) + mode #readwrite, #readonly or #writeonly + buffered true, if buffered (i.e. collects characters - does + not output immediately) + binary true if in binary mode (reads bytes instead of chars) + eolMode one of nil, #nl, #cr or #crlf. + determines how lines should be terminated. + nil -> newLine (as in Unix); + #crlf -> with cr-lf (as in MSDOS) + #cr -> with cr (as in VMS) + hitEOF true, if EOF was reached + + lastErrorNumber the value of errno (only valid right after the error - + updated with next i/o operation) [Class variables:] - Lobby keeps track of used ext-streams (to free up FILE*'s) - - StreamErrorSignal parent of all stream errors (see Stream class) - InvalidReadSignal raised on read from writeonly stream - InvalidWriteSignal raised on write to readonly stream - InvalidModeSignal raised on text I/O with binary-stream - or binary I/O with text-stream - OpenErrorSignal raised if open fails - StreamNotOpenSignal raised on I/O with non-open stream + Lobby keeps track of used ext-streams (to free up FILE*'s) + + StreamErrorSignal parent of all stream errors (see Stream class) + InvalidReadSignal raised on read from writeonly stream + InvalidWriteSignal raised on write to readonly stream + InvalidModeSignal raised on text I/O with binary-stream + or binary I/O with text-stream + OpenErrorSignal raised if open fails + StreamNotOpenSignal raised on I/O with non-open stream Additional notes: This class is implemented using the underlying stdio-c library package, which @@ -1450,44 +1452,44 @@ fread/fgetc and fwrite/putc respectively. [author:] - Claus Gittinger - Stefan Vogel (many, many fixes ...) + Claus Gittinger + Stefan Vogel (many, many fixes ...) [see also:] - FileStream Socket PipeStream - Filename OperatingSystem + FileStream Socket PipeStream + Filename OperatingSystem " ! examples " open a file, read the contents and display it in a textView: - [exBegin] - |topView scrollPane textView fileStream text| - - topView := StandardSystemView new. - topView label:'contents of Makefile'. - - scrollPane := HVScrollableView in:topView. - scrollPane origin:0.0@0.0 corner:1.0@1.0. - - textView := EditTextView new. - scrollPane scrolledView:textView. - - fileStream := 'Makefile' asFilename readStream. - text := fileStream upToEnd. - fileStream close. - - textView contents:text. - - topView open. - [exEnd] + [exBegin] + |topView scrollPane textView fileStream text| + + topView := StandardSystemView new. + topView label:'contents of Makefile'. + + scrollPane := HVScrollableView in:topView. + scrollPane origin:0.0@0.0 corner:1.0@1.0. + + textView := EditTextView new. + scrollPane scrolledView:textView. + + fileStream := 'Makefile' asFilename readStream. + text := fileStream upToEnd. + fileStream close. + + textView contents:text. + + topView open. + [exEnd] Notice, all of the above can also be done (simply) as: - [exBegin] - EditTextView openOn:'Makefile' - [exEnd] + [exBegin] + EditTextView openOn:'Makefile' + [exEnd] " ! ! @@ -1498,25 +1500,25 @@ To be called on exit of Smalltalk." Lobby do:[:eachFileStream | - eachFileStream close + eachFileStream close ]. ! initDefaultEOLMode OperatingSystem isUNIXlike ifTrue:[ - "/ unix EOL conventions - DefaultEOLMode := #nl + "/ unix EOL conventions + DefaultEOLMode := #nl ] ifFalse:[ - OperatingSystem isVMSlike ifTrue:[ - "/ vms EOL conventions - DefaultEOLMode := #cr - ] ifFalse:[ - "/ msdos EOL conventions - "/ msdos uses #crlf. but we keep #nl here, - "/ otherwise sending HTTP request over sockets fails + OperatingSystem isVMSlike ifTrue:[ + "/ vms EOL conventions + DefaultEOLMode := #cr + ] ifFalse:[ + "/ msdos EOL conventions + "/ msdos uses #crlf. but we keep #nl here, + "/ otherwise sending HTTP request over sockets fails "/ DefaultEOLMode := #crlf - DefaultEOLMode := #nl - ] + DefaultEOLMode := #nl + ] ] ! @@ -1525,56 +1527,60 @@ fopen/fdopen functions." OperatingSystem isMSDOSlike ifTrue:[ - ReadMode := 'rb'. - ReadWriteMode := 'rb+'. - WriteMode := 'wb'. - AppendMode := 'ab+'. - CreateReadWriteMode := 'wb+'. + ReadMode := 'rb'. + ReadWriteMode := 'rb+'. + WriteMode := 'wb'. + AppendMode := 'ab+'. + CreateReadWriteMode := 'wb+'. ] ifFalse:[ - ReadMode := 'r'. - ReadWriteMode := 'r+'. - WriteMode := 'w'. - AppendMode := 'a+'. - CreateReadWriteMode := 'w+'. + ReadMode := 'r'. + ReadWriteMode := 'r+'. + WriteMode := 'w'. + AppendMode := 'a+'. + CreateReadWriteMode := 'w+'. ] ! initialize OpenErrorSignal isNil ifTrue:[ - OpenErrorSignal := OpenError. - OpenErrorSignal notifierString:'open error'. - - InvalidReadSignal := InvalidReadError. - InvalidReadSignal notifierString:'stream does not support reading'. - - InvalidWriteSignal := InvalidWriteError. - InvalidWriteSignal notifierString:'stream does not support writing'. - - InvalidModeSignal := InvalidModeError. - InvalidModeSignal notifierString:'binary/text mode mismatch'. - - InvalidOperationSignal := InvalidOperationError. - InvalidOperationSignal notifierString:'unsupported file operation'. - - StreamNotOpenSignal := StreamNotOpenError. - StreamNotOpenSignal notifierString:'stream is not open'. - - StreamIOErrorSignal := StreamIOError. - StreamIOErrorSignal notifierString:'I/O error'. + OpenErrorSignal := OpenError. + OpenErrorSignal notifierString:'open error'. + + InvalidReadSignal := InvalidReadError. + InvalidReadSignal notifierString:'stream does not support reading'. + + InvalidWriteSignal := InvalidWriteError. + InvalidWriteSignal notifierString:'stream does not support writing'. + + InvalidModeSignal := InvalidModeError. + InvalidModeSignal notifierString:'binary/text mode mismatch'. + + InvalidOperationSignal := InvalidOperationError. + InvalidOperationSignal notifierString:'unsupported file operation'. + + StreamNotOpenSignal := StreamNotOpenError. + StreamNotOpenSignal notifierString:'stream is not open'. + + StreamIOErrorSignal := StreamIOError. + StreamIOErrorSignal notifierString:'I/O error'. ]. Lobby isNil ifTrue:[ - Lobby := Registry new. - - "want to get informed when returning from snapshot" - ObjectMemory addDependent:self + Lobby := Registry new. + + "want to get informed when returning from snapshot" + ObjectMemory addDependent:self ]. DefaultEOLMode isNil ifTrue:[ - self initDefaultEOLMode. + self initDefaultEOLMode. ]. ReadMode isNil ifTrue:[ - self initModeStrings. + self initModeStrings. ]. + + "limit the amount of newspace to be used for non-tenurable executors to 5%" + MaxNonTenurableExecutors := ObjectMemory newSpaceSize // (Socket sizeOfInst:0) // 20. + "Modified: / 21.5.1998 / 16:33:53 / cg" ! @@ -1583,7 +1589,7 @@ This is invoked via the #earlyRestart change notification." Lobby do:[:eachFileStream | - eachFileStream reOpen + eachFileStream reOpen ]. ! @@ -1591,8 +1597,8 @@ "have to reopen files when returning from snapshot" something == #earlyRestart ifTrue:[ - self reOpenFiles. - self initDefaultEOLMode + self reOpenFiles. + self initDefaultEOLMode ] "Created: 15.6.1996 / 15:19:59 / cg" @@ -1702,18 +1708,18 @@ 'read ...'. [ - 1 to:10 do:[:i | - Transcript showCR:rs nextLine - ]. - rs close. + 1 to:10 do:[:i | + Transcript showCR:rs nextLine + ]. + rs close. ] forkAt:7. 'write ...'. [ - 1 to:10 do:[:i | - ws nextPutAll:'hello world '; nextPutAll:i printString; cr - ]. - ws close. + 1 to:10 do:[:i | + ws nextPutAll:'hello world '; nextPutAll:i printString; cr + ]. + ws close. ] fork. " @@ -1841,16 +1847,16 @@ Report it via an Exception" anErrorSymbolOrNumber isInteger ifTrue:[ - StreamError - raiseRequestWith:anErrorSymbolOrNumber - errorString:(' - os error:' , (OperatingSystem errorTextForNumber:anErrorSymbolOrNumber)) + StreamError + raiseRequestWith:anErrorSymbolOrNumber + errorString:(' - os error:' , (OperatingSystem errorTextForNumber:anErrorSymbolOrNumber)) ]. (self respondsTo:anErrorSymbolOrNumber) ifTrue:[ - self perform:anErrorSymbolOrNumber + self perform:anErrorSymbolOrNumber ] ifFalse:[ - StreamError - raiseRequestWith:anErrorSymbolOrNumber - errorString:(' - ' , anErrorSymbolOrNumber printString) + StreamError + raiseRequestWith:anErrorSymbolOrNumber + errorString:(' - ' , anErrorSymbolOrNumber printString) ]. ^ false ! ! @@ -1958,42 +1964,42 @@ |text l chunks sizes chunk byteCount cnt bytes offset| binary ifTrue:[ - "adding to a ByteArray produces quadratic time-space - behavior - therefore we allocate chunks, and concatenate them - at the end." - - chunks := OrderedCollection new. - sizes := OrderedCollection new. - byteCount := 0. - [self atEnd] whileFalse:[ - chunk := ByteArray uninitializedNew:4096. - cnt := self nextBytes:(chunk size) into:chunk. - cnt notNil ifTrue:[ - chunks add:chunk. - sizes add:cnt. - byteCount := byteCount + cnt - ] - ]. - - "now, create one big ByteArray" - bytes := ByteArray uninitializedNew:byteCount. - offset := 1. - 1 to:chunks size do:[:index | - chunk := chunks at:index. - cnt := sizes at:index. - bytes replaceFrom:offset to:(offset + cnt - 1) with:chunk. - offset := offset + cnt - ]. - ^ bytes + "adding to a ByteArray produces quadratic time-space + behavior - therefore we allocate chunks, and concatenate them + at the end." + + chunks := OrderedCollection new. + sizes := OrderedCollection new. + byteCount := 0. + [self atEnd] whileFalse:[ + chunk := ByteArray uninitializedNew:4096. + cnt := self nextBytes:(chunk size) into:chunk. + cnt notNil ifTrue:[ + chunks add:chunk. + sizes add:cnt. + byteCount := byteCount + cnt + ] + ]. + + "now, create one big ByteArray" + bytes := ByteArray uninitializedNew:byteCount. + offset := 1. + 1 to:chunks size do:[:index | + chunk := chunks at:index. + cnt := sizes at:index. + bytes replaceFrom:offset to:(offset + cnt - 1) with:chunk. + offset := offset + cnt + ]. + ^ bytes ]. text := StringCollection new. [self atEnd] whileFalse:[ - l := self nextLine. - l isNil ifTrue:[ - ^ text - ]. - text add:l + l := self nextLine. + l isNil ifTrue:[ + ^ text + ]. + text add:l ]. ^ text ! @@ -2010,7 +2016,7 @@ See also #contents, which returns the lines as stringCollection for text files." binary ifTrue:[ - ^ self contents. + ^ self contents. ]. ^ self upToEnd @@ -2023,7 +2029,7 @@ (such as upTo)" binary == true ifTrue:[ - ^ ByteArray + ^ ByteArray ]. ^ String ! @@ -2031,10 +2037,10 @@ eolMode "return how end-of-line (EOL) is to be marked. Returns one one of: - #crlf -> add a CR-NL, as in MSDOS - #cr -> add a CR, as in VMS - #nl -> add a NL, as in Unix - nil -> transparent + #crlf -> add a CR-NL, as in MSDOS + #cr -> add a CR, as in VMS + #nl -> add a NL, as in Unix + nil -> transparent " ^ eolMode @@ -2043,20 +2049,20 @@ eolMode:aSymbolOrNil "specify how end-of-line (EOL) is to be marked. The argument may be one of: - #crlf -> add a CR-NL, as in MSDOS - #cr -> add a CR, as in VMS - #nl -> add a NL, as in Unix - anyOther -> like #nl + #crlf -> add a CR-NL, as in MSDOS + #cr -> add a CR, as in VMS + #nl -> add a NL, as in Unix + anyOther -> like #nl " aSymbolOrNil == #crnl ifTrue:[ - eolMode := #crlf + eolMode := #crlf ] ifFalse:[ - aSymbolOrNil == #lf ifTrue:[ - eolMode := #nl - ] ifFalse:[ - eolMode := aSymbolOrNil - ] + aSymbolOrNil == #lf ifTrue:[ + eolMode := #nl + ] ifFalse:[ + eolMode := aSymbolOrNil + ] ]. ! @@ -2069,14 +2075,14 @@ OBJ _handle = __INST(handle); if (_handle != nil) { - if (__INST(handleType) == @symbol(socketHandle)) { - RETURN (_handle); - } else if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) { - RETURN ( __MKINT(fileno(__FILEVal(_handle)))); - } + if (__INST(handleType) == @symbol(socketHandle)) { + RETURN (_handle); + } else if ((__INST(handleType) == nil) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { + RETURN ( __MKINT(fileno(__FILEVal(_handle)))); + } } %}. handle isNil ifTrue:[^ self errorNotOpen]. @@ -2105,20 +2111,20 @@ OBJ _handle = __INST(handle); if (_handle != nil) { - if ((__INST(handleType) == @symbol(fileHandle)) - || (__INST(handleType) == @symbol(socketHandle))) { - RETURN (_handle); - } - if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) { + if ((__INST(handleType) == @symbol(fileHandle)) + || (__INST(handleType) == @symbol(socketHandle))) { + RETURN (_handle); + } + if ((__INST(handleType) == nil) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { #ifdef WIN32 - RETURN(__MKEXTERNALADDRESS(_get_osfhandle(fileno(__FILEVal(_handle))))); + RETURN(__MKEXTERNALADDRESS(_get_osfhandle(fileno(__FILEVal(_handle))))); #else - RETURN (__MKINT(fileno(__FILEVal(_handle)))); + RETURN (__MKINT(fileno(__FILEVal(_handle)))); #endif - } + } } %}. handle isNil ifTrue:[^ self errorNotOpen]. @@ -2134,7 +2140,7 @@ - except passing it to a primitive, for example." (handleType isNil or:[handleType == #filePointer]) ifTrue:[ - ^ handle + ^ handle ]. ^ self error:'not a FILE*' ! @@ -2186,9 +2192,9 @@ which offers another choice." aBoolean ifTrue:[ - eolMode := #crlf + eolMode := #crlf ] ifFalse:[ - eolMode := #nl + eolMode := #nl ]. ! @@ -2278,8 +2284,8 @@ "report an error, that the stream is already opened" ^ OpenError - raiseRequestWith:self - errorString:' - stream is already open' + raiseRequestWith:self + errorString:' - stream is already open' " self new errorAlreadyOpen @@ -2294,9 +2300,9 @@ "report an error, that the stream is in binary mode" ^ InvalidModeError - raiseRequestWith:self - errorString:(self class name , ' is in binary mode') - "/ in:thisContext sender + raiseRequestWith:self + errorString:(self class name , ' is in binary mode') + "/ in:thisContext sender "Modified: / 8.5.1999 / 20:12:43 / cg" ! @@ -2307,9 +2313,9 @@ "report an error, that the stream is not in binary mode" ^ InvalidModeError - raiseRequestWith:self - errorString:(self class name , ' is not in binary mode') - "/ in:thisContext sender + raiseRequestWith:self + errorString:(self class name , ' is not in binary mode') + "/ in:thisContext sender "Modified: / 8.5.1999 / 20:12:40 / cg" ! @@ -2320,9 +2326,9 @@ "report an error, that the stream is not in buffered mode" ^ StreamError - raiseRequestWith:self - errorString:(self class name , ' is unbuffered - operation not allowed') - "/ in:thisContext sender + raiseRequestWith:self + errorString:(self class name , ' is unbuffered - operation not allowed') + "/ in:thisContext sender "Modified: / 8.5.1999 / 20:12:36 / cg" ! @@ -2393,10 +2399,10 @@ "{ Pragma: +optSpace }" ^ StreamIOError newException - errorCode:errorNumber; - osErrorHolder:(OperatingSystem errorHolderForNumber:errorNumber); - parameter:self; - raiseRequest + errorCode:errorNumber; + osErrorHolder:(OperatingSystem errorHolderForNumber:errorNumber); + parameter:self; + raiseRequest "Modified: / 8.5.1999 / 20:12:16 / cg" ! @@ -2411,7 +2417,7 @@ "return a message string describing the last error" (lastErrorNumber isNil or:[lastErrorNumber == 0]) ifTrue:[ - ^ 'I/O error' + ^ 'I/O error' ]. ^ OperatingSystem errorTextForNumber:lastErrorNumber ! @@ -2440,17 +2446,17 @@ errorHolder := OperatingSystem errorHolderForNumber:errorNumber. exClass := (errorHolder errorCategory == #nonexistentSignal) - ifTrue:[ FileDoesNotExistException ] - ifFalse:[ OpenError ]. + ifTrue:[ FileDoesNotExistException ] + ifFalse:[ OpenError ]. ^ exClass newException - errorCode:errorNumber; - osErrorHolder:errorHolder; - "/ cg: initialized lazyly - see OpenError>>#description - "/ errorString:(' : ' , errorHolder errorString); - parameter:self; - raiseRequest - "/ in:thisContext sender + errorCode:errorNumber; + osErrorHolder:errorHolder; + "/ cg: initialized lazyly - see OpenError>>#description + "/ errorString:(' : ' , errorHolder errorString); + parameter:self; + raiseRequest + "/ in:thisContext sender "Modified: / 09-09-2011 / 07:22:49 / cg" ! @@ -2469,10 +2475,10 @@ "{ Pragma: +optSpace }" ^ ReadError newException - errorCode:errorNumber; - osErrorHolder:(OperatingSystem errorHolderForNumber:errorNumber); - parameter:self; - raiseRequest + errorCode:errorNumber; + osErrorHolder:(OperatingSystem errorHolderForNumber:errorNumber); + parameter:self; + raiseRequest ! writeError @@ -2489,10 +2495,10 @@ "{ Pragma: +optSpace }" ^ WriteError newException - errorCode:errorNumber; - osErrorHolder:(OperatingSystem errorHolderForNumber:errorNumber); - parameter:self; - raiseRequest + errorCode:errorNumber; + osErrorHolder:(OperatingSystem errorHolderForNumber:errorNumber); + parameter:self; + raiseRequest ! ! !ExternalStream methodsFor:'finalization'! @@ -2517,7 +2523,7 @@ "/ with timeout to avoid blocking in a bad pty/socket [ - self closeFile + self closeFile ] valueWithTimeout:30 seconds. ! @@ -2528,14 +2534,16 @@ registerForFinalization "keep myself in newSpace, so it will be finalized early" - ObjectMemory preventTenureOf:self. + Lobby size < MaxNonTenurableExecutors ifTrue:[ + ObjectMemory preventTenureOf:self. + ]. Lobby register:self. ! unregisterForFinalization Lobby unregister:self. "probably the object will be collected soon..." - ObjectMemory setAgeOf:self to:0. + ObjectMemory allowTenureOf:self ! ! !ExternalStream methodsFor:'initialization'! @@ -2577,129 +2585,129 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - && (__INST(binary) != true) - ) { - f = __FILEVal(fp); - buffer[0] = '\0'; - - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f); - } - - rslt = nextPtr = buffer; - limit = buffer + sizeof(buffer) - 2; - - for (;;) { - __READBYTE__(ret, f, nextPtr, _buffered, __INST(handleType)); - if (ret <= 0) { - if (nextPtr == buffer) - rslt = NULL; - if (ret == 0) { - __INST(hitEOF) = true; - break; - } else { - error = __mkSmallInteger(__threadErrno); - goto err; - } - } - - if (*nextPtr == '\n') { - cutOff = 1; - *nextPtr = '\0'; - break; - } - if (*nextPtr == '\r') { - char peekChar; - - /* - * peek ahead for a newLine ... - */ - __READBYTE__(ret, f, &peekChar, _buffered, __INST(handleType)); - if (ret <= 0) { - cutOff = 1; - *nextPtr = '\0'; - if (ret == 0) { - __INST(hitEOF) = true; - break; - } - error = __mkSmallInteger(__threadErrno); - goto err; - } - - if (peekChar == '\n') { - cutOff = 2; - *nextPtr = '\0'; - break; - } - - __UNGETC__(peekChar, f, _buffered); - - cutOff = 1; - *nextPtr = '\0'; - break; - } - - nextPtr++; - if (nextPtr >= limit) { - *nextPtr = '\0'; - lineTooLong = 1; - if (@global(InfoPrinting) == true) { - fprintf(stderr, "ExtStream [warning]: line truncated in nextLine\n"); - } - break; - } - } - - if (rslt != NULL) { - len = nextPtr-buffer; - - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + len + cutOff; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - /* remove any EOL character */ - if (len != 0) { - if (buffer[len-1] == '\n') { - buffer[--len] = '\0'; - } - if ((len != 0) && (buffer[len-1] == '\r')) { - buffer[--len] = '\0'; - } - } - line = __MKSTRING_L(buffer, len); - if (! lineTooLong) { - RETURN ( line ); - } - } - } + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + && (__INST(binary) != true) + ) { + f = __FILEVal(fp); + buffer[0] = '\0'; + + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f); + } + + rslt = nextPtr = buffer; + limit = buffer + sizeof(buffer) - 2; + + for (;;) { + __READBYTE__(ret, f, nextPtr, _buffered, __INST(handleType)); + if (ret <= 0) { + if (nextPtr == buffer) + rslt = NULL; + if (ret == 0) { + __INST(hitEOF) = true; + break; + } else { + error = __mkSmallInteger(__threadErrno); + goto err; + } + } + + if (*nextPtr == '\n') { + cutOff = 1; + *nextPtr = '\0'; + break; + } + if (*nextPtr == '\r') { + char peekChar; + + /* + * peek ahead for a newLine ... + */ + __READBYTE__(ret, f, &peekChar, _buffered, __INST(handleType)); + if (ret <= 0) { + cutOff = 1; + *nextPtr = '\0'; + if (ret == 0) { + __INST(hitEOF) = true; + break; + } + error = __mkSmallInteger(__threadErrno); + goto err; + } + + if (peekChar == '\n') { + cutOff = 2; + *nextPtr = '\0'; + break; + } + + __UNGETC__(peekChar, f, _buffered); + + cutOff = 1; + *nextPtr = '\0'; + break; + } + + nextPtr++; + if (nextPtr >= limit) { + *nextPtr = '\0'; + lineTooLong = 1; + if (@global(InfoPrinting) == true) { + fprintf(stderr, "ExtStream [warning]: line truncated in nextLine\n"); + } + break; + } + } + + if (rslt != NULL) { + len = nextPtr-buffer; + + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + len + cutOff; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + /* remove any EOL character */ + if (len != 0) { + if (buffer[len-1] == '\n') { + buffer[--len] = '\0'; + } + if ((len != 0) && (buffer[len-1] == '\r')) { + buffer[--len] = '\0'; + } + } + line = __MKSTRING_L(buffer, len); + if (! lineTooLong) { + RETURN ( line ); + } + } + } } err: ; %}. line notNil ifTrue:[ - "/ the line as read is longer than 32k characters (boy - what a line) - "/ The exception could be handled by reading more and returning the - "/ concatenation in your exception handler (the receiver and the partial - "/ line are passed as parameter) - - LineTooLongErrorSignal isHandled ifTrue:[ - ^ LineTooLongErrorSignal - raiseRequestWith:(Array with:self with:line) - errorString:('line too long read error') - ]. - ^ line , self nextLine + "/ the line as read is longer than 32k characters (boy - what a line) + "/ The exception could be handled by reading more and returning the + "/ concatenation in your exception handler (the receiver and the partial + "/ line are passed as parameter) + + LineTooLongErrorSignal isHandled ifTrue:[ + ^ LineTooLongErrorSignal + raiseRequestWith:(Array with:self with:line) + errorString:('line too long read error') + ]. + ^ line , self nextLine ]. (hitEOF == true) ifTrue:[^ self pastEndRead]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error + lastErrorNumber := error. + ^ self readError:error ]. handle isNil ifTrue:[^ self errorNotOpen]. (mode == #writeonly) ifTrue:[^ self errorWriteOnly]. @@ -2721,74 +2729,74 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - && (__INST(binary) != true) - && __isStringLike(aString) - ) { - int _buffered = (__INST(buffered) == true); - int len = __stringSize(aString); - int cnt, len1; - FILEPOINTER f = __FILEVal(fp); - char *cp; - int o_offs; - - if (_buffered) { - __WRITING__(f) - } + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + && (__INST(binary) != true) + && __isStringLike(aString) + ) { + int _buffered = (__INST(buffered) == true); + int len = __stringSize(aString); + int cnt, len1; + FILEPOINTER f = __FILEVal(fp); + char *cp; + int o_offs; + + if (_buffered) { + __WRITING__(f) + } #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(__stringVal(aString), 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(__stringVal(aString), 1, len, f); + } else #endif - { - o_offs = (char *)__stringVal(aString)-(char *)aString; - __WRITEBYTES_OBJ__(cnt, f, aString, o_offs, len, _buffered, __INST(handleType)); - } - if (cnt == len) { - OBJ mode = __INST(eolMode); - - len1 = len; - - if (mode == @symbol(cr)) { - cp = "\r"; len = 1; - } else if (mode == @symbol(crlf)) { - cp = "\r\n"; len = 2; - } else if (mode == @symbol(eot)) { - cp = "\004"; len = 1; - } else if (mode == @symbol(etx)) { - cp = "\003"; len = 1; - } else { - cp = "\n"; len = 1; - } + { + o_offs = (char *)__stringVal(aString)-(char *)aString; + __WRITEBYTES_OBJ__(cnt, f, aString, o_offs, len, _buffered, __INST(handleType)); + } + if (cnt == len) { + OBJ mode = __INST(eolMode); + + len1 = len; + + if (mode == @symbol(cr)) { + cp = "\r"; len = 1; + } else if (mode == @symbol(crlf)) { + cp = "\r\n"; len = 2; + } else if (mode == @symbol(eot)) { + cp = "\004"; len = 1; + } else if (mode == @symbol(etx)) { + cp = "\003"; len = 1; + } else { + cp = "\n"; len = 1; + } #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(cp, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(cp, 1, len, f); + } else #endif - { - __WRITEBYTES__(cnt, f, cp, len, _buffered, __INST(handleType)); - } - if (cnt > 0) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + cnt; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN ( self ); - } - } - error = __mkSmallInteger(__threadErrno); - } + { + __WRITEBYTES__(cnt, f, cp, len, _buffered, __INST(handleType)); + } + if (cnt > 0) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + cnt; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN ( self ); + } + } + error = __mkSmallInteger(__threadErrno); + } } %}. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ self + lastErrorNumber := error. + self writeError:error. + ^ self ]. super nextPutLine:aString. ! @@ -2803,14 +2811,14 @@ |line| [aStream atEnd] whileFalse:[ - line := aStream nextLine. - line isNil ifTrue:[ - ^ self. - ]. - self nextPutLine:line. - (aStringOrNil notNil and:[line startsWith:aStringOrNil]) ifTrue:[ - ^ self - ] + line := aStream nextLine. + line isNil ifTrue:[ + ^ self. + ]. + self nextPutLine:line. + (aStringOrNil notNil and:[line startsWith:aStringOrNil]) ifTrue:[ + ^ self + ] ]. ! @@ -2830,16 +2838,16 @@ firstPos := self position. [self atEnd] whileFalse:[ - lastPos := self position. - line := self nextLine. - line isNil ifTrue:[ - self position:firstPos. - ^ nil - ]. - (line startsWith:aString) ifTrue:[ - self position:lastPos. - ^ line - ] + lastPos := self position. + line := self nextLine. + line isNil ifTrue:[ + self position:firstPos. + ^ nil + ]. + (line startsWith:aString) ifTrue:[ + self position:lastPos. + ^ line + ] ]. self position:firstPos. ^ nil @@ -2859,18 +2867,18 @@ startPos := self position. [self atEnd] whileFalse:[ - linePos := self position. - line := self nextLine. - line notNil ifTrue:[ - index := 1. - aCollectionOfStrings do:[:prefix | - (line startsWith:prefix) ifTrue:[ - self position:linePos. - ^ index - ]. - index := index + 1 - ] - ] + linePos := self position. + line := self nextLine. + line notNil ifTrue:[ + index := 1. + aCollectionOfStrings do:[:prefix | + (line startsWith:prefix) ifTrue:[ + self position:linePos. + ^ index + ]. + index := index + 1 + ] + ] ]. self position:startPos. ^ nil @@ -2883,20 +2891,20 @@ the receiver will trigger an ioInterrupt. If cleared (which is the default) no special notification is made. Notice: - not every OS supports this - - check with OS>>supportsIOInterrupts before using" + not every OS supports this + - check with OS>>supportsIOInterrupts before using" |fd| handle isNil ifTrue:[^ self errorNotOpen]. OperatingSystem supportsIOInterrupts ifFalse:[ - ^ self errorUnsupportedOperation + ^ self errorUnsupportedOperation ]. fd := self fileDescriptor. aBoolean ifTrue:[ - ^ OperatingSystem enableIOInterruptsOn:fd + ^ OperatingSystem enableIOInterruptsOn:fd ]. ^ OperatingSystem disableIOInterruptsOn:fd @@ -2929,10 +2937,10 @@ |bufferSize| OperatingSystem isMSDOSlike ifTrue:[ - "/ mhmh - NT hangs, when copying bigger blocks to a network drive - why ? - bufferSize := 1 * 1024. + "/ mhmh - NT hangs, when copying bigger blocks to a network drive - why ? + bufferSize := 1 * 1024. ] ifFalse:[ - bufferSize := 8 * 1024. + bufferSize := 8 * 1024. ]. ^ inStream copyToEndInto:self bufferSize:bufferSize @@ -2953,10 +2961,10 @@ |bufferSize| OperatingSystem isMSDOSlike ifTrue:[ - "/ mhmh - NT hangs, when copying bigger blocks to a network drive - why ? - bufferSize := 1 * 1024. + "/ mhmh - NT hangs, when copying bigger blocks to a network drive - why ? + bufferSize := 1 * 1024. ] ifFalse:[ - bufferSize := 8 * 1024. + bufferSize := 8 * 1024. ]. ^ self copyToEndInto:outStream bufferSize:bufferSize @@ -3013,55 +3021,55 @@ OBJ fp = __INST(handle); if (fp == nil) - goto out; + goto out; if (!__isInteger(ioctlNumber) - || (!__isInteger(arg) - && (arg != nil) - && !__isBytes(arg) - && !__isExternalBytesLike(arg) - && !__isExternalAddress(arg))) { - error = @symbol(badArgument); - goto out; + || (!__isInteger(arg) + && (arg != nil) + && !__isBytes(arg) + && !__isExternalBytesLike(arg) + && !__isExternalAddress(arg))) { + error = @symbol(badArgument); + goto out; } if (__INST(handleType) == @symbol(socketHandle)) { - fd = __FILEVal(fp); + fd = __FILEVal(fp); } else - if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) { - fd = fileno(__FILEVal(fp)); + if ((__INST(handleType) == nil) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { + fd = fileno(__FILEVal(fp)); } else { - error = @symbol(badHandleType); - goto out; + error = @symbol(badHandleType); + goto out; } ioNum = __unsignedLongIntVal(ioctlNumber); __BEGIN_INTERRUPTABLE__ do { - __threadErrno = 0; - if (arg == nil) { - ioArg = 0; - } else if (__isSmallInteger(arg)) { - ioArg = __intVal(arg); - } else if (__isInteger(arg)) { - ioArg = __unsignedLongIntVal(arg); - } else if (__isExternalBytesLike(arg)) { - ioArg = (INT)(__externalBytesAddress(arg)); - } else if (__isExternalAddress(arg)) { - ioArg = (INT)(__externalAddressVal(arg)); - } else { - ioArg = (INT)(__ByteArrayInstPtr(arg)->ba_element); - } - ret = ioctl(fd, ioNum, ioArg); + __threadErrno = 0; + if (arg == nil) { + ioArg = 0; + } else if (__isSmallInteger(arg)) { + ioArg = __intVal(arg); + } else if (__isInteger(arg)) { + ioArg = __unsignedLongIntVal(arg); + } else if (__isExternalBytesLike(arg)) { + ioArg = (INT)(__externalBytesAddress(arg)); + } else if (__isExternalAddress(arg)) { + ioArg = (INT)(__externalAddressVal(arg)); + } else { + ioArg = (INT)(__ByteArrayInstPtr(arg)->ba_element); + } + ret = ioctl(fd, ioNum, ioArg); } while (ret < 0 && __threadErrno == EINTR); __END_INTERRUPTABLE__ if (ret >= 0) { - RETURN ( __mkSmallInteger(ret) ); + RETURN ( __mkSmallInteger(ret) ); } error = __mkSmallInteger(__threadErrno); #endif @@ -3069,8 +3077,8 @@ out:; %}. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self ioError:error. + lastErrorNumber := error. + ^ self ioError:error. ]. handle isNil ifTrue:[^ self errorNotOpen]. @@ -3104,39 +3112,39 @@ OBJ fp = __INST(handle); if (fp == nil) - goto out; + goto out; if (__INST(handleType) == @symbol(socketHandle)) { - // syncing a socket to disk ? - error = @symbol(badHandleType); - goto out; - // fd = __FILEVal(fp); + // syncing a socket to disk ? + error = @symbol(badHandleType); + goto out; + // fd = __FILEVal(fp); } else - if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) { - fd = fileno(__FILEVal(fp)); + if ((__INST(handleType) == nil) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { + fd = fileno(__FILEVal(fp)); } else { - error = @symbol(badHandleType); - goto out; + error = @symbol(badHandleType); + goto out; } #ifdef WIN32 __threadErrno = 0; ret = __STX_API_NOINT_CALL1( "FlushFileBuffers", FlushFileBuffers, _get_osfhandle(fd)); if (ret) { - RETURN (self); + RETURN (self); } #else __BEGIN_INTERRUPTABLE__ do { - ret = fsync(fd); + ret = fsync(fd); } while ((ret < 0) && (__threadErrno == EINTR)); __END_INTERRUPTABLE__ if (ret >= 0) { - RETURN (self); + RETURN (self); } #endif /* ! WIN32 */ error = __mkSmallInteger(__threadErrno); @@ -3144,16 +3152,16 @@ out:; %}. error notNil ifTrue:[ - lastErrorNumber := error. - self ioError:error. - ^ self. + lastErrorNumber := error. + self ioError:error. + ^ self. ]. handle isNil ifTrue:[self errorNotOpen]. " - |f| - f := 'x' asFilename writeStream. - f nextPutAll:'hallo'; sync; syncData; close + |f| + f := 'x' asFilename writeStream. + f nextPutAll:'hallo'; sync; syncData; close " ! @@ -3173,39 +3181,39 @@ OBJ fp = __INST(handle); if (fp == nil) - goto out; + goto out; if (__INST(handleType) == @symbol(socketHandle)) { - // syncing a socket to disk ? - error = @symbol(badHandleType); - goto out; - // fd = __FILEVal(fp); + // syncing a socket to disk ? + error = @symbol(badHandleType); + goto out; + // fd = __FILEVal(fp); } else - if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) { - fd = fileno(__FILEVal(fp)); + if ((__INST(handleType) == nil) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { + fd = fileno(__FILEVal(fp)); } else { - error = @symbol(badHandleType); - goto out; + error = @symbol(badHandleType); + goto out; } #ifdef WIN32 __threadErrno = 0; ret = __STX_API_NOINT_CALL1( "FlushFileBuffers", FlushFileBuffers, _get_osfhandle(fd)); if (ret) { - RETURN (self); + RETURN (self); } #else __BEGIN_INTERRUPTABLE__ do { - ret = fdatasync(fd); + ret = fdatasync(fd); } while ((ret < 0) && (__threadErrno == EINTR)); __END_INTERRUPTABLE__ if (ret >= 0) { - RETURN (self); + RETURN (self); } #endif /* ! WIN32 */ error = __mkSmallInteger(__threadErrno); @@ -3214,9 +3222,9 @@ %}. error notNil ifTrue:[ - lastErrorNumber := error. - self ioError:error. - ^ self. + lastErrorNumber := error. + self ioError:error. + ^ self. ]. handle isNil ifTrue:[^ self errorNotOpen]. @@ -3224,9 +3232,9 @@ self sync. " - |f| - f := 'x' asFilename writeStream. - f nextPutAll:'hallo'; sync; syncData; close + |f| + f := 'x' asFilename writeStream. + f nextPutAll:'hallo'; sync; syncData; close " ! @@ -3259,33 +3267,33 @@ int sz; if (fp == nil) - goto out; + goto out; if (__INST(handleType) == @symbol(socketHandle)) { - // cg: termina attributes of a socket? - error = @symbol(badHandleType); - goto out; - // fd = __FILEVal(fp); + // cg: termina attributes of a socket? + error = @symbol(badHandleType); + goto out; + // fd = __FILEVal(fp); } else - if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) { - fd = fileno(__FILEVal(fp)); + if ((__INST(handleType) == nil) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { + fd = fileno(__FILEVal(fp)); } else { - error = @symbol(badHandleType); - goto out; + error = @symbol(badHandleType); + goto out; } __BEGIN_INTERRUPTABLE__ do { - __threadErrno = 0; - _ret = tcgetattr(fd, &t); + __threadErrno = 0; + _ret = tcgetattr(fd, &t); } while (_ret < 0 && __threadErrno == EINTR); __END_INTERRUPTABLE__ if (_ret < 0) { - error = __mkSmallInteger(__threadErrno); + error = __mkSmallInteger(__threadErrno); } ignbrk = t.c_iflag & IGNBRK ? true : false; brkint = t.c_iflag & BRKINT ? true : false; @@ -3321,18 +3329,18 @@ sz = t.c_cflag & CSIZE; switch (sz) { - case CS5: - csize = @symbol(cs5); - break; - case CS6: - csize = @symbol(cs6); - break; - case CS7: - csize = @symbol(cs7); - break; - case CS8: - csize = @symbol(cs8); - break; + case CS5: + csize = @symbol(cs5); + break; + case CS6: + csize = @symbol(cs6); + break; + case CS7: + csize = @symbol(cs7); + break; + case CS8: + csize = @symbol(cs8); + break; } cstopb = t.c_cflag & CSTOPB ? true : false; cread = t.c_cflag & CREAD ? true : false; @@ -3368,12 +3376,12 @@ out:; %}. error notNil ifTrue:[ - error == #unsupportedOperation ifTrue:[ - "/ the system does not support tcgetattr - ^ self errorUnsupportedOperation - ]. - lastErrorNumber := error. - ^ self ioError:error. + error == #unsupportedOperation ifTrue:[ + "/ the system does not support tcgetattr + ^ self errorUnsupportedOperation + ]. + lastErrorNumber := error. + ^ self ioError:error. ]. handle isNil ifTrue:[^ self errorNotOpen]. @@ -3435,7 +3443,7 @@ readCount := self nextBytes:count into:aCollection startingAt:start. readCount = count ifTrue:[ - ^ aCollection. + ^ aCollection. ]. ^ aCollection copyFrom:1 to:start+readCount-1. ! @@ -3449,20 +3457,20 @@ |buffer n| binary ifTrue:[ - buffer := ByteArray uninitializedNew:count + buffer := ByteArray uninitializedNew:count ] ifFalse:[ - buffer := String uninitializedNew:count + buffer := String uninitializedNew:count ]. n := self nextAvailableBytes:count into:buffer startingAt:1. n == 0 ifTrue:[ - binary ifTrue:[ - ^ #[] - ]. - ^ '' + binary ifTrue:[ + ^ #[] + ]. + ^ '' ]. n ~~ count ifTrue:[ - ^ buffer copyTo:n + ^ buffer copyTo:n ]. ^ buffer. @@ -3520,99 +3528,99 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - && __bothSmallInteger(count, start) - ) { - f = __FILEVal(fp); - - cnt = __intVal(count); - offs = __intVal(start) - 1; - - if (__isExternalBytesLike(anObject)) { - OBJ sz; - - nInstBytes = 0; - extPtr = (char *)(__externalBytesAddress(anObject)); - if (extPtr == NULL) goto bad; - sz = __externalBytesSize(anObject); - if (__isSmallInteger(sz)) { - objSize = __intVal(sz); - } else { - objSize = 0; /* unknown */ - } - } else { - OBJ oClass = __Class(anObject); - int nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); - - nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars); - - switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) { - case BYTEARRAY: - case WORDARRAY: - case LONGARRAY: - case SWORDARRAY: - case SLONGARRAY: - case FLOATARRAY: - break; - case DOUBLEARRAY: + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + && __bothSmallInteger(count, start) + ) { + f = __FILEVal(fp); + + cnt = __intVal(count); + offs = __intVal(start) - 1; + + if (__isExternalBytesLike(anObject)) { + OBJ sz; + + nInstBytes = 0; + extPtr = (char *)(__externalBytesAddress(anObject)); + if (extPtr == NULL) goto bad; + sz = __externalBytesSize(anObject); + if (__isSmallInteger(sz)) { + objSize = __intVal(sz); + } else { + objSize = 0; /* unknown */ + } + } else { + OBJ oClass = __Class(anObject); + int nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); + + nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars); + + switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) { + case BYTEARRAY: + case WORDARRAY: + case LONGARRAY: + case SWORDARRAY: + case SLONGARRAY: + case FLOATARRAY: + break; + case DOUBLEARRAY: #ifdef __NEED_DOUBLE_ALIGN - nInstBytes = (nInstBytes-1+__DOUBLE_ALIGN) &~ (__DOUBLE_ALIGN-1); + nInstBytes = (nInstBytes-1+__DOUBLE_ALIGN) &~ (__DOUBLE_ALIGN-1); #endif - break; - case LONGLONGARRAY: - case SLONGLONGARRAY: + break; + case LONGLONGARRAY: + case SLONGLONGARRAY: #ifdef __NEED_LONGLONG_ALIGN - nInstBytes = (nInstBytes-1+__LONGLONG_ALIGN) &~ (__LONGLONG_ALIGN-1); + nInstBytes = (nInstBytes-1+__LONGLONG_ALIGN) &~ (__LONGLONG_ALIGN-1); #endif - break; - default: - goto bad; - } - extPtr = (char *)0; - objSize = __Size(anObject) - nInstBytes; - } - - if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) { - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f); - } - - if (extPtr) { - __READAVAILBYTES__(ret, f, extPtr+offs, cnt, _buffered, __INST(handleType)); - } else { - /* - * on interrupt, anObject may be moved to another location. - * So we pass (char *)__InstPtr(anObject) + nInstBytes + offs to the macro __READ_BYTES__, - * to get a new address. - */ - offs += nInstBytes; - __READAVAILBYTES_OBJ__(ret, f, anObject, offs, cnt, _buffered, __INST(handleType)); - } - /* 0 is NOT an EOF condition here ... */ - if (ret >= 0) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + ret; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN (__mkSmallInteger(ret)); - } - __INST(position) = nil; - error = __mkSmallInteger(__threadErrno); - } - } + break; + default: + goto bad; + } + extPtr = (char *)0; + objSize = __Size(anObject) - nInstBytes; + } + + if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) { + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f); + } + + if (extPtr) { + __READAVAILBYTES__(ret, f, extPtr+offs, cnt, _buffered, __INST(handleType)); + } else { + /* + * on interrupt, anObject may be moved to another location. + * So we pass (char *)__InstPtr(anObject) + nInstBytes + offs to the macro __READ_BYTES__, + * to get a new address. + */ + offs += nInstBytes; + __READAVAILBYTES_OBJ__(ret, f, anObject, offs, cnt, _buffered, __INST(handleType)); + } + /* 0 is NOT an EOF condition here ... */ + if (ret >= 0) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + ret; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN (__mkSmallInteger(ret)); + } + __INST(position) = nil; + error = __mkSmallInteger(__threadErrno); + } + } } bad: ; %}. (hitEOF and:[self pastEndRead isNil]) ifTrue:[^ 0]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error + lastErrorNumber := error. + ^ self readError:error ]. handle isNil ifTrue:[^ self errorNotOpen]. (mode == #writeonly) ifTrue:[^ self errorWriteOnly]. @@ -3633,14 +3641,14 @@ STObject handle = self.instVarAt(I_handle); if (handle != STObject.Nil) { - STObject next; - - next = handle.nextByte(); - if (next != STObject.EOF) { - self.instVarAt_put(I_position, STObject.Nil); - return __c__._RETURN( next ); - } - self.instVarAt_put(I_hitEOF, STObject.True); + STObject next; + + next = handle.nextByte(); + if (next != STObject.EOF) { + self.instVarAt_put(I_position, STObject.Nil); + return __c__._RETURN( next ); + } + self.instVarAt_put(I_hitEOF, STObject.True); } #else FILEPOINTER f; @@ -3654,41 +3662,41 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly))) { - f = __FILEVal(fp); - - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTE__(ret, f, &byte, _buffered, __INST(handleType)); - if (ret > 0) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 1; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN (__mkSmallInteger(byte)); - } - - if (ret == 0) { - __INST(hitEOF) = true; - } else /* ret < 0 */ { - __INST(position) = nil; - error = __mkSmallInteger(__threadErrno); - } - } + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly))) { + f = __FILEVal(fp); + + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTE__(ret, f, &byte, _buffered, __INST(handleType)); + if (ret > 0) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 1; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN (__mkSmallInteger(byte)); + } + + if (ret == 0) { + __INST(hitEOF) = true; + } else /* ret < 0 */ { + __INST(position) = nil; + error = __mkSmallInteger(__threadErrno); + } + } } #endif /* not SCHTEAM */ %}. hitEOF ifTrue:[^ self pastEndRead]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error + lastErrorNumber := error. + ^ self readError:error ]. handle isNil ifTrue:[^ self errorNotOpen]. ^ self errorWriteOnly @@ -3733,98 +3741,98 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - && __bothSmallInteger(count, start) - ) { - f = __FILEVal(fp); - - cnt = __intVal(count); - offs = __intVal(start) - 1; - - if (__isExternalBytesLike(anObject)) { - OBJ sz; - - nInstBytes = 0; - extPtr = (char *)(__externalBytesAddress(anObject)); - if (extPtr == NULL) goto bad; - sz = __externalBytesSize(anObject); - if (__isSmallInteger(sz)) { - objSize = __intVal(sz); - } else { - objSize = 0; /* unknown */ - } - } else { - OBJ oClass = __Class(anObject); - int nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); - - nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars); - switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) { - case BYTEARRAY: - case WORDARRAY: - case LONGARRAY: - case SWORDARRAY: - case SLONGARRAY: - case FLOATARRAY: - break; - case DOUBLEARRAY: + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + && __bothSmallInteger(count, start) + ) { + f = __FILEVal(fp); + + cnt = __intVal(count); + offs = __intVal(start) - 1; + + if (__isExternalBytesLike(anObject)) { + OBJ sz; + + nInstBytes = 0; + extPtr = (char *)(__externalBytesAddress(anObject)); + if (extPtr == NULL) goto bad; + sz = __externalBytesSize(anObject); + if (__isSmallInteger(sz)) { + objSize = __intVal(sz); + } else { + objSize = 0; /* unknown */ + } + } else { + OBJ oClass = __Class(anObject); + int nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); + + nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars); + switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) { + case BYTEARRAY: + case WORDARRAY: + case LONGARRAY: + case SWORDARRAY: + case SLONGARRAY: + case FLOATARRAY: + break; + case DOUBLEARRAY: #ifdef __NEED_DOUBLE_ALIGN - nInstBytes = (nInstBytes-1+__DOUBLE_ALIGN) &~ (__DOUBLE_ALIGN-1); + nInstBytes = (nInstBytes-1+__DOUBLE_ALIGN) &~ (__DOUBLE_ALIGN-1); #endif - break; - case LONGLONGARRAY: - case SLONGLONGARRAY: + break; + case LONGLONGARRAY: + case SLONGLONGARRAY: #ifdef __NEED_LONGLONG_ALIGN - nInstBytes = (nInstBytes-1+__LONGLONG_ALIGN) &~ (__LONGLONG_ALIGN-1); + nInstBytes = (nInstBytes-1+__LONGLONG_ALIGN) &~ (__LONGLONG_ALIGN-1); #endif - break; - default: - goto bad; - } - extPtr = (char *)0; - objSize = __Size(anObject) - nInstBytes; - } - if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) { - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f); - } - - if (extPtr) { - __READBYTES__(ret, f, extPtr+offs, cnt, _buffered, __INST(handleType)); - } else { - /* - * on interrupt, anObject may be moved to another location. - * So we pass anObject, and the offset to the __READBYTES_OBJ__ macro. - */ - offs += nInstBytes; - __READBYTES_OBJ__(ret, f, anObject, offs, cnt, _buffered, __INST(handleType)); - } - - if (ret > 0) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + ret; - OBJ t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN (__mkSmallInteger(ret)); - } - if (ret == 0) { - __INST(hitEOF) = true; - } else /* ret < 0 */ { - __INST(position) = nil; - error = __mkSmallInteger(__threadErrno); - } - } - } + break; + default: + goto bad; + } + extPtr = (char *)0; + objSize = __Size(anObject) - nInstBytes; + } + if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) { + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f); + } + + if (extPtr) { + __READBYTES__(ret, f, extPtr+offs, cnt, _buffered, __INST(handleType)); + } else { + /* + * on interrupt, anObject may be moved to another location. + * So we pass anObject, and the offset to the __READBYTES_OBJ__ macro. + */ + offs += nInstBytes; + __READBYTES_OBJ__(ret, f, anObject, offs, cnt, _buffered, __INST(handleType)); + } + + if (ret > 0) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + ret; + OBJ t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN (__mkSmallInteger(ret)); + } + if (ret == 0) { + __INST(hitEOF) = true; + } else /* ret < 0 */ { + __INST(position) = nil; + error = __mkSmallInteger(__threadErrno); + } + } + } } bad: ; %}. (hitEOF and:[self pastEndRead isNil]) ifTrue:[^ 0]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error + lastErrorNumber := error. + ^ self readError:error ]. handle isNil ifTrue:[^ self errorNotOpen]. (mode == #writeonly) ifTrue:[^ self errorWriteOnly]. @@ -3860,69 +3868,69 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - FILEPOINTER f; - int ret, _buffered; - int value; - union { - unsigned char buffer[4]; - int intVal; - } u; - - f = __FILEVal(fp); - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTES__(ret, f, u.buffer, 4, _buffered, __INST(handleType)); - - if (ret == 4) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 4; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - if (msbFlag == true) { + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + FILEPOINTER f; + int ret, _buffered; + int value; + union { + unsigned char buffer[4]; + int intVal; + } u; + + f = __FILEVal(fp); + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTES__(ret, f, u.buffer, 4, _buffered, __INST(handleType)); + + if (ret == 4) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 4; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + if (msbFlag == true) { #if defined(__MSBFIRST__) - value = u.intVal; + value = u.intVal; #else - value = (u.buffer[0] & 0xFF); - value = (value << 8) | (u.buffer[1] & 0xFF); - value = (value << 8) | (u.buffer[2] & 0xFF); - value = (value << 8) | (u.buffer[3] & 0xFF); + value = (u.buffer[0] & 0xFF); + value = (value << 8) | (u.buffer[1] & 0xFF); + value = (value << 8) | (u.buffer[2] & 0xFF); + value = (value << 8) | (u.buffer[3] & 0xFF); #endif - } else { + } else { #if defined(__LSBFIRST__) - value = u.intVal; + value = u.intVal; #else - value = (u.buffer[3] & 0xFF); - value = (value << 8) | (u.buffer[2] & 0xFF); - value = (value << 8) | (u.buffer[1] & 0xFF); - value = (value << 8) | (u.buffer[0] & 0xFF); + value = (u.buffer[3] & 0xFF); + value = (value << 8) | (u.buffer[2] & 0xFF); + value = (value << 8) | (u.buffer[1] & 0xFF); + value = (value << 8) | (u.buffer[0] & 0xFF); #endif - } + } #if __POINTER_SIZE__ == 8 - RETURN ( __mkSmallInteger(value)); + RETURN ( __mkSmallInteger(value)); #else - if ((value >= _MIN_INT) && (value <= _MAX_INT)) { - RETURN ( __mkSmallInteger(value)); - } - RETURN ( __MKLARGEINT(value) ); + if ((value >= _MIN_INT) && (value <= _MAX_INT)) { + RETURN ( __mkSmallInteger(value)); + } + RETURN ( __MKLARGEINT(value) ); #endif - } - - if (ret < 0) { - __INST(position) = nil; - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + } + + if (ret < 0) { + __INST(position) = nil; + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } %}. hitEOF ifTrue:[^ self pastEndRead]. @@ -3949,56 +3957,56 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - FILEPOINTER f; - int ret, _buffered; - short value; - union { - unsigned char buffer[2]; - short shortVal; - } u; - - f = __FILEVal(fp); - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTES__(ret, f, u.buffer, 2, _buffered, __INST(handleType)); - - if (ret == 2) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 2; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - if (msbFlag == true) { + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + FILEPOINTER f; + int ret, _buffered; + short value; + union { + unsigned char buffer[2]; + short shortVal; + } u; + + f = __FILEVal(fp); + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTES__(ret, f, u.buffer, 2, _buffered, __INST(handleType)); + + if (ret == 2) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 2; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + if (msbFlag == true) { #if defined(__MSBFIRST__) - value = u.shortVal; + value = u.shortVal; #else - value = ((u.buffer[0] & 0xFF) << 8) | (u.buffer[1] & 0xFF); + value = ((u.buffer[0] & 0xFF) << 8) | (u.buffer[1] & 0xFF); #endif - } else { + } else { #if defined(__LSBFIRST__) - value = u.shortVal; + value = u.shortVal; #else - value = ((u.buffer[1] & 0xFF) << 8) | (u.buffer[0] & 0xFF); + value = ((u.buffer[1] & 0xFF) << 8) | (u.buffer[0] & 0xFF); #endif - } - RETURN (__mkSmallInteger(value)); - } - - if (ret < 0) { - __INST(position) = nil; /* i.e. do not know */ - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + } + RETURN (__mkSmallInteger(value)); + } + + if (ret < 0) { + __INST(position) = nil; /* i.e. do not know */ + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } %}. hitEOF ifTrue:[^ self pastEndRead]. @@ -4026,70 +4034,70 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - FILEPOINTER f; - int ret, _buffered; - unsigned INT value; - union { - unsigned char buffer[4]; - unsigned int intVal; - } u; - - f = __FILEVal(fp); - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTES__(ret, f, u.buffer, 4, _buffered, __INST(handleType)); - - if (ret == 4) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 4; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - if (msbFlag == true) { + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + FILEPOINTER f; + int ret, _buffered; + unsigned INT value; + union { + unsigned char buffer[4]; + unsigned int intVal; + } u; + + f = __FILEVal(fp); + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTES__(ret, f, u.buffer, 4, _buffered, __INST(handleType)); + + if (ret == 4) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 4; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + if (msbFlag == true) { #if defined(__MSBFIRST__) - value = u.intVal; + value = u.intVal; #else - value = u.buffer[0]; - value = (value << 8) | u.buffer[1]; - value = (value << 8) | u.buffer[2]; - value = (value << 8) | u.buffer[3]; + value = u.buffer[0]; + value = (value << 8) | u.buffer[1]; + value = (value << 8) | u.buffer[2]; + value = (value << 8) | u.buffer[3]; #endif - } else { + } else { #if defined(__LSBFIRST__) - value = u.intVal; + value = u.intVal; #else - value = u.buffer[3]; - value = (value << 8) | u.buffer[2]; - value = (value << 8) | u.buffer[1]; - value = (value << 8) | u.buffer[0]; + value = u.buffer[3]; + value = (value << 8) | u.buffer[2]; + value = (value << 8) | u.buffer[1]; + value = (value << 8) | u.buffer[0]; #endif - } + } #if __POINTER_SIZE__ == 8 - value &= 0xFFFFFFFF; - RETURN (__mkSmallInteger(value)); + value &= 0xFFFFFFFF; + RETURN (__mkSmallInteger(value)); #else - if (value <= _MAX_INT) { - RETURN (__mkSmallInteger(value)); - } - RETURN (__MKULARGEINT(value) ); + if (value <= _MAX_INT) { + RETURN (__mkSmallInteger(value)); + } + RETURN (__MKULARGEINT(value) ); #endif - } - - if (ret < 0) { - __INST(position) = nil; /* i.e. do not know */ - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + } + + if (ret < 0) { + __INST(position) = nil; /* i.e. do not know */ + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } %}. hitEOF ifTrue:[^ self pastEndRead]. @@ -4116,56 +4124,56 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - FILEPOINTER f; - int ret, _buffered; - unsigned int value; - union { - unsigned char buffer[2]; - unsigned short shortVal; - } u; - - f = __FILEVal(fp); - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTES__(ret, f, u.buffer, 2, _buffered, __INST(handleType)); - - if (ret == 2) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 2; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - if (msbFlag == true) { + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + FILEPOINTER f; + int ret, _buffered; + unsigned int value; + union { + unsigned char buffer[2]; + unsigned short shortVal; + } u; + + f = __FILEVal(fp); + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTES__(ret, f, u.buffer, 2, _buffered, __INST(handleType)); + + if (ret == 2) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 2; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + if (msbFlag == true) { #if defined(__MSBFIRST__) - value = u.shortVal; + value = u.shortVal; #else - value = (u.buffer[0] << 8) | u.buffer[1]; + value = (u.buffer[0] << 8) | u.buffer[1]; #endif - } else { + } else { #if defined(__LSBFIRST__) - value = u.shortVal; + value = u.shortVal; #else - value = (u.buffer[1] << 8) | u.buffer[0]; + value = (u.buffer[1] << 8) | u.buffer[0]; #endif - } - RETURN (__mkSmallInteger(value)); - } - - if (ret < 0) { - __INST(position) = nil; /* i.e. do not know */ - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + } + RETURN (__mkSmallInteger(value)); + } + + if (ret < 0) { + __INST(position) = nil; /* i.e. do not know */ + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } %}. hitEOF ifTrue:[^ self pastEndRead]. @@ -4178,14 +4186,15 @@ nextWord "in text-mode: - read the alphaNumeric next word (i.e. up to non letter-or-digit). - return a string containing those characters. + read the alphaNumeric next word (i.e. up to non letter-or-digit). + return a string containing those characters. in binary-mode: - read two bytes (msb-first) and return the value as a 16-bit - unsigned Integer (for compatibility with other smalltalks)" + read two bytes (msb-first) and return the value as a 16-bit + unsigned Integer (for compatibility with other smalltalks)" binary ifTrue:[ - ^ self nextUnsignedShortMSB:true + self obsoleteMethodWarning:'use #nextUnsignedShortMSB:true'. + ^ self nextUnsignedShortMSB:true ]. self obsoleteMethodWarning:'use #nextAlphaNumericWord'. ^ self nextAlphaNumericWord @@ -4208,43 +4217,43 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - && __isSmallInteger(aByteValue) - - ) { - int _buffered = (__INST(buffered) == true); - FILEPOINTER f = __FILEVal(fp); - char c = __intVal(aByteValue); - int cnt; - - if (_buffered) { - __WRITING__(f) - } + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + && __isSmallInteger(aByteValue) + + ) { + int _buffered = (__INST(buffered) == true); + FILEPOINTER f = __FILEVal(fp); + char c = __intVal(aByteValue); + int cnt; + + if (_buffered) { + __WRITING__(f) + } #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(&c, 1, 1, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(&c, 1, 1, f); + } else #endif - { - __WRITEBYTE__(cnt, f, &c, _buffered, __INST(handleType)); - } - if (cnt == 1) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 1; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN (self); - } - if (cnt < 0) { - __INST(position) = nil; /* i.e. do not know */ - } - error = __mkSmallInteger(__threadErrno); - } + { + __WRITEBYTE__(cnt, f, &c, _buffered, __INST(handleType)); + } + if (cnt == 1) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 1; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN (self); + } + if (cnt < 0) { + __INST(position) = nil; /* i.e. do not know */ + } + error = __mkSmallInteger(__threadErrno); + } } %}. handle isNil ifTrue:[self errorNotOpen. ^ self]. @@ -4264,29 +4273,29 @@ %{ int num; union { - char bytes[4]; - int intVal; + char bytes[4]; + int intVal; } u; OBJ fp; __INST(lastErrorNumber) = nil; if (__isSmallInteger(aNumber)) { - num = __intVal(aNumber); + num = __intVal(aNumber); } else { #if __POINTER_SIZE__ == 8 - // always more than 4-bytes - goto badArg; + // always more than 4-bytes + goto badArg; #else - num = __longIntVal(aNumber); - if (num == 0) { - num = __signedLongIntVal(aNumber); - if (num == 0) { - /* bad arg or out-of-range integer - * (handled by the fallBack code) - */ - goto badArg; - } - } + num = __longIntVal(aNumber); + if (num == 0) { + num = __signedLongIntVal(aNumber); + if (num == 0) { + /* bad arg or out-of-range integer + * (handled by the fallBack code) + */ + goto badArg; + } + } #endif } @@ -4295,65 +4304,65 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - ) { - int _buffered = (__INST(buffered) == true); - FILEPOINTER f = __FILEVal(fp); - int cnt; - - if (msbFlag == true) { + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + ) { + int _buffered = (__INST(buffered) == true); + FILEPOINTER f = __FILEVal(fp); + int cnt; + + if (msbFlag == true) { #if defined(__MSBFIRST__) - u.intVal = num; + u.intVal = num; #else - u.bytes[0] = (num >> 24) & 0xFF; - u.bytes[1] = (num >> 16) & 0xFF; - u.bytes[2] = (num >> 8) & 0xFF; - u.bytes[3] = num & 0xFF; + u.bytes[0] = (num >> 24) & 0xFF; + u.bytes[1] = (num >> 16) & 0xFF; + u.bytes[2] = (num >> 8) & 0xFF; + u.bytes[3] = num & 0xFF; #endif - } else { + } else { #if defined(__LSBFIRST__) - u.intVal = num; + u.intVal = num; #else - u.bytes[3] = (num >> 24) & 0xFF; - u.bytes[2] = (num >> 16) & 0xFF; - u.bytes[1] = (num >> 8) & 0xFF; - u.bytes[0] = num & 0xFF; + u.bytes[3] = (num >> 24) & 0xFF; + u.bytes[2] = (num >> 16) & 0xFF; + u.bytes[1] = (num >> 8) & 0xFF; + u.bytes[0] = num & 0xFF; #endif - } - - if (_buffered) { - __WRITING__(f) - } - __WRITEBYTES__(cnt, f, u.bytes, 4, _buffered, __INST(handleType)); - - if (cnt == 4) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 4; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN ( self ); - } - __INST(position) = nil; /* i.e. do not know */ - error = __mkSmallInteger(__threadErrno); - } + } + + if (_buffered) { + __WRITING__(f) + } + __WRITEBYTES__(cnt, f, u.bytes, 4, _buffered, __INST(handleType)); + + if (cnt == 4) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 4; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN ( self ); + } + __INST(position) = nil; /* i.e. do not know */ + error = __mkSmallInteger(__threadErrno); + } } badArg: ; %}. handle isNil ifTrue:[self errorNotOpen. ^ self]. (mode == #readonly) ifTrue:[self errorReadOnly. ^ self]. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ self + lastErrorNumber := error. + self writeError:error. + ^ self ]. aNumber isInteger ifTrue:[ - ^ super nextPutLong:aNumber MSB:msbFlag + ^ super nextPutLong:aNumber MSB:msbFlag ]. self argumentMustBeInteger ! @@ -4368,8 +4377,8 @@ %{ int num; union { - char bytes[2]; - short shortVal; + char bytes[2]; + short shortVal; } u; OBJ fp; @@ -4379,62 +4388,62 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - ) { - FILEPOINTER f = __FILEVal(fp); - int _buffered = (__INST(buffered) == true); - int cnt; - - if (__isSmallInteger(anIntegerOrCharacter)) { - num = __intVal(anIntegerOrCharacter); - } else if (__isCharacter(anIntegerOrCharacter)) { - num = __smallIntegerVal(__characterVal(anIntegerOrCharacter)); - } else - goto out; - - if (msbFlag == true) { + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + ) { + FILEPOINTER f = __FILEVal(fp); + int _buffered = (__INST(buffered) == true); + int cnt; + + if (__isSmallInteger(anIntegerOrCharacter)) { + num = __intVal(anIntegerOrCharacter); + } else if (__isCharacter(anIntegerOrCharacter)) { + num = __smallIntegerVal(__characterVal(anIntegerOrCharacter)); + } else + goto out; + + if (msbFlag == true) { #if defined(__MSBFIRST__) - u.shortVal = num; + u.shortVal = num; #else - u.bytes[0] = (num >> 8) & 0xFF; - u.bytes[1] = num & 0xFF; + u.bytes[0] = (num >> 8) & 0xFF; + u.bytes[1] = num & 0xFF; #endif - } else { + } else { #if defined(__LSBFIRST__) - u.shortVal = num; + u.shortVal = num; #else - u.bytes[1] = (num >> 8) & 0xFF; - u.bytes[0] = num & 0xFF; + u.bytes[1] = (num >> 8) & 0xFF; + u.bytes[0] = num & 0xFF; #endif - } - - if (_buffered) { - __WRITING__(f) - } - __WRITEBYTES__(cnt, f, u.bytes, 2, _buffered, __INST(handleType)); - - if (cnt == 2) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 2; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN ( self ); - } - __INST(position) = nil; /* i.e. do not know */ - error = __mkSmallInteger(__threadErrno); - } + } + + if (_buffered) { + __WRITING__(f) + } + __WRITEBYTES__(cnt, f, u.bytes, 2, _buffered, __INST(handleType)); + + if (cnt == 2) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 2; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN ( self ); + } + __INST(position) = nil; /* i.e. do not know */ + error = __mkSmallInteger(__threadErrno); + } } out:; %}. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ self + lastErrorNumber := error. + self writeError:error. + ^ self ]. handle isNil ifTrue:[self errorNotOpen. ^ self]. (mode == #readonly) ifTrue:[self errorReadOnly. ^ self]. @@ -4455,8 +4464,8 @@ printOn:aStream aStream - nextPutAll:self className; - nextPutAll:'(handle:('. + nextPutAll:self className; + nextPutAll:'(handle:('. handle printOn:aStream. aStream nextPutAll:'))' ! ! @@ -4481,74 +4490,74 @@ int rslt; if (fp == nil) { - error = @symbol(errorNotOpen); - goto out; + error = @symbol(errorNotOpen); + goto out; } if (__INST(handleType) == @symbol(socketHandle)) { - SOCKET sock = __FILEVal(fp); - - if (@global(FileOpenTrace) == true) { - fprintf(stderr, "close socket [ExternalStream] %"_lx_"\n", (INT)sock); - } - - // whether the close() will be successful or not - the handle is invalid now! - __INST(handle) = nil; - do { + SOCKET sock = __FILEVal(fp); + + if (@global(FileOpenTrace) == true) { + fprintf(stderr, "close socket [ExternalStream] %"_lx_"\n", (INT)sock); + } + + // whether the close() will be successful or not - the handle is invalid now! + __INST(handle) = nil; + do { #ifdef WIN32 - rslt = __STX_WSA_NOINT_CALL1("closesocket", closesocket, sock); + rslt = __STX_WSA_NOINT_CALL1("closesocket", closesocket, sock); #else - rslt = close(sock); + rslt = close(sock); #endif - } while((rslt < 0) && (__threadErrno == EINTR)); + } while((rslt < 0) && (__threadErrno == EINTR)); } else if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { - FILEPOINTER f = __FILEVal(fp); - - if (@global(FileOpenTrace) == true) { - fprintf(stderr, "fclose [ExternalStream] %"_lx_"\n", (INT)f); - } - // whether the close() will be successful or not - the handle is invalid now! - __INST(handle) = nil; + FILEPOINTER f = __FILEVal(fp); + + if (@global(FileOpenTrace) == true) { + fprintf(stderr, "fclose [ExternalStream] %"_lx_"\n", (INT)f); + } + // whether the close() will be successful or not - the handle is invalid now! + __INST(handle) = nil; #ifdef WIN32 - if (__INST(mode) != @symbol(readonly) && __INST(buffered) != false) { - // do a fflush() first, so that fclose() doesn't block - // we suspect, that EINTR causes problems in fclose() - do { - __threadErrno = 0; - rslt = __STX_C_CALL1("fflush", fflush, f); - } while((rslt < 0) && (__threadErrno == EINTR)); - } - do { - __threadErrno = 0; - rslt = __STX_C_NOINT_CALL1("fclose", fclose, f); - } while((rslt < 0) && (__threadErrno == EINTR)); + if (__INST(mode) != @symbol(readonly) && __INST(buffered) != false) { + // do a fflush() first, so that fclose() doesn't block + // we suspect, that EINTR causes problems in fclose() + do { + __threadErrno = 0; + rslt = __STX_C_CALL1("fflush", fflush, f); + } while((rslt < 0) && (__threadErrno == EINTR)); + } + do { + __threadErrno = 0; + rslt = __STX_C_NOINT_CALL1("fclose", fclose, f); + } while((rslt < 0) && (__threadErrno == EINTR)); #else - // cg: the pre Nov2014 code always did the fclose interruptable; - // I am not sure, if fclose is actually prepared to do this; - // at least when only reading, this should not block, and we - // should be ableto do it without being interruptable. - // Must watch this - if it leads to blockings, change and think about it. - if (__INST(mode) != @symbol(readonly)) { - __BEGIN_INTERRUPTABLE__ - rslt = fclose(f); - __END_INTERRUPTABLE__ - } else { - rslt = fclose(f); - } + // cg: the pre Nov2014 code always did the fclose interruptable; + // I am not sure, if fclose is actually prepared to do this; + // at least when only reading, this should not block, and we + // should be ableto do it without being interruptable. + // Must watch this - if it leads to blockings, change and think about it. + if (__INST(mode) != @symbol(readonly)) { + __BEGIN_INTERRUPTABLE__ + rslt = fclose(f); + __END_INTERRUPTABLE__ + } else { + rslt = fclose(f); + } #endif } else { - error = @symbol(badHandleType); - goto out; + error = @symbol(badHandleType); + goto out; } if (rslt < 0) { - error = __mkSmallInteger(__threadErrno); - goto out; + error = __mkSmallInteger(__threadErrno); + goto out; } RETURN (self); @@ -4556,28 +4565,28 @@ %}. error notNil ifTrue:[ - error == #errorNotOpen ifTrue:[ - self errorNotOpen. - ]. - error isInteger ifTrue:[ - lastErrorNumber := error. - mode == #readonly ifTrue:[ - self ioError:error. - ] ifFalse:[ - self writeError:error. - ]. - ^ self. - ]. - self primitiveFailed:error. - ^ self. + error == #errorNotOpen ifTrue:[ + self errorNotOpen. + ]. + error isInteger ifTrue:[ + lastErrorNumber := error. + mode == #readonly ifTrue:[ + self ioError:error. + ] ifFalse:[ + self writeError:error. + ]. + ^ self. + ]. + self primitiveFailed:error. + ^ self. ]. "/ fallback for rel5 fp := handle. fp notNil ifTrue:[ - handle := nil. - self closeFile:fp + handle := nil. + self closeFile:fp ] ! ! @@ -4681,16 +4690,16 @@ Only used internally" mode == #readonly ifTrue:[ - ^ ReadMode + ^ ReadMode ]. mode == #writeonly ifTrue:[ - ^ WriteMode + ^ WriteMode ]. mode == #readWrite ifTrue:[ - ^ ReadWriteMode + ^ ReadWriteMode ]. mode == #append ifTrue:[ - ^ AppendMode + ^ AppendMode ]. ^ ReadWriteMode ! @@ -4801,39 +4810,39 @@ int fd; if (!__isStringLike(openMode)) - goto err; + goto err; #ifdef WIN32 __stxWrapApiEnterCritical(); if (__isExternalAddressLike(anIntegerOrExternalAddress) ) { - HANDLE __fileHandle = (HANDLE)__externalAddressVal(anIntegerOrExternalAddress); - fd = _open_osfhandle((long)__fileHandle, O_BINARY); /* should we handle readonly, append or text mode? */ - if (fd < 0) { - __stxWrapApiLeaveCritical(); - CloseHandle(__fileHandle); - goto err; - } + HANDLE __fileHandle = (HANDLE)__externalAddressVal(anIntegerOrExternalAddress); + fd = _open_osfhandle((long)__fileHandle, O_BINARY); /* should we handle readonly, append or text mode? */ + if (fd < 0) { + __stxWrapApiLeaveCritical(); + CloseHandle(__fileHandle); + goto err; + } } else #endif if (__isSmallInteger(anIntegerOrExternalAddress)) { - fd = __smallIntegerVal(anIntegerOrExternalAddress); + fd = __smallIntegerVal(anIntegerOrExternalAddress); } else { #ifdef WIN32 - __stxWrapApiLeaveCritical(); + __stxWrapApiLeaveCritical(); #endif - goto err; + goto err; } f = fdopen(fd, __stringVal(openMode)); #ifdef WIN32 __stxWrapApiLeaveCritical(); #endif if (f != NULL) { - if (@global(FileOpenTrace) == true) { - fprintf(stderr, "fdopen [ExternalStream] %d -> %"_lx_"\n", fd, (INT)f); - } - fp = __MKFILEPOINTER(f); __INST(handle) = fp; __STORE(self, fp); - __INST(handleType) = @symbol(filePointer); - RETURN (self); + if (@global(FileOpenTrace) == true) { + fprintf(stderr, "fdopen [ExternalStream] %d -> %"_lx_"\n", fd, (INT)f); + } + fp = __MKFILEPOINTER(f); __INST(handle) = fp; __STORE(self, fp); + __INST(handleType) = @symbol(filePointer); + RETURN (self); } err:; %}. @@ -4879,26 +4888,26 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - f = __FILEVal(fp); - - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTE__(ret, f, &ch, _buffered, __INST(handleType)); - - if (ret > 0) { - RETURN(nil) - } - if (ret < 0) { - RETURN(__mkSmallInteger(__threadErrno)); - } else /* ret == 0 */ { - RETURN(__mkSmallInteger(0)); /* EOF */ - } - } + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + f = __FILEVal(fp); + + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTE__(ret, f, &ch, _buffered, __INST(handleType)); + + if (ret > 0) { + RETURN(nil) + } + if (ret < 0) { + RETURN(__mkSmallInteger(__threadErrno)); + } else /* ret == 0 */ { + RETURN(__mkSmallInteger(0)); /* EOF */ + } + } } %}. ! @@ -4918,15 +4927,15 @@ int success = 0; if (__INST(handleType) == @symbol(socketHandle)) { - success = ioctlsocket((SOCKET)__externalAddressVal(fd), FIONREAD, &res) == 0; + success = ioctlsocket((SOCKET)__externalAddressVal(fd), FIONREAD, &res) == 0; } else if (__INST(handleType) == @symbol(socketFilePointer)) { - success = ioctlsocket((SOCKET)_get_osfhandle(__intVal(fd)), FIONREAD, &res) == 0; + success = ioctlsocket((SOCKET)_get_osfhandle(__intVal(fd)), FIONREAD, &res) == 0; } else if (__INST(handleType) == @symbol(pipeFilePointer)) { - success = PeekNamedPipe((HANDLE)_get_osfhandle(__intVal(fd)),0,0,0,&res,0); + success = PeekNamedPipe((HANDLE)_get_osfhandle(__intVal(fd)),0,0,0,&res,0); } if (success) { - if (__INST(readAhead) != nil) res++; - RETURN(__mkSmallInteger(res)); + if (__INST(readAhead) != nil) res++; + RETURN(__mkSmallInteger(res)); } #endif %}. @@ -4951,18 +4960,18 @@ STObject handle = self.instVarAt(I_handle); if (handle != STObject.Nil) { - STObject next; - - if (self.instVarAt(I_binary) == STObject.True) { - next = handle.nextByte(); - } else { - next = handle.nextChar(); - } - if (next != STObject.EOF) { - self.instVarAt_put(I_position, STObject.Nil); - return __c__._RETURN( next ); - } - self.instVarAt_put(I_hitEOF, STObject.True); + STObject next; + + if (self.instVarAt(I_binary) == STObject.True) { + next = handle.nextByte(); + } else { + next = handle.nextChar(); + } + if (next != STObject.EOF) { + self.instVarAt_put(I_position, STObject.Nil); + return __c__._RETURN( next ); + } + self.instVarAt_put(I_hitEOF, STObject.True); } #else FILEPOINTER f; @@ -4976,65 +4985,65 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - f = __FILEVal(fp); - - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTE__(ret, f, &ch, _buffered, __INST(handleType)); - - if (ret > 0) { - pos = __INST(position); - if (__isSmallInteger(pos)) { - OBJ t; - - t = __MKINT(__intVal(pos) + 1); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - if (__INST(binary) == true) { - RETURN ( __mkSmallInteger(ch) ); - } - RETURN ( __MKCHARACTER(ch) ); - } - - __INST(position) = nil; - if ((ret < 0) + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + f = __FILEVal(fp); + + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTE__(ret, f, &ch, _buffered, __INST(handleType)); + + if (ret > 0) { + pos = __INST(position); + if (__isSmallInteger(pos)) { + OBJ t; + + t = __MKINT(__intVal(pos) + 1); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + if (__INST(binary) == true) { + RETURN ( __mkSmallInteger(ch) ); + } + RETURN ( __MKCHARACTER(ch) ); + } + + __INST(position) = nil; + if ((ret < 0) # ifdef ECONNRESET - && (__threadErrno != ECONNRESET) + && (__threadErrno != ECONNRESET) # endif - ){ - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + ){ + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } #endif /* not SCHTEAM */ %}. hitEOF == true ifTrue:[^ self pastEndRead]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error + lastErrorNumber := error. + ^ self readError:error ]. handle isNil ifTrue:[^ self errorNotOpen]. (mode == #writeonly) ifTrue:[^ self errorWriteOnly]. readAhead notNil ifTrue:[ - c := readAhead. - readAhead := nil. - ^ c. + c := readAhead. + readAhead := nil. + ^ c. ]. c := self nextByteFromFile:handle. c isNil ifTrue:[ - ^ self pastEndRead. + ^ self pastEndRead. ]. binary == true ifTrue:[ - ^ c + ^ c ]. ^ Character value:c ! @@ -5046,9 +5055,9 @@ |coll nRead| binary ifTrue:[ - coll := ByteArray uninitializedNew:count + coll := ByteArray uninitializedNew:count ] ifFalse:[ - coll := String new:count + coll := String new:count ]. nRead := self nextBytes:count into:coll startingAt:1. @@ -5056,7 +5065,7 @@ "/ we must raise an exception here. nRead < count ifTrue:[ - ^ self pastEndRead + ^ self pastEndRead ]. ^ coll @@ -5082,64 +5091,64 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - f = __FILEVal(fp); - - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTE__(ret, f, &ch, _buffered, __INST(handleType)); - - if (ret > 0) { - pos = __INST(position); - if (__isSmallInteger(pos)) { - OBJ t; - - t = __MKINT(__intVal(pos) + 1); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - if (__INST(binary) == true) { - RETURN ( __mkSmallInteger(ch) ); - } - RETURN ( __MKCHARACTER(ch) ); - } - - __INST(position) = nil; - if ((ret < 0) + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + f = __FILEVal(fp); + + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTE__(ret, f, &ch, _buffered, __INST(handleType)); + + if (ret > 0) { + pos = __INST(position); + if (__isSmallInteger(pos)) { + OBJ t; + + t = __MKINT(__intVal(pos) + 1); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + if (__INST(binary) == true) { + RETURN ( __mkSmallInteger(ch) ); + } + RETURN ( __MKCHARACTER(ch) ); + } + + __INST(position) = nil; + if ((ret < 0) #ifdef ECONNRESET - && (__threadErrno != ECONNRESET) + && (__threadErrno != ECONNRESET) #endif - ){ - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + ){ + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } %}. hitEOF == true ifTrue:[^ nil]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error. + lastErrorNumber := error. + ^ self readError:error. ]. handle isNil ifTrue:[^ self errorNotOpen]. (mode == #writeonly) ifTrue:[^ self errorWriteOnly]. readAhead notNil ifTrue:[ - c := readAhead. - readAhead := nil. - ^ c. + c := readAhead. + readAhead := nil. + ^ c. ]. c := self nextByteFromFile:handle. c isNil ifTrue:[ - ^ nil. + ^ nil. ]. binary == true ifTrue:[ - ^ c + ^ c ]. ^ Character value:c ! @@ -5159,11 +5168,11 @@ OBJ ra; if ((ra = __INST(readAhead)) != nil) { - if (__INST(binary) == true) { - RETURN ( ra ); - } - c = __intVal(ra); - RETURN ( __MKCHARACTER(c) ); + if (__INST(binary) == true) { + RETURN ( ra ); + } + c = __intVal(ra); + RETURN ( __MKCHARACTER(c) ); } __INST(lastErrorNumber) = nil; @@ -5173,49 +5182,49 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - f = __FILEVal(fp); - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); - - if (ret > 0) { - __UNGETC__(c, f, _buffered); - - if (__INST(binary) == true) { - RETURN ( __mkSmallInteger(c) ); - } - RETURN ( __MKCHARACTER(c) ); - } - if ((ret < 0) + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + f = __FILEVal(fp); + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); + + if (ret > 0) { + __UNGETC__(c, f, _buffered); + + if (__INST(binary) == true) { + RETURN ( __mkSmallInteger(c) ); + } + RETURN ( __MKCHARACTER(c) ); + } + if ((ret < 0) #ifdef ECONNRESET - && (__threadErrno != ECONNRESET) + && (__threadErrno != ECONNRESET) #endif - ){ - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + ){ + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } %}. hitEOF == true ifTrue:[^ self pastEndRead]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error. + lastErrorNumber := error. + ^ self readError:error. ]. handle isNil ifTrue:[^ self errorNotOpen]. (mode == #writeonly) ifTrue:[^ self errorWriteOnly]. readAhead isNil ifTrue:[ - readAhead := self nextOrNil. - readAhead isNil ifTrue:[ - ^ self pastEndRead. - ]. + readAhead := self nextOrNil. + readAhead isNil ifTrue:[ + ^ self pastEndRead. + ]. ]. ^ readAhead ! @@ -5235,11 +5244,11 @@ OBJ ra; if ((ra = __INST(readAhead)) != nil) { - if (__INST(binary) == true) { - RETURN ( ra ); - } - c = __intVal(ra); - RETURN ( __MKCHARACTER(c) ); + if (__INST(binary) == true) { + RETURN ( ra ); + } + c = __intVal(ra); + RETURN ( __MKCHARACTER(c) ); } __INST(lastErrorNumber) = nil; @@ -5249,46 +5258,46 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(writeonly)) - ) { - f = __FILEVal(fp); - _buffered = (__INST(buffered) == true); - if (_buffered) { - __READING__(f) - } - __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); - - if (ret > 0) { - __UNGETC__(c, f, _buffered); - - if (__INST(binary) == true) { - RETURN ( __mkSmallInteger(c) ); - } - RETURN ( __MKCHARACTER(c) ); - } - if ((ret < 0) + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(writeonly)) + ) { + f = __FILEVal(fp); + _buffered = (__INST(buffered) == true); + if (_buffered) { + __READING__(f) + } + __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); + + if (ret > 0) { + __UNGETC__(c, f, _buffered); + + if (__INST(binary) == true) { + RETURN ( __mkSmallInteger(c) ); + } + RETURN ( __MKCHARACTER(c) ); + } + if ((ret < 0) #ifdef ECONNRESET - && (__threadErrno != ECONNRESET) + && (__threadErrno != ECONNRESET) #endif - ){ - error = __mkSmallInteger(__threadErrno); - } else /* ret == 0 */ { - __INST(hitEOF) = true; - } - } + ){ + error = __mkSmallInteger(__threadErrno); + } else /* ret == 0 */ { + __INST(hitEOF) = true; + } + } } %}. hitEOF == true ifTrue:[^ nil]. error notNil ifTrue:[ - lastErrorNumber := error. - ^ self readError:error. + lastErrorNumber := error. + ^ self readError:error. ]. handle isNil ifTrue:[^ self errorNotOpen]. (mode == #writeonly) ifTrue:[^ self errorWriteOnly]. readAhead isNil ifTrue:[ - readAhead := self nextOrNil. + readAhead := self nextOrNil. ]. ^ readAhead ! @@ -5301,16 +5310,16 @@ buffer := self contentsSpecies new:4096. [self atEnd] whileFalse:[ - count := self nextAvailableBytes:4096 into:buffer startingAt:1. - count ~~ 0 ifTrue:[ - answerStream isNil ifTrue:[ - answerStream := WriteStream with:buffer. - answerStream position:count. - buffer := self contentsSpecies new:4096. - ] ifFalse:[ - answerStream nextPutAll:buffer startingAt:1 to:count. - ]. - ]. + count := self nextAvailableBytes:4096 into:buffer startingAt:1. + count ~~ 0 ifTrue:[ + answerStream isNil ifTrue:[ + answerStream := WriteStream with:buffer. + answerStream position:count. + buffer := self contentsSpecies new:4096. + ] ifFalse:[ + answerStream nextPutAll:buffer startingAt:1 to:count. + ]. + ]. ]. answerStream isNil ifTrue:[^ self contentsSpecies new]. ^ answerStream contents @@ -5352,19 +5361,19 @@ char c; if (__INST(hitEOF) == true) { - RETURN (true); + RETURN (true); } pos = __INST(position); lim = __INST(readLimit); if (lim != nil) { - off_t _pos, _readLimit; - - _pos = __signedLongIntVal(pos); - _pos = _pos - __intVal( @global(PositionableStream:ZeroPosition)) + 1; - _readLimit = __signedLongIntVal(lim); - if (_pos > _readLimit) { - RETURN (true); - } + off_t _pos, _readLimit; + + _pos = __signedLongIntVal(pos); + _pos = _pos - __intVal( @global(PositionableStream:ZeroPosition)) + 1; + _readLimit = __signedLongIntVal(lim); + if (_pos > _readLimit) { + RETURN (true); + } } __INST(lastErrorNumber) = nil; @@ -5374,57 +5383,57 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if ((fp = __INST(handle)) != nil) { - int _buffered = (__INST(buffered) == true); - int ret; - FILEPOINTER f = __FILEVal(fp); - - if (_buffered) { - __READING__(f); - } else { - if (__INST(readAhead) != nil) { - RETURN (false); - } - } - - /* - * read ahead ... - */ - do { + if ((fp = __INST(handle)) != nil) { + int _buffered = (__INST(buffered) == true); + int ret; + FILEPOINTER f = __FILEVal(fp); + + if (_buffered) { + __READING__(f); + } else { + if (__INST(readAhead) != nil) { + RETURN (false); + } + } + + /* + * read ahead ... + */ + do { #ifdef WIN32 # if 1 - __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); + __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); # else - __BEGIN_INTERRUPTABLE__ - __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); - __END_INTERRUPTABLE__ + __BEGIN_INTERRUPTABLE__ + __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); + __END_INTERRUPTABLE__ # endif #else /* not WIN32 */ - __BEGIN_INTERRUPTABLE__ - __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); - __END_INTERRUPTABLE__ + __BEGIN_INTERRUPTABLE__ + __READBYTE__(ret, f, &c, _buffered, __INST(handleType)); + __END_INTERRUPTABLE__ #endif - } while ((ret < 0) && (__threadErrno == EINTR)); - - if (ret > 0) { - __UNGETC__(c&0xff, f, _buffered); - RETURN (false); - } - if (ret == 0) { - __INST(hitEOF) = true; - RETURN (true); - } + } while ((ret < 0) && (__threadErrno == EINTR)); + + if (ret > 0) { + __UNGETC__(c&0xff, f, _buffered); + RETURN (false); + } + if (ret == 0) { + __INST(hitEOF) = true; + RETURN (true); + } #ifdef ECONNRESET - // connection reset by peer is also an EOF - if (__threadErrno == ECONNRESET) { - __INST(hitEOF) = true; - RETURN (true); - } + // connection reset by peer is also an EOF + if (__threadErrno == ECONNRESET) { + __INST(hitEOF) = true; + RETURN (true); + } #endif - /* ret < 0 */ - __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); - } + /* ret < 0 */ + __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); + } } %}. lastErrorNumber notNil ifTrue:[^ self readError]. @@ -5434,7 +5443,7 @@ "/ migration support ^ self - atEndFile:handle + atEndFile:handle "Modified: / 30.10.1998 / 20:16:06 / cg" ! @@ -5445,18 +5454,18 @@ We know, that error conditions do not block, so return true for errors." ^ readAhead notNil - or:[handle isNil] - or:[mode == #writeonly - or:[OperatingSystem readCheck:self fileDescriptor]] + or:[handle isNil] + or:[mode == #writeonly + or:[OperatingSystem readCheck:self fileDescriptor]] " |pipe| pipe := PipeStream readingFrom:'(sleep 10; echo hello)'. pipe canReadWithoutBlocking ifTrue:[ - Transcript showCR:'data available' + Transcript showCR:'data available' ] ifFalse:[ - Transcript showCR:'no data available' + Transcript showCR:'no data available' ]. pipe close " @@ -5470,8 +5479,8 @@ We know, that error conditions do not block, so return true for errors." ^ handle isNil - or:[mode == #readonly - or:[OperatingSystem writeCheck:self fileDescriptor]] + or:[mode == #readonly + or:[OperatingSystem writeCheck:self fileDescriptor]] ! gotErrorOrEOF @@ -5547,19 +5556,19 @@ wasBlocked := OperatingSystem blockInterrupts. inputSema := Semaphore new name:'readWait'. [ - timeoutOrNil notNil ifTrue:[ - Processor signal:inputSema afterMilliseconds:timeoutOrNil. - ]. - Processor signal:inputSema onInput:fd. - Processor activeProcess state:#ioWait. - inputSema wait. - hasTimedout := timeoutOrNil notNil and:[(OperatingSystem readCheck:fd) not]. + timeoutOrNil notNil ifTrue:[ + Processor signal:inputSema afterMilliseconds:timeoutOrNil. + ]. + Processor signal:inputSema onInput:fd. + Processor activeProcess state:#ioWait. + inputSema wait. + hasTimedout := timeoutOrNil notNil and:[(OperatingSystem readCheck:fd) not]. ] ifCurtailed:[ - Processor disableSemaphore:inputSema. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. + Processor disableSemaphore:inputSema. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ]. timeoutOrNil notNil ifTrue:[ - Processor disableSemaphore:inputSema. + Processor disableSemaphore:inputSema. ]. wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ^ hasTimedout @@ -5575,7 +5584,7 @@ |fd sema hasTimedout wasBlocked| handle isNil ifTrue:[ - ^ self errorNotOpen + ^ self errorNotOpen ]. fd := self fileDescriptor. @@ -5584,20 +5593,20 @@ wasBlocked := OperatingSystem blockInterrupts. sema := Semaphore new name:'readWriteWait'. [ - timeout notNil ifTrue:[ - Processor signal:sema afterMilliseconds:timeout - ]. - Processor signal:sema onOutput:fd. - Processor signal:sema onInput:fd. - Processor activeProcess state:#ioWait. - sema wait. - hasTimedout := timeout notNil and:[(OperatingSystem readWriteCheck:fd) not]. + timeout notNil ifTrue:[ + Processor signal:sema afterMilliseconds:timeout + ]. + Processor signal:sema onOutput:fd. + Processor signal:sema onInput:fd. + Processor activeProcess state:#ioWait. + sema wait. + hasTimedout := timeout notNil and:[(OperatingSystem readWriteCheck:fd) not]. ] ifCurtailed:[ - Processor disableSemaphore:sema. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. + Processor disableSemaphore:sema. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ]. timeout notNil ifTrue:[ - Processor disableSemaphore:sema. + Processor disableSemaphore:sema. ]. wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ^ hasTimedout @@ -5613,10 +5622,10 @@ |fd outputSema hasTimedout wasBlocked| handle isNil ifTrue:[ - ^ self errorNotOpen + ^ self errorNotOpen ]. mode == #readonly ifTrue:[ - ^ self errorReadOnly + ^ self errorReadOnly ]. fd := self fileDescriptor. @@ -5625,19 +5634,19 @@ wasBlocked := OperatingSystem blockInterrupts. outputSema := Semaphore new name:'writeWait'. [ - timeout notNil ifTrue:[ - Processor signal:outputSema afterMilliseconds:timeout - ]. - Processor signal:outputSema onOutput:fd. - Processor activeProcess state:#ioWait. - outputSema wait. - hasTimedout := timeout notNil and:[(OperatingSystem writeCheck:fd) not]. + timeout notNil ifTrue:[ + Processor signal:outputSema afterMilliseconds:timeout + ]. + Processor signal:outputSema onOutput:fd. + Processor activeProcess state:#ioWait. + outputSema wait. + hasTimedout := timeout notNil and:[(OperatingSystem writeCheck:fd) not]. ] ifCurtailed:[ - Processor disableSemaphore:outputSema. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. + Processor disableSemaphore:outputSema. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ]. timeout notNil ifTrue:[ - Processor disableSemaphore:outputSema. + Processor disableSemaphore:outputSema. ]. wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ^ hasTimedout @@ -5655,57 +5664,57 @@ || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - OBJ fp; - - __INST(lastErrorNumber) = nil; - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - && (__INST(binary) != true) - ) { - FILEPOINTER f = __FILEVal(fp); - int _buffered = (__INST(buffered) == true); - int len, cnt; - char *cp; - - if (_buffered) { - __WRITING__(f) - } - { - OBJ mode = __INST(eolMode); - - if (mode == @symbol(cr)) { - cp = "\r"; len = 1; - } else if (mode == @symbol(crlf)) { - cp = "\r\n"; len = 2; - } else if (mode == @symbol(eot)) { - cp = "\004"; len = 1; - } else if (mode == @symbol(etx)) { - cp = "\003"; len = 1; - } else { - cp = "\n"; len = 1; - } - } + OBJ fp; + + __INST(lastErrorNumber) = nil; + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + && (__INST(binary) != true) + ) { + FILEPOINTER f = __FILEVal(fp); + int _buffered = (__INST(buffered) == true); + int len, cnt; + char *cp; + + if (_buffered) { + __WRITING__(f) + } + { + OBJ mode = __INST(eolMode); + + if (mode == @symbol(cr)) { + cp = "\r"; len = 1; + } else if (mode == @symbol(crlf)) { + cp = "\r\n"; len = 2; + } else if (mode == @symbol(eot)) { + cp = "\004"; len = 1; + } else if (mode == @symbol(etx)) { + cp = "\003"; len = 1; + } else { + cp = "\n"; len = 1; + } + } #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(cp, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(cp, 1, len, f); + } else #endif - { - __WRITEBYTES__(cnt, f, cp, len, _buffered, __INST(handleType)); - } - if (cnt == len) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + len; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e: dont know */ - } - RETURN ( self ); - } - __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); - } + { + __WRITEBYTES__(cnt, f, cp, len, _buffered, __INST(handleType)); + } + if (cnt == len) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + len; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e: dont know */ + } + RETURN ( self ); + } + __INST(lastErrorNumber) = __mkSmallInteger(__threadErrno); + } } %}. lastErrorNumber notNil ifTrue:[self writeError. ^ self]. @@ -5714,11 +5723,11 @@ (binary==true) ifTrue:[self errorBinary. ^ self]. (eolMode == #cr) ifTrue:[ - self nextPut:(Character return). - ^ self + self nextPut:(Character return). + ^ self ]. (eolMode == #crlf) ifTrue:[ - self nextPut:(Character return). + self nextPut:(Character return). ]. self nextPut:(Character nl). ^ self @@ -5733,32 +5742,32 @@ || (__INST(handleType) == @symbol(filePointer)) || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - OBJ fp; - int _buffered = (__INST(buffered) == true); - - if ((fp = __INST(handle)) != nil) { - if (__INST(mode) != @symbol(readonly)) { - if (_buffered) { - FILEPOINTER f = __FILEVal(fp); + OBJ fp; + int _buffered = (__INST(buffered) == true); + + if ((fp = __INST(handle)) != nil) { + if (__INST(mode) != @symbol(readonly)) { + if (_buffered) { + FILEPOINTER f = __FILEVal(fp); #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - __win32_fflush(f); - } else { - int rslt; - - do { - __threadErrno = 0; - rslt = __STX_C_CALL1("fflush", fflush, f); - } while((rslt < 0) && (__threadErrno == EINTR)); - } + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + __win32_fflush(f); + } else { + int rslt; + + do { + __threadErrno = 0; + rslt = __STX_C_CALL1("fflush", fflush, f); + } while((rslt < 0) && (__threadErrno == EINTR)); + } #else /* ! WIN32 */ - __BEGIN_INTERRUPTABLE__ - FFLUSH(f); - __END_INTERRUPTABLE__ + __BEGIN_INTERRUPTABLE__ + FFLUSH(f); + __END_INTERRUPTABLE__ #endif /* ! WIN32 */ - } - } - } + } + } + } } %} ! @@ -5774,9 +5783,9 @@ if ((handle != STObject.Nil) && (aCharacter.isSTCharacter())) { - handle.writeChar( aCharacter ); - self.instVarAt_put(I_position, STObject.Nil); - return __c__._RETURN_self(); + handle.writeChar( aCharacter ); + self.instVarAt_put(I_position, STObject.Nil); + return __c__._RETURN_self(); } #else __INST(lastErrorNumber) = nil; @@ -5785,112 +5794,112 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - OBJ fp; - - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - ) { - FILEPOINTER f = __FILEVal(fp); - int _buffered = (__INST(buffered) == true); - unsigned codePoint; - unsigned char c; - int cnt; - char buff[2]; - int nBytes = 1; - - if (__INST(binary) != true) { - if (__isCharacter(aCharacter)) { - - codePoint = __intVal(__characterVal(aCharacter)); - if (codePoint <= 0xFF) { - c = codePoint; - buff[0] = c; nBytes = 1; - - if (c == '\n') { - OBJ mode = __INST(eolMode); - if (mode == @symbol(nl)) { - // no EOL translation - } else if (mode == nil) { - // no EOL translation - } else if (mode == @symbol(cr)) { - buff[0] = '\r'; - } else if (mode == @symbol(eot)) { - buff[0] = '\004'; - } else if (mode == @symbol(etx)) { - buff[0] = '\003'; - } else if (mode == @symbol(crlf)) { - buff[0] = '\r'; - buff[1] = '\n'; - nBytes = 2; - } - } + OBJ fp; + + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + ) { + FILEPOINTER f = __FILEVal(fp); + int _buffered = (__INST(buffered) == true); + unsigned codePoint; + unsigned char c; + int cnt; + char buff[2]; + int nBytes = 1; + + if (__INST(binary) != true) { + if (__isCharacter(aCharacter)) { + + codePoint = __intVal(__characterVal(aCharacter)); + if (codePoint <= 0xFF) { + c = codePoint; + buff[0] = c; nBytes = 1; + + if (c == '\n') { + OBJ mode = __INST(eolMode); + if (mode == @symbol(nl)) { + // no EOL translation + } else if (mode == nil) { + // no EOL translation + } else if (mode == @symbol(cr)) { + buff[0] = '\r'; + } else if (mode == @symbol(eot)) { + buff[0] = '\004'; + } else if (mode == @symbol(etx)) { + buff[0] = '\003'; + } else if (mode == @symbol(crlf)) { + buff[0] = '\r'; + buff[1] = '\n'; + nBytes = 2; + } + } doWrite: - if (! f) { - fprintf(stderr, "oops - fileHandle is NULL in nextPut:\n"); - __INST(handle) = nil; - goto out; - } - - if (_buffered) { - __WRITING__(f) - } + if (! f) { + fprintf(stderr, "oops - fileHandle is NULL in nextPut:\n"); + __INST(handle) = nil; + goto out; + } + + if (_buffered) { + __WRITING__(f) + } #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(buff, 1, nBytes, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(buff, 1, nBytes, f); + } else # endif - { - __WRITEBYTES__(cnt, f, buff, nBytes, _buffered, __INST(handleType)); - } - if (cnt == nBytes) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + nBytes; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN ( self ); - } - error = __mkSmallInteger(__threadErrno); - } - } - } else { - if (__isSmallInteger(aCharacter)) { - c = __intVal(aCharacter); - buff[0] = c; nBytes = 1; - goto doWrite; - } - } - } + { + __WRITEBYTES__(cnt, f, buff, nBytes, _buffered, __INST(handleType)); + } + if (cnt == nBytes) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + nBytes; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN ( self ); + } + error = __mkSmallInteger(__threadErrno); + } + } + } else { + if (__isSmallInteger(aCharacter)) { + c = __intVal(aCharacter); + buff[0] = c; nBytes = 1; + goto doWrite; + } + } + } } out: ; #endif /* not SCHTEAM */ %}. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ self + lastErrorNumber := error. + self writeError:error. + ^ self ]. handle isNil ifTrue:[self errorNotOpen. ^ self]. (mode == #readonly) ifTrue:[self errorReadOnly. ^ self]. binary == true ifFalse:[ - (aCharacter isCharacter not - or:[aCharacter codePoint > 16rFF]) ifTrue:[ - self argumentMustBeCharacter. - ^ self. - ]. + (aCharacter isCharacter not + or:[aCharacter codePoint > 16rFF]) ifTrue:[ + self argumentMustBeCharacter. + ^ self. + ]. ] ifTrue:[ - aCharacter isInteger ifFalse:[ - self argumentMustBeInteger. - ^ self. - ]. + aCharacter isInteger ifFalse:[ + self argumentMustBeInteger. + ^ self. + ]. ]. "/ migration support self - nextPutByte:aCharacter asInteger - toFile:handle + nextPutByte:aCharacter asInteger + toFile:handle ! nextPutAll:aCollection @@ -5905,9 +5914,9 @@ if ((handle != STObject.Nil) && (aCollection.isSTString())) { - handle.writeCharacters( aCollection.asSTString().characters ); - self.instVarAt_put(I_position, STObject.Nil); - return __c__._RETURN_self(); + handle.writeCharacters( aCollection.asSTString().characters ); + self.instVarAt_put(I_position, STObject.Nil); + return __c__._RETURN_self(); } #else @@ -5918,164 +5927,164 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - OBJ fp; - - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - ) { - INT len, cnt; - INT o_offs; - FILEPOINTER f = __FILEVal(fp); - int _buffered = (__INST(buffered) == true); - - if (! f) { - fprintf(stderr, "oops - fileHandle is NULL in nextPutAll:\n"); - __INST(handle) = nil; - goto out; - } - if (_buffered) { - __WRITING__(f) - } - - if (__isStringLike(aCollection)) { - OBJ mode = __INST(eolMode); - char *stringP = __stringVal(aCollection); - len = __stringSize(aCollection); - - if (__INST(binary) != true - && ((mode == @symbol(cr)) - || (mode == @symbol(etx)) - || (mode == @symbol(eot)) - || (mode == @symbol(crlf))) - && memchr(stringP, '\n', len) != NULL) - { - // there is a '\n' to be translated, replace it into a buffer - - char *end; - char sep[2]; - int sepLen = 1; - int bufLen; - char *buf, *endBuf, *sp, *dp; - - sep[0] = '\n'; - if (mode == @symbol(crlf)) { - sep[0] = '\r'; sep[1] = '\n'; sepLen = 2; - } else if (mode == @symbol(cr)) { - sep[0] = '\r'; - } else if (mode == @symbol(eot)) { - sep[0] = '\004'; - } else if (mode == @symbol(etx)) { - sep[0] = '\003'; - } - - // estimate size of buffer - assume every 4th char is a separator - bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen); - buf = (char *)malloc(bufLen); - if (buf == NULL) { - error = __mkSmallInteger(ENOMEM); - goto out; - } - - endBuf = buf + bufLen; - end = stringP + len; - for (sp = stringP, dp = buf; sp < end; sp++) { - char c; - - if ((dp+sepLen) >= endBuf) { - char *newBuf; - - bufLen = bufLen * 2; - newBuf = (char *)realloc(buf, bufLen); - if (newBuf == NULL) { - free(buf); - error = __mkSmallInteger(ENOMEM); - goto out; - } - endBuf = newBuf + bufLen; - dp = newBuf + (dp-buf); - buf = newBuf; - } - - if ((c = *sp) != '\n') { - *dp++ = c; - } else { - *dp++ = sep[0]; - if (sepLen == 2) { - *dp++ = sep[1]; - }; - } - } - - len = dp - buf; + OBJ fp; + + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + ) { + INT len, cnt; + INT o_offs; + FILEPOINTER f = __FILEVal(fp); + int _buffered = (__INST(buffered) == true); + + if (! f) { + fprintf(stderr, "oops - fileHandle is NULL in nextPutAll:\n"); + __INST(handle) = nil; + goto out; + } + if (_buffered) { + __WRITING__(f) + } + + if (__isStringLike(aCollection)) { + OBJ mode = __INST(eolMode); + char *stringP = __stringVal(aCollection); + len = __stringSize(aCollection); + + if (__INST(binary) != true + && ((mode == @symbol(cr)) + || (mode == @symbol(etx)) + || (mode == @symbol(eot)) + || (mode == @symbol(crlf))) + && memchr(stringP, '\n', len) != NULL) + { + // there is a '\n' to be translated, replace it into a buffer + + char *end; + char sep[2]; + int sepLen = 1; + int bufLen; + char *buf, *endBuf, *sp, *dp; + + sep[0] = '\n'; + if (mode == @symbol(crlf)) { + sep[0] = '\r'; sep[1] = '\n'; sepLen = 2; + } else if (mode == @symbol(cr)) { + sep[0] = '\r'; + } else if (mode == @symbol(eot)) { + sep[0] = '\004'; + } else if (mode == @symbol(etx)) { + sep[0] = '\003'; + } + + // estimate size of buffer - assume every 4th char is a separator + bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen); + buf = (char *)malloc(bufLen); + if (buf == NULL) { + error = __mkSmallInteger(ENOMEM); + goto out; + } + + endBuf = buf + bufLen; + end = stringP + len; + for (sp = stringP, dp = buf; sp < end; sp++) { + char c; + + if ((dp+sepLen) >= endBuf) { + char *newBuf; + + bufLen = bufLen * 2; + newBuf = (char *)realloc(buf, bufLen); + if (newBuf == NULL) { + free(buf); + error = __mkSmallInteger(ENOMEM); + goto out; + } + endBuf = newBuf + bufLen; + dp = newBuf + (dp-buf); + buf = newBuf; + } + + if ((c = *sp) != '\n') { + *dp++ = c; + } else { + *dp++ = sep[0]; + if (sepLen == 2) { + *dp++ = sep[1]; + }; + } + } + + len = dp - buf; #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(buf, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(buf, 1, len, f); + } else # endif - { - __WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType)); - } - free(buf); - } else { // No EOL conversion needed + { + __WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType)); + } + free(buf); + } else { // No EOL conversion needed #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(stringP, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(stringP, 1, len, f); + } else # endif - { - o_offs = stringP - (char *)__InstPtr(aCollection); - __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType)); - } - } - } else { // Not a String - if (__INST(binary) == true) { - INT offs; - - if (__isByteArrayLike(aCollection)) { - offs = 0; - len = __byteArraySize(aCollection); - } else if (__isBytes(aCollection)) { - offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars)); - len = __byteArraySize(aCollection) - offs; - } else - goto out; + { + o_offs = stringP - (char *)__InstPtr(aCollection); + __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType)); + } + } + } else { // Not a String + if (__INST(binary) == true) { + INT offs; + + if (__isByteArrayLike(aCollection)) { + offs = 0; + len = __byteArraySize(aCollection); + } else if (__isBytes(aCollection)) { + offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars)); + len = __byteArraySize(aCollection) - offs; + } else + goto out; #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(__stringVal(aCollection), 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(__stringVal(aCollection), 1, len, f); + } else # endif - { - o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element) - (char *)__InstPtr(aCollection); - o_offs += offs; - __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType)); - } - } else // Not binary mode - goto out; - } - - // Now check for errors - if (cnt == len) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + len; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN (self); - } - fprintf(stderr, "cnt=%d len=%d\n", cnt, len); - error = __mkSmallInteger(__threadErrno); - } + { + o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element) - (char *)__InstPtr(aCollection); + o_offs += offs; + __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType)); + } + } else // Not binary mode + goto out; + } + + // Now check for errors + if (cnt == len) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + len; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN (self); + } + fprintf(stderr, "cnt=%d len=%d\n", cnt, len); + error = __mkSmallInteger(__threadErrno); + } } out: ; #endif /* not SCHTEAM */ %}. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ self + lastErrorNumber := error. + self writeError:error. + ^ self ]. handle isNil ifTrue:[self errorNotOpen. ^ self]. (mode == #readonly) ifTrue:[self errorReadOnly. ^ self]. @@ -6088,7 +6097,7 @@ I don't know how to write non-bytes to a external stream, but let superclass handle this." buffer isByteCollection ifTrue:[ - ^ self nextPutBytes:initialWriteCount from:buffer startingAt:initialOffset. + ^ self nextPutBytes:initialWriteCount from:buffer startingAt:initialOffset. ]. ^ super nextPutAll:initialWriteCount from:buffer startingAt:initialOffset @@ -6108,176 +6117,176 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - OBJ fp = __INST(handle); - - if ((fp != nil) - && (__INST(mode) != @symbol(readonly)) - && __bothSmallInteger(start, stop) - ) { - int _buffered = (__INST(buffered) == true); - FILEPOINTER f = __FILEVal(fp); - int offs, len, cnt; - int iStart = __intVal(start); - int iStop = __intVal(stop); - int o_offs; - - if (_buffered ) { - __WRITING__(f) - } - - if ((iStart < 1) || (iStop < iStart)) { - RETURN(self); - } - if (__isStringLike(aCollection)) { - char *stringP; - OBJ mode = __INST(eolMode); - - len = __stringSize(aCollection); - if (iStop > len) { - RETURN(self); - } - if (iStop > len) - iStop = len; - len = iStop - iStart + 1; - stringP = __stringVal(aCollection) + iStart - 1; - - if (__INST(binary) != true - && ((mode == @symbol(cr)) - || (mode == @symbol(etx)) - || (mode == @symbol(eot)) - || (mode == @symbol(crlf))) - && memchr(stringP, '\n', len) != NULL) - { - // see if there is a \n which needs to be translated, replace it - - char *end = stringP + len; - char sep[2]; - int sepLen = 1; - int bufLen; - char *buf, *endBuf, *sp, *dp; - - sep[0] = '\n'; - if (mode == @symbol(crlf)) { - sep[0] = '\r'; sep[1] = '\n'; sepLen = 2; - } else if (mode == @symbol(cr)) { - sep[0] = '\r'; - } else if (mode == @symbol(eot)) { - sep[0] = '\004'; - } else if (mode == @symbol(etx)) { - sep[0] = '\003'; - } - - // estimate size of buffer - assume every 4th char is a separator - bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen); - buf = (char *)malloc(bufLen); - if (buf == NULL) { - error = __mkSmallInteger(ENOMEM); - goto out; - } - - endBuf = buf + bufLen; - - for (sp = stringP, dp = buf; sp < end; sp++) { - char c; - - if ((dp+sepLen) >= endBuf) { - char *newBuf; - - bufLen = bufLen * 2; - newBuf = (char *)realloc(buf, bufLen); - if (newBuf == NULL) { - free(buf); - error = __mkSmallInteger(ENOMEM); - goto out; - } - endBuf = newBuf + bufLen; - dp = newBuf + (dp-buf); - buf = newBuf; - } - - if ((c = *sp) == '\n') { - *dp++ = sep[0]; - if (sepLen == 2) { - *dp++ = sep[1]; - }; - } else { - *dp++ = c; - } - } - - len = dp - buf; + OBJ fp = __INST(handle); + + if ((fp != nil) + && (__INST(mode) != @symbol(readonly)) + && __bothSmallInteger(start, stop) + ) { + int _buffered = (__INST(buffered) == true); + FILEPOINTER f = __FILEVal(fp); + int offs, len, cnt; + int iStart = __intVal(start); + int iStop = __intVal(stop); + int o_offs; + + if (_buffered ) { + __WRITING__(f) + } + + if ((iStart < 1) || (iStop < iStart)) { + RETURN(self); + } + if (__isStringLike(aCollection)) { + char *stringP; + OBJ mode = __INST(eolMode); + + len = __stringSize(aCollection); + if (iStop > len) { + RETURN(self); + } + if (iStop > len) + iStop = len; + len = iStop - iStart + 1; + stringP = __stringVal(aCollection) + iStart - 1; + + if (__INST(binary) != true + && ((mode == @symbol(cr)) + || (mode == @symbol(etx)) + || (mode == @symbol(eot)) + || (mode == @symbol(crlf))) + && memchr(stringP, '\n', len) != NULL) + { + // see if there is a \n which needs to be translated, replace it + + char *end = stringP + len; + char sep[2]; + int sepLen = 1; + int bufLen; + char *buf, *endBuf, *sp, *dp; + + sep[0] = '\n'; + if (mode == @symbol(crlf)) { + sep[0] = '\r'; sep[1] = '\n'; sepLen = 2; + } else if (mode == @symbol(cr)) { + sep[0] = '\r'; + } else if (mode == @symbol(eot)) { + sep[0] = '\004'; + } else if (mode == @symbol(etx)) { + sep[0] = '\003'; + } + + // estimate size of buffer - assume every 4th char is a separator + bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen); + buf = (char *)malloc(bufLen); + if (buf == NULL) { + error = __mkSmallInteger(ENOMEM); + goto out; + } + + endBuf = buf + bufLen; + + for (sp = stringP, dp = buf; sp < end; sp++) { + char c; + + if ((dp+sepLen) >= endBuf) { + char *newBuf; + + bufLen = bufLen * 2; + newBuf = (char *)realloc(buf, bufLen); + if (newBuf == NULL) { + free(buf); + error = __mkSmallInteger(ENOMEM); + goto out; + } + endBuf = newBuf + bufLen; + dp = newBuf + (dp-buf); + buf = newBuf; + } + + if ((c = *sp) == '\n') { + *dp++ = sep[0]; + if (sepLen == 2) { + *dp++ = sep[1]; + }; + } else { + *dp++ = c; + } + } + + len = dp - buf; #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(buf, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(buf, 1, len, f); + } else #endif - { - __WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType)); - } - free(buf); - } else { // No EOL conversion needed + { + __WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType)); + } + free(buf); + } else { // No EOL conversion needed #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(stringP, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(stringP, 1, len, f); + } else #endif - { - o_offs = (char *)__stringVal(aCollection)-(char *)__InstPtr(aCollection); - __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs+iStart-1, len, _buffered, __INST(handleType)); - } - } - } else { // Not a string - if (__INST(binary) == true) { - int offs; - - if (__isByteArrayLike(aCollection)) { - offs = 0; - len = __byteArraySize(aCollection); - } else if (__isBytes(aCollection)) { - offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars)); - len = __byteArraySize(aCollection) - offs; - } else - goto out; - - if (iStop > len) { - RETURN(self); - } - if (iStop > len) - iStop = len; - len = iStop - iStart + 1; - offs += iStart - 1; + { + o_offs = (char *)__stringVal(aCollection)-(char *)__InstPtr(aCollection); + __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs+iStart-1, len, _buffered, __INST(handleType)); + } + } + } else { // Not a string + if (__INST(binary) == true) { + int offs; + + if (__isByteArrayLike(aCollection)) { + offs = 0; + len = __byteArraySize(aCollection); + } else if (__isBytes(aCollection)) { + offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars)); + len = __byteArraySize(aCollection) - offs; + } else + goto out; + + if (iStop > len) { + RETURN(self); + } + if (iStop > len) + iStop = len; + len = iStop - iStart + 1; + offs += iStart - 1; #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(__stringVal(aCollection)+iStart-1, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(__stringVal(aCollection)+iStart-1, 1, len, f); + } else #endif - { - o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element)-(char *)__InstPtr(aCollection); - __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs+offs, len, _buffered, __INST(handleType)); - } - } else - goto out; - } - if (cnt == len) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + len; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN (self); - } - error = __mkSmallInteger(__threadErrno); - } + { + o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element)-(char *)__InstPtr(aCollection); + __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs+offs, len, _buffered, __INST(handleType)); + } + } else + goto out; + } + if (cnt == len) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + len; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN (self); + } + error = __mkSmallInteger(__threadErrno); + } } out: ; %}. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ self + lastErrorNumber := error. + self writeError:error. + ^ self ]. ^ super nextPutAll:aCollection startingAt:start to:stop ! @@ -6287,11 +6296,11 @@ This is needed, so that you can do ('something' asUnicode16String errorPrintCR)" aString do:[:eachCharacter| - self nextPutUtf8:eachCharacter. + self nextPutUtf8:eachCharacter. ]. " - 'Bönnigheim' asUnicode16String errorPrintCR + 'Bönnigheim' asUnicode16String errorPrintCR " ! @@ -6304,9 +6313,9 @@ Use with care - non object oriented i/o. Warning: - in general, you cannot use this method to pass non-byte data to other - architectures (unless you prepared the buffer with care), - since it does not care for byte order or float representation." + in general, you cannot use this method to pass non-byte data to other + architectures (unless you prepared the buffer with care), + since it does not care for byte order or float representation." |error| @@ -6316,16 +6325,16 @@ STObject handle = self.instVarAt(I_handle); if (anObject.isSTString()) { - char[] chars = anObject.asSTString().characters; - handle.writeCharacters(chars, start.intValue()-1, count.intValue()); - self.instVarAt_put(I_position, STObject.Nil); - return context._RETURN(count); + char[] chars = anObject.asSTString().characters; + handle.writeCharacters(chars, start.intValue()-1, count.intValue()); + self.instVarAt_put(I_position, STObject.Nil); + return context._RETURN(count); } if (anObject.isSymbol()) { - java.lang.String chars = anObject.asSTSymbol().characters; - handle.writeString(chars, start.intValue()-1, count.intValue()); - self.instVarAt_put(I_position, STObject.Nil); - return context._RETURN(count); + java.lang.String chars = anObject.asSTSymbol().characters; + handle.writeString(chars, start.intValue()-1, count.intValue()); + self.instVarAt_put(I_position, STObject.Nil); + return context._RETURN(count); } #else int ret; @@ -6339,121 +6348,121 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - && __bothSmallInteger(count, start) - ) { - int _buffered = (__INST(buffered) == true); - FILEPOINTER f = __FILEVal(fp); - int len = __intVal(count); - int offs = __intVal(start) - 1; - - if (__isExternalBytesLike(anObject)) { - OBJ sz; - - nInstBytes = 0; - extPtr = (char *)__externalBytesAddress(anObject); - if (extPtr == NULL) goto bad; - sz = __externalBytesSize(anObject); - if (__isSmallInteger(sz)) { - objSize = __intVal(sz); - } else { - objSize = 0; /* unknown */ - } - } else { - OBJ oClass = __Class(anObject); - int nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); - - nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars); - switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) { - case BYTEARRAY: - case WORDARRAY: - case LONGARRAY: - case SWORDARRAY: - case SLONGARRAY: - case FLOATARRAY: - break; - case DOUBLEARRAY: + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + && __bothSmallInteger(count, start) + ) { + int _buffered = (__INST(buffered) == true); + FILEPOINTER f = __FILEVal(fp); + int len = __intVal(count); + int offs = __intVal(start) - 1; + + if (__isExternalBytesLike(anObject)) { + OBJ sz; + + nInstBytes = 0; + extPtr = (char *)__externalBytesAddress(anObject); + if (extPtr == NULL) goto bad; + sz = __externalBytesSize(anObject); + if (__isSmallInteger(sz)) { + objSize = __intVal(sz); + } else { + objSize = 0; /* unknown */ + } + } else { + OBJ oClass = __Class(anObject); + int nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars); + + nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars); + switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) { + case BYTEARRAY: + case WORDARRAY: + case LONGARRAY: + case SWORDARRAY: + case SLONGARRAY: + case FLOATARRAY: + break; + case DOUBLEARRAY: # ifdef __NEED_DOUBLE_ALIGN - nInstBytes = (nInstBytes-1+__DOUBLE_ALIGN) &~ (__DOUBLE_ALIGN-1); + nInstBytes = (nInstBytes-1+__DOUBLE_ALIGN) &~ (__DOUBLE_ALIGN-1); # endif - break; - case LONGLONGARRAY: - case SLONGLONGARRAY: + break; + case LONGLONGARRAY: + case SLONGLONGARRAY: # ifdef __NEED_LONGLONG_ALIGN - nInstBytes = (nInstBytes-1+__LONGLONG_ALIGN) &~ (__LONGLONG_ALIGN-1); + nInstBytes = (nInstBytes-1+__LONGLONG_ALIGN) &~ (__LONGLONG_ALIGN-1); # endif - break; - default: - goto bad; - } - extPtr = (char *)0; - objSize = __Size(anObject) - nInstBytes; - } - if ( (offs >= 0) && (len >= 0) && (objSize >= (len + offs)) ) { - int cnt; - - if (_buffered) { - __WRITING__(f) - } - - if (extPtr) { + break; + default: + goto bad; + } + extPtr = (char *)0; + objSize = __Size(anObject) - nInstBytes; + } + if ( (offs >= 0) && (len >= 0) && (objSize >= (len + offs)) ) { + int cnt; + + if (_buffered) { + __WRITING__(f) + } + + if (extPtr) { #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(extPtr+offs, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(extPtr+offs, 1, len, f); + } else # endif - { - __WRITEBYTES__(cnt, f, extPtr+offs, len, _buffered, __INST(handleType)); - } - } else { - /* - * on interrupt, anObject may be moved to another location. - * So we pass anObject, and the offset to the __WRITEBYTES_OBJ__ macro. - */ - offs += nInstBytes; + { + __WRITEBYTES__(cnt, f, extPtr+offs, len, _buffered, __INST(handleType)); + } + } else { + /* + * on interrupt, anObject may be moved to another location. + * So we pass anObject, and the offset to the __WRITEBYTES_OBJ__ macro. + */ + offs += nInstBytes; #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite((char *)anObject+offs, 1, len, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite((char *)anObject+offs, 1, len, f); + } else # endif - { - __WRITEBYTES_OBJ__(cnt, f, anObject, offs, len, _buffered, __INST(handleType)); - } - } - - if (cnt >= 0) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + cnt; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN ( __mkSmallInteger(cnt) ); - } else /* cnt < 0 */ { - if ( + { + __WRITEBYTES_OBJ__(cnt, f, anObject, offs, len, _buffered, __INST(handleType)); + } + } + + if (cnt >= 0) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + cnt; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN ( __mkSmallInteger(cnt) ); + } else /* cnt < 0 */ { + if ( # ifdef EWOULDBLOCK - (__threadErrno == EWOULDBLOCK) || + (__threadErrno == EWOULDBLOCK) || # endif - (__threadErrno == EAGAIN) - ) { - RETURN ( __mkSmallInteger(0) ); - } - __INST(position) = nil; /* i.e. do not know */ - error = __mkSmallInteger(__threadErrno); - } - } - } + (__threadErrno == EAGAIN) + ) { + RETURN ( __mkSmallInteger(0) ); + } + __INST(position) = nil; /* i.e. do not know */ + error = __mkSmallInteger(__threadErrno); + } + } + } } bad: ; #endif /* not SCHTEAM */ %}. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ 0 + lastErrorNumber := error. + self writeError:error. + ^ 0 ]. handle isNil ifTrue:[self errorNotOpen. ^ 0]. (mode == #readonly) ifTrue:[self errorReadOnly. ^ 0]. @@ -6476,27 +6485,27 @@ codePoint := aCharacter codePoint. (codePoint <= 16rD7FF or:[codePoint >= 16rE000 and:[codePoint <= 16rFFFF]]) ifTrue:[ - self nextPutShort:codePoint MSB:true. + self nextPutShort:codePoint MSB:true. ] ifFalse:[codePoint <= 16r10FFFF ifTrue:[ - |highBits lowBits| - - codePoint := codePoint - 16r100000. - highBits := codePoint bitShift:-10. - lowBits := codePoint bitAnd:16r3FF. - self nextPutShort:highBits+16rD800 MSB:true. - self nextPutShort:lowBits+16rDC00 MSB:true. + |highBits lowBits| + + codePoint := codePoint - 16r100000. + highBits := codePoint bitShift:-10. + lowBits := codePoint bitAnd:16r3FF. + self nextPutShort:highBits+16rD800 MSB:true. + self nextPutShort:lowBits+16rDC00 MSB:true. ] ifFalse:[ - EncodingError raiseWith:aCharacter errorString:'Character cannot be encoded as UTF-16'. + EncodingError raiseWith:aCharacter errorString:'Character cannot be encoded as UTF-16'. ]]. " - (FileStream newTemporary - nextPutUtf16:$B; - nextPutUtf16:$Ä; - nextPutUtf16:(Character codePoint:16r10CCCC); - reset; - binary; - contents) + (FileStream newTemporary + nextPutUtf16:$B; + nextPutUtf16:$Ä; + nextPutUtf16:(Character codePoint:16r10CCCC); + reset; + binary; + contents) " ! @@ -6514,84 +6523,84 @@ || (__INST(handleType) == @symbol(socketFilePointer)) || (__INST(handleType) == @symbol(socketHandle)) || (__INST(handleType) == @symbol(pipeFilePointer))) { - if (((fp = __INST(handle)) != nil) - && (__INST(mode) != @symbol(readonly)) - ) { - unsigned char c; - int _buffered = (__INST(buffered) == true); - FILEPOINTER f = __FILEVal(fp); - - if (__INST(binary) != true) { - if (__isCharacter(aCharacter)) { - unsigned codePoint = __intVal(__characterVal(aCharacter)); - - if (codePoint <= 0xFF) { - int cnt; - - c = codePoint; + if (((fp = __INST(handle)) != nil) + && (__INST(mode) != @symbol(readonly)) + ) { + unsigned char c; + int _buffered = (__INST(buffered) == true); + FILEPOINTER f = __FILEVal(fp); + + if (__INST(binary) != true) { + if (__isCharacter(aCharacter)) { + unsigned codePoint = __intVal(__characterVal(aCharacter)); + + if (codePoint <= 0xFF) { + int cnt; + + c = codePoint; doWrite: - if (! f) { - fprintf(stderr, "oops - fileHandle is NULL in nextPut:\n"); - __INST(handle) = nil; - goto out; - } - - if (_buffered) { - __WRITING__(f) - } + if (! f) { + fprintf(stderr, "oops - fileHandle is NULL in nextPut:\n"); + __INST(handle) = nil; + goto out; + } + + if (_buffered) { + __WRITING__(f) + } #if defined(WIN32) && !defined(__MINGW__) - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - cnt = __win32_fwrite(&c, 1, 1, f); - } else + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + cnt = __win32_fwrite(&c, 1, 1, f); + } else #endif - __WRITEBYTE__(cnt, f, &c, _buffered, __INST(handleType)); - if (cnt == 1) { - if (__isSmallInteger(__INST(position))) { - INT np = __intVal(__INST(position)) + 1; - OBJ t; - - t = __MKINT(np); __INST(position) = t; __STORE(self, t); - } else { - __INST(position) = nil; /* i.e. do not know */ - } - RETURN ( self ); - } - error = __mkSmallInteger(__threadErrno); - } - } - } else { - if (__isSmallInteger(aCharacter)) { - c = __intVal(aCharacter); - goto doWrite; - } - } - } + __WRITEBYTE__(cnt, f, &c, _buffered, __INST(handleType)); + if (cnt == 1) { + if (__isSmallInteger(__INST(position))) { + INT np = __intVal(__INST(position)) + 1; + OBJ t; + + t = __MKINT(np); __INST(position) = t; __STORE(self, t); + } else { + __INST(position) = nil; /* i.e. do not know */ + } + RETURN ( self ); + } + error = __mkSmallInteger(__threadErrno); + } + } + } else { + if (__isSmallInteger(aCharacter)) { + c = __intVal(aCharacter); + goto doWrite; + } + } + } } out: ; %}. error notNil ifTrue:[ - lastErrorNumber := error. - self writeError:error. - ^ self + lastErrorNumber := error. + self writeError:error. + ^ self ]. handle isNil ifTrue:[self errorNotOpen. ^ self]. (mode == #readonly) ifTrue:[self errorReadOnly. ^ self]. binary == true ifFalse:[ - (aCharacter isCharacter not - or:[aCharacter codePoint > 16rFF]) ifTrue:[ - self argumentMustBeCharacter. - ^ self. - ]. + (aCharacter isCharacter not + or:[aCharacter codePoint > 16rFF]) ifTrue:[ + self argumentMustBeCharacter. + ^ self. + ]. ] ifTrue:[ - aCharacter isInteger ifFalse:[ - self argumentMustBeInteger. - ^ self. - ]. + aCharacter isInteger ifFalse:[ + self argumentMustBeInteger. + ^ self. + ]. ]. "/ migration support self - nextPutByte:aCharacter asInteger - toFile:handle + nextPutByte:aCharacter asInteger + toFile:handle ! ! !ExternalStream class methodsFor:'documentation'! diff -r 237a87b4fe8f -r 02724cc719b6 NonPositionableExternalStream.st --- a/NonPositionableExternalStream.st Thu Oct 01 06:52:24 2015 +0200 +++ b/NonPositionableExternalStream.st Fri Oct 02 06:42:49 2015 +0100 @@ -460,15 +460,15 @@ "return true, if position is at end" (self == StdInStream) ifTrue:[ - OperatingSystem hasConsole ifFalse:[ - ^ true - ] + OperatingSystem hasConsole ifFalse:[ + ^ true + ] ]. "first, wait to avoid blocking on the read. On end of stream or error, readWait will return" - self readWait. + self readWaitWithTimeoutMs:nil. ^ super atEnd. ! @@ -498,18 +498,6 @@ !NonPositionableExternalStream methodsFor:'reading'! -readWait - "cannot do a readWait (which means possible suspend), - if the processor is not yet initialized; i.e. if a read is attempted - during early startup. - This may happen, for example, if a MiniDebugger is entered, before - process scheduling has been setup. - In this case, all I/O operations here will be blocking." - - Smalltalk isInitialized ifFalse:[ ^ false ]. - ^ super readWait -! - next "return the next element, if available. If nothing is available, this does never raise a read-beyond end signal. @@ -517,14 +505,14 @@ Redefined, to wait on pipes and sockets" - self readWait. + self readWaitWithTimeoutMs:nil. ^ super next ! nextLine "Redefined, to wait on pipes and sockets" - self readWait. + self readWaitWithTimeoutMs:nil. ^ super nextLine ! @@ -542,7 +530,7 @@ peek "Redefined, to wait on pipes and sockets" - self readWait. + self readWaitWithTimeoutMs:nil. ^ super peek ! @@ -555,6 +543,18 @@ self atEnd ifTrue:[^ nil]. ^ self peek +! + +readWaitWithTimeoutMs:millisecondsOrNil + "cannot do a readWait (which means possible suspend), + if the processor is not yet initialized; i.e. if a read is attempted + during early startup. + This may happen, for example, if a MiniDebugger is entered, before + process scheduling has been setup. + In this case, all I/O operations here will be blocking." + + Smalltalk isInitialized ifFalse:[ ^ false ]. + ^ super readWaitWithTimeoutMs:millisecondsOrNil ! ! !NonPositionableExternalStream methodsFor:'writing'! @@ -607,10 +607,10 @@ !NonPositionableExternalStream class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/NonPositionableExternalStream.st,v 1.75 2015-05-24 12:51:37 cg Exp $' + ^ '$Header$' ! version_CVS - ^ '$Header: /cvs/stx/stx/libbasic/NonPositionableExternalStream.st,v 1.75 2015-05-24 12:51:37 cg Exp $' + ^ '$Header$' ! ! diff -r 237a87b4fe8f -r 02724cc719b6 Object.st --- a/Object.st Thu Oct 01 06:52:24 2015 +0200 +++ b/Object.st Fri Oct 02 06:42:49 2015 +0100 @@ -520,6 +520,8 @@ + + !Object methodsFor:'Compatibility-Dolphin'! stbFixup: anSTBInFiler at: newObjectIndex @@ -696,6 +698,7 @@ ! ! + !Object methodsFor:'accessing'! _at:index @@ -1758,6 +1761,8 @@ " ! ! + + !Object methodsFor:'attributes access'! objectAttributeAt:attributeKey @@ -1880,6 +1885,7 @@ ! ! + !Object methodsFor:'change & update'! broadcast:aSelectorSymbol @@ -8616,12 +8622,12 @@ sema := self synchronizationSemaphore. sema isNil ifTrue:[ - sema := RecursionLock new name:self className. - self synchronizationSemaphore:sema. + sema := RecursionLock new name:self className. + self synchronizationSemaphore:sema. ]. wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. - sema critical:aBlock. + ^ sema critical:aBlock. " [Object synchronized:[Delay waitForSeconds:2. Transcript showCR:'1']] fork. @@ -10299,6 +10305,7 @@ + !Object class methodsFor:'documentation'! version diff -r 237a87b4fe8f -r 02724cc719b6 ObjectMemory.st --- a/ObjectMemory.st Thu Oct 01 06:52:24 2015 +0200 +++ b/ObjectMemory.st Fri Oct 02 06:42:49 2015 +0100 @@ -2796,6 +2796,43 @@ !ObjectMemory class methodsFor:'garbage collector control'! +allowTenureOf:anObject + "set the age of anObject back to 0 so it may eventually tenure + into old space. + This should only be used in very special situations. + One such situation may be to ensure that an object is finalized early by the next + scavenge, and not by a (possibly late) old space collect. + To undo this setup (i.e. to allow the object to tenure again), set its age back to + any value with the seatAgeOf:to: message. + If the object is already old, this call has no effect. + WARNING: this method is for ST/X experts only + it is dangerous, should be used with care + and it may be removed without notice" + + + self setAgeOf:anObject to:0 + + " + |p| + p := Point new. + Transcript showCR:(ObjectMemory preventTenureOf:p). + ObjectMemory tenuringScavenge. + Transcript showCR:(ObjectMemory ageOf:p). + ObjectMemory tenure. + Transcript showCR:(ObjectMemory ageOf:p). + ObjectMemory tenure. + ObjectMemory tenure. + ObjectMemory tenure. + Transcript showCR:(ObjectMemory ageOf:p). + ObjectMemory setAgeOf:p to:30. + Transcript showCR:(ObjectMemory ageOf:p). + ObjectMemory tenure. + Transcript showCR:(ObjectMemory ageOf:p). + ObjectMemory tenure. + Transcript showCR:(ObjectMemory ageOf:p). + " +! + announceOldSpaceNeed:howMuch "announce to the memory system, that howMuch bytes of memory will be needed soon, which is going to live longer (whatever that means). diff -r 237a87b4fe8f -r 02724cc719b6 Registry.st --- a/Registry.st Thu Oct 01 06:52:24 2015 +0200 +++ b/Registry.st Fri Oct 02 06:42:49 2015 +0100 @@ -11,6 +11,8 @@ " "{ Package: 'stx:libbasic' }" +"{ NameSpace: Smalltalk }" + Object subclass:#Registry instanceVariableNames:'registeredObjects handleArray tally indexTable' classVariableNames:'' @@ -276,6 +278,15 @@ isEmpty ^ tally == 0 +! + +size + "answer the number of entries in the registry" + + tally isNil ifTrue:[ + ^ 0. + ]. + ^ tally ! ! !Registry methodsFor:'registering objects'! @@ -454,15 +465,14 @@ |index wasBlocked| registeredObjects notNil ifTrue:[ - wasBlocked := OperatingSystem blockInterrupts. - "/ index := registeredObjects identityIndexOf:anObject ifAbsent:0. - index := indexTable at:anObject ifAbsent:0. - index ~~ 0 ifTrue:[ - self unregister:anObject atIndex:index. - ]. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. - - self resize + wasBlocked := OperatingSystem blockInterrupts. + "/ index := registeredObjects identityIndexOf:anObject ifAbsent:0. + index := indexTable at:anObject ifAbsent:0. + index ~~ 0 ifTrue:[ + self unregister:anObject atIndex:index. + self resize. + ]. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ] "Modified: 16.1.1997 / 18:08:42 / cg" @@ -478,21 +488,21 @@ obj wasBlocked any| registeredObjects notNil ifTrue:[ - any := false. - wasBlocked := OperatingSystem blockInterrupts. - n := registeredObjects size. + any := false. + wasBlocked := OperatingSystem blockInterrupts. + n := registeredObjects size. - 1 to:n do:[:index | - obj := registeredObjects at:index. - (obj notNil and:[obj class ~~ SmallInteger]) ifTrue:[ - (aBlock value:obj) ifTrue:[ - self unregister:obj atIndex:index. - any := true. - ] - ] - ]. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. - any ifTrue:[ self resize ] + 1 to:n do:[:index | + obj := registeredObjects at:index. + (obj notNil and:[obj class ~~ SmallInteger]) ifTrue:[ + (aBlock value:obj) ifTrue:[ + self unregister:obj atIndex:index. + any := true. + ] + ] + ]. + any ifTrue:[ self resize ]. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ] "Created: 16.1.1997 / 16:39:18 / cg" @@ -504,22 +514,22 @@ obj handle wasBlocked any| registeredObjects notNil ifTrue:[ - any := false. - wasBlocked := OperatingSystem blockInterrupts. - n := registeredObjects size. + any := false. + wasBlocked := OperatingSystem blockInterrupts. + n := registeredObjects size. - 1 to:n do:[:index | - obj := registeredObjects at:index. - handle := handleArray at:index. - handle notNil ifTrue:[ - (aBlock value:handle) ifTrue:[ - self unregister:obj atIndex:index. - any := true. - ] - ] - ]. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. - any ifTrue:[ self resize ] + 1 to:n do:[:index | + obj := registeredObjects at:index. + handle := handleArray at:index. + handle notNil ifTrue:[ + (aBlock value:handle) ifTrue:[ + self unregister:obj atIndex:index. + any := true. + ] + ] + ]. + any ifTrue:[ self resize ]. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ] ! ! diff -r 237a87b4fe8f -r 02724cc719b6 Smalltalk.st --- a/Smalltalk.st Thu Oct 01 06:52:24 2015 +0200 +++ b/Smalltalk.st Fri Oct 02 06:42:49 2015 +0100 @@ -1,3 +1,5 @@ +"{ Encoding: utf8 }" + " COPYRIGHT (c) 1988 by Claus Gittinger All Rights Reserved @@ -7934,6 +7936,21 @@ " ! +requirePackage:aPackageIdOrPackage + "make certain, that some particular package is loaded into the system. + Return true if loaded, false otherwise. + Just an alias which is easier to remember" + + ^ self loadPackage:aPackageIdOrPackage + + " + Smalltalk loadPackage:'stx:libbasic' + Smalltalk loadPackage:'stx:goodies/persistency' + Smalltalk loadPackage:'cg:cparser' + Smalltalk loadPackage:'cg:rose' + " +! + unloadPackage:aPackageIdOrPackage |projectDefinition| @@ -8085,13 +8102,13 @@ (lang == #de) ifTrue:[ proto := 'Willkommen bei %1 (Version %2 von %3)' ] ifFalse:[ (lang == #fr) ifTrue:[ - proto := 'Salut, Bienvenue à %1 (version %2 de %3)' + proto := 'Salut, Bienvenue à %1 (version %2 de %3)' ] ifFalse:[ (lang == #it) ifTrue:[ proto := 'Ciao, benvenuto al %1 (versione %2 di %3)' ] ifFalse:[ (lang == #es) ifTrue:[ -"/ proto := 'Hola, bienvenida a %1 (versión %2 de %3)' +"/ proto := 'Hola, bienvenida a %1 (versión %2 de %3)' ] ifFalse:[ (lang == #es) ifTrue:[ -"/ proto := 'Oi, benvindo a %1 (versão %2 de %3)' +"/ proto := 'Oi, benvindo a %1 (versão %2 de %3)' ] ifFalse:[ (lang == #no) ifTrue:[ proto := 'Hei, verdenmottakelse til %1 (versjon %2 av %3)' ]]]]]].