--- a/ExternalStream.st Thu Apr 25 10:29:51 1996 +0200
+++ b/ExternalStream.st Thu Apr 25 10:35:28 1996 +0200
@@ -10,8 +10,6 @@
hereby transferred.
"
-'From Smalltalk/X, Version:2.10.9 on 7-mar-1996 at 11:06:07' !
-
ReadWriteStream subclass:#ExternalStream
instanceVariableNames:'filePointer mode buffered binary useCRLF hitEOF didWrite
lastErrorNumber'
@@ -853,117 +851,117 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if (__INST(binary) != true) {
- f = __FILEVal(fp);
- __BEGIN_INTERRUPTABLE__
- buffer[0] = 0;
-
- _buffered = (__INST(buffered) == true);
- if (_buffered) {
- __READING__(f);
- } else {
- fd = fileno(f);
- }
-
- /*
- * mhmh - the following code looks ok to me,
- * but seems not to work for sockets
- */
+ if (__INST(binary) != true) {
+ f = __FILEVal(fp);
+ __BEGIN_INTERRUPTABLE__
+ buffer[0] = 0;
+
+ _buffered = (__INST(buffered) == true);
+ if (_buffered) {
+ __READING__(f);
+ } else {
+ fd = fileno(f);
+ }
+
+ /*
+ * mhmh - the following code looks ok to me,
+ * but seems not to work for sockets
+ */
#ifdef DOES_NOT_WORK
- if (__INST(mode) == _readwrite)
- fseek(f, 0L, SEEK_CUR); /* needed in stdio */
- do {
- rslt = fgets(buffer, sizeof(buffer), f);
- } while ((rslt == NULL) && (errno == EINTR));
+ if (__INST(mode) == _readwrite)
+ fseek(f, 0L, SEEK_CUR); /* needed in stdio */
+ do {
+ rslt = fgets(buffer, sizeof(buffer), f);
+ } while ((rslt == NULL) && (errno == EINTR));
#else
- rslt = nextPtr = buffer;
- limit = buffer + sizeof(buffer) - 2;
-
- for (;;) {
- if (_buffered) {
- errno = 0;
- do {
- if (feof(f)) {
- ch = EOF;
- break;
- }
- ch = getc(f);
- } while ((ch < 0) && (errno == EINTR));
-
- if (ch == EOF) {
- if (ferror(f)) {
- if (errno == EINTR) {
- clearerr(f);
- if (! feof(f)) {
- continue;
- }
- }
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- }
- len = 0;
- } else {
- len = 1;
- *nextPtr = ch;
- }
- } else {
- do {
- errno = 0;
- len = read(fd, nextPtr, 1);
- } while ((len < 0) && (errno == EINTR));
- }
- if (len <= 0) {
- if (nextPtr == buffer) {
- rslt = NULL;
- } else {
- *nextPtr = '\0';
- }
- break;
- }
- if (*nextPtr == '\n') {
- *nextPtr = '\0';
- break;
- }
- nextPtr++;
- if (nextPtr >= limit) {
- *nextPtr = '\0';
- fprintf(stderr, "EXTSTREAM: line truncated in nextLine\n");
- break;
- }
- }
+ rslt = nextPtr = buffer;
+ limit = buffer + sizeof(buffer) - 2;
+
+ for (;;) {
+ if (_buffered) {
+ errno = 0;
+ do {
+ if (feof(f)) {
+ ch = EOF;
+ break;
+ }
+ ch = getc(f);
+ } while ((ch < 0) && (errno == EINTR));
+
+ if (ch == EOF) {
+ if (ferror(f)) {
+ if (errno == EINTR) {
+ clearerr(f);
+ if (! feof(f)) {
+ continue;
+ }
+ }
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ }
+ len = 0;
+ } else {
+ len = 1;
+ *nextPtr = ch;
+ }
+ } else {
+ do {
+ errno = 0;
+ len = read(fd, nextPtr, 1);
+ } while ((len < 0) && (errno == EINTR));
+ }
+ if (len <= 0) {
+ if (nextPtr == buffer) {
+ rslt = NULL;
+ } else {
+ *nextPtr = '\0';
+ }
+ break;
+ }
+ if (*nextPtr == '\n') {
+ *nextPtr = '\0';
+ break;
+ }
+ nextPtr++;
+ if (nextPtr >= limit) {
+ *nextPtr = '\0';
+ fprintf(stderr, "EXTSTREAM: line truncated in nextLine\n");
+ break;
+ }
+ }
#endif
- __END_INTERRUPTABLE__
-
- if (rslt != NULL) {
- /*
- * that strlen can be avoided and replaced by (nextPtr - buffer)
- */
- /* len = strlen(buffer); */
- len = nextPtr-buffer;
-
- if (__INST(position) != nil) {
- __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + len);
- }
- /* remove EOL character */
- if (len != 0) {
- if (buffer[len-1] == '\n') {
- buffer[--len] = '\0';
- }
- if ((len != 0) && (buffer[len-1] == '\r')) {
- buffer[--len] = '\0';
- }
- }
- RETURN ( __MKSTRING_L(buffer, len COMMA_CON) );
- }
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- } else {
- __INST(hitEOF) = true;
- RETURN ( nil );
- }
- }
+ __END_INTERRUPTABLE__
+
+ if (rslt != NULL) {
+ /*
+ * that strlen can be avoided and replaced by (nextPtr - buffer)
+ */
+ /* len = strlen(buffer); */
+ len = nextPtr-buffer;
+
+ if (__INST(position) != nil) {
+ __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + len);
+ }
+ /* remove EOL character */
+ if (len != 0) {
+ if (buffer[len-1] == '\n') {
+ buffer[--len] = '\0';
+ }
+ if ((len != 0) && (buffer[len-1] == '\r')) {
+ buffer[--len] = '\0';
+ }
+ }
+ RETURN ( __MKSTRING_L(buffer, len COMMA_CON) );
+ }
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ __INST(hitEOF) = true;
+ }
+ }
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
@@ -1449,39 +1447,41 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- f = __FILEVal(fp);
-
- if (__INST(buffered) == true) {
- __READING__(f)
- }
-
- __BEGIN_INTERRUPTABLE__
- do {
- if (__INST(buffered) == false) {
- cnt = read(fileno(f), &byte, 1);
- } else {
- cnt = fread(&byte, 1, 1, f);
- }
- } while ((cnt < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
-
- if (cnt == 1) {
- if (__INST(position) != nil)
- __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + 1);
- RETURN ( __MKSMALLINT(byte) );
- }
- if (cnt == 0) {
- __INST(hitEOF) = true;
+ f = __FILEVal(fp);
+
+ if (__INST(buffered) == true) {
+ __READING__(f)
+ }
+
+ __BEGIN_INTERRUPTABLE__
+ do {
+ if (__INST(buffered) == false) {
+ cnt = read(fileno(f), &byte, 1);
+ } else {
+ cnt = fread(&byte, 1, 1, f);
+ }
+ } while ((cnt < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
+
+ if (cnt == 1) {
+ if (__INST(position) != nil)
+ __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + 1);
+ RETURN ( __MKSMALLINT(byte) );
+ }
+ if (cnt == 0) {
+ __INST(hitEOF) = true;
/*
- if (errno == EWOULDBLOCK) {
- RETURN (nil);
- }
+ if (errno == EWOULDBLOCK) {
+ RETURN (nil);
+ }
*/
- }
- __INST(position) = nil;
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else if (cnt < 0) {
+ __INST(position) = nil;
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ }
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
^ self errorWriteOnly
@@ -1533,85 +1533,85 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if (__bothSmallInteger(count, start)) {
- f = __FILEVal(fp);
-
- oClass = __Class(anObject);
- switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
- case BYTEARRAY:
- case WORDARRAY:
- case LONGARRAY:
- case FLOATARRAY:
- case DOUBLEARRAY:
- break;
- default:
- goto bad;
- }
- cnt = __intVal(count);
- offs = __intVal(start) - 1;
- nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
- nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
- objSize = __Size(anObject) - nInstBytes;
- if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) {
- /*
- * mhmh - since we are interruptable, anObject may move.
- * therefore, fetch the cp-pointer within the loop
- */
- if (__INST(buffered) == true) {
- __READING__(f)
- }
-
- for (;;) {
- errno = 0;
- /*
- * because we are interruptable, refetch pointer
- */
- cp = (char *)__InstPtr(anObject) + nInstBytes + offs;
- if (__INST(buffered) == false) {
- ret = read(fileno(f), cp, cnt);
- } else {
- if (feof(f)) {
- ret = 0;
- break;
- }
- ret = fread(cp, 1, cnt, f);
- }
- if (ret < 0) {
- if (errno == EINTR) {
- __HANDLE_INTERRUPTS__
- continue;
- }
- else
- break;
- }
- cnt -= ret;
- if (cnt == 0 || ret == 0)
- break;
- offs += ret;
- __HANDLE_INTERRUPTS__
- }
-
- cnt = __intVal(count) - cnt;
-
- if (cnt > 0) {
- pos = __INST(position);
- if (pos != nil) {
- __INST(position) = __MKSMALLINT(__intVal(pos) + cnt);
- }
- RETURN (__MKSMALLINT(cnt));
- }
- if (cnt == 0) {
- __INST(hitEOF) = true;
- RETURN (__MKSMALLINT(cnt));
- }
-
- __INST(position) = nil;
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- }
- }
+ if (__bothSmallInteger(count, start)) {
+ f = __FILEVal(fp);
+
+ oClass = __Class(anObject);
+ switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
+ case BYTEARRAY:
+ case WORDARRAY:
+ case LONGARRAY:
+ case FLOATARRAY:
+ case DOUBLEARRAY:
+ break;
+ default:
+ goto bad;
+ }
+ cnt = __intVal(count);
+ offs = __intVal(start) - 1;
+ nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
+ nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
+ objSize = __Size(anObject) - nInstBytes;
+ if ((offs >= 0) && (cnt >= 0) && (objSize >= (cnt + offs))) {
+ /*
+ * mhmh - since we are interruptable, anObject may move.
+ * therefore, fetch the cp-pointer within the loop
+ */
+ if (__INST(buffered) == true) {
+ __READING__(f)
+ }
+
+ for (;;) {
+ errno = 0;
+ /*
+ * because we are interruptable, refetch pointer
+ */
+ cp = (char *)__InstPtr(anObject) + nInstBytes + offs;
+ if (__INST(buffered) == false) {
+ ret = read(fileno(f), cp, cnt);
+ } else {
+ if (feof(f)) {
+ ret = 0;
+ break;
+ }
+ ret = fread(cp, 1, cnt, f);
+ }
+ if (ret < 0) {
+ if (errno == EINTR) {
+ __HANDLE_INTERRUPTS__
+ continue;
+ }
+ else
+ break;
+ }
+ cnt -= ret;
+ if (cnt == 0 || ret == 0)
+ break;
+ offs += ret;
+ __HANDLE_INTERRUPTS__
+ }
+
+ cnt = __intVal(count) - cnt;
+
+ if (cnt > 0) {
+ pos = __INST(position);
+ if (pos != nil) {
+ __INST(position) = __MKSMALLINT(__intVal(pos) + cnt);
+ }
+ RETURN (__MKSMALLINT(cnt));
+ }
+ if (cnt == 0) {
+ __INST(hitEOF) = true;
+ } else /* cnt < 0 */ {
+ __INST(position) = nil;
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ }
+ }
+ }
}
bad: ;
%}.
+ (hitEOF and:[self pastEnd isNil]) ifTrue:[^ 0].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
@@ -1694,10 +1694,6 @@
if (__INST(buffered) == false) {
ret = read(fileno(f), buffer+offs, cnt);
} else {
- if (feof(f)) {
- ret = 0;
- break;
- }
ret = fread(buffer+offs, 1, cnt, f);
}
if (ret < 0) {
@@ -1741,10 +1737,10 @@
__INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
__INST(hitEOF) = true;
- RETURN (nil);
}
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
^ self readError.
@@ -1776,10 +1772,6 @@
if (__INST(buffered) == false) {
ret = read(fileno(f), buffer+offs, cnt);
} else {
- if (feof(f)) {
- ret = 0;
- break;
- }
ret = fread(buffer+offs, 1, cnt, f);
}
if (ret < 0) {
@@ -1814,10 +1806,10 @@
__INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
__INST(hitEOF) = true;
- RETURN (nil);
}
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
^ self readError.
@@ -1849,10 +1841,6 @@
if (__INST(buffered) == false) {
ret = read(fileno(f), buffer+offs, cnt);
} else {
- if (feof(f)) {
- ret = 0;
- break;
- }
ret = fread(buffer+offs, 1, cnt, f);
}
if (ret < 0) {
@@ -1896,10 +1884,10 @@
__INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
__INST(hitEOF) = true;
- RETURN (nil);
}
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
^ self readError.
@@ -1930,10 +1918,6 @@
if (__INST(buffered) == false) {
ret = read(fileno(f), buffer+offs, cnt);
} else {
- if (feof(f)) {
- ret = 0;
- break;
- }
ret = fread(buffer+offs, 1, cnt, f);
}
if (ret < 0) {
@@ -1968,10 +1952,10 @@
__INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
__INST(hitEOF) = true;
- RETURN (nil);
}
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
^ self readError.
@@ -2444,10 +2428,10 @@
__INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
__INST(hitEOF) = true;
- RETURN ( nil );
}
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
self errorWriteOnly
@@ -2482,36 +2466,34 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
-#ifdef OLD
- if (__INST(buffered) == true)
-#endif
- {
- f = __FILEVal(fp);
-
- __BEGIN_INTERRUPTABLE__
- __READING__(f)
-
- do {
- c = getc(f);
- } while ((c < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
-
- if (c != EOF) {
- ungetc(c, f);
- if (__INST(binary) == true) {
- RETURN ( __MKSMALLINT(c & 0xFF) );
- }
- RETURN ( __MKCHARACTER(c & 0xFF) );
- }
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- } else {
- __INST(hitEOF) = true;
- RETURN ( nil );
- }
- }
+ if (__INST(buffered) == true)
+ {
+ f = __FILEVal(fp);
+
+ __BEGIN_INTERRUPTABLE__
+ __READING__(f)
+
+ do {
+ c = getc(f);
+ } while ((c < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
+
+ if (c != EOF) {
+ ungetc(c, f);
+ if (__INST(binary) == true) {
+ RETURN ( __MKSMALLINT(c & 0xFF) );
+ }
+ RETURN ( __MKCHARACTER(c & 0xFF) );
+ }
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ __INST(hitEOF) = true;
+ }
+ }
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
buffered ifFalse:[^ self errorNotBuffered].
@@ -2537,80 +2519,80 @@
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- f = __FILEVal(fp);
- __BEGIN_INTERRUPTABLE__
- __READING__(f)
-
- /*
- * skip whiteSpace first ...
- */
- for (;;) {
- do {
- ch = getc(f);
- } while ((ch < 0) && (errno == EINTR));
-
- if (ch < 0) {
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- __END_INTERRUPTABLE__
- goto err;
- }
- __INST(hitEOF) = true;
- break;
- }
- cnt++;
+ f = __FILEVal(fp);
+ __BEGIN_INTERRUPTABLE__
+ __READING__(f)
+
+ /*
+ * skip whiteSpace first ...
+ */
+ for (;;) {
+ do {
+ ch = getc(f);
+ } while ((ch < 0) && (errno == EINTR));
+
+ if (ch < 0) {
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ __END_INTERRUPTABLE__
+ goto err;
+ }
+ __INST(hitEOF) = true;
+ break;
+ }
+ cnt++;
#ifndef NON_ASCII
- if (ch >= ' ') break;
+ if (ch >= ' ') break;
#endif
- if ((ch != ' ') && (ch != '\t') && (ch != '\r')
- && (ch != '\n') && (ch != 0x0b)) break;
- }
- ungetc(ch, f);
- cnt--;
-
- len = 0;
- for (;;) {
- do {
- ch = getc(f);
- } while ((ch < 0) && (errno == EINTR));
- if (ch < 0) {
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- __END_INTERRUPTABLE__
- goto err;
- }
- __INST(hitEOF) = true;
- break;
- }
-
- ch &= 0xFF;
- if (! (((ch >= 'a') && (ch <= 'z')) ||
- ((ch >= 'A') && (ch <= 'Z')) ||
- ((ch >= '0') && (ch <= '9')))) {
- ungetc(ch, f);
- break;
- }
- cnt++;
- buffer[len++] = ch;
- if (len >= (sizeof(buffer)-1)) {
- /* emergency */
- break;
- }
- }
- __END_INTERRUPTABLE__
-
- if (__INST(position) != nil) {
- __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + cnt);
- }
- if (len != 0) {
- buffer[len] = '\0';
- RETURN ( __MKSTRING_L(buffer, len COMMA_CON) );
- }
- RETURN ( nil );
+ if ((ch != ' ') && (ch != '\t') && (ch != '\r')
+ && (ch != '\n') && (ch != 0x0b)) break;
+ }
+ ungetc(ch, f);
+ cnt--;
+
+ len = 0;
+ for (;;) {
+ do {
+ ch = getc(f);
+ } while ((ch < 0) && (errno == EINTR));
+ if (ch < 0) {
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ __END_INTERRUPTABLE__
+ goto err;
+ }
+ __INST(hitEOF) = true;
+ break;
+ }
+
+ ch &= 0xFF;
+ if (! (((ch >= 'a') && (ch <= 'z')) ||
+ ((ch >= 'A') && (ch <= 'Z')) ||
+ ((ch >= '0') && (ch <= '9')))) {
+ ungetc(ch, f);
+ break;
+ }
+ cnt++;
+ buffer[len++] = ch;
+ if (len >= (sizeof(buffer)-1)) {
+ /* emergency */
+ break;
+ }
+ }
+ __END_INTERRUPTABLE__
+
+ if (__INST(position) != nil) {
+ __INST(position) = __MKSMALLINT(__intVal(__INST(position)) + cnt);
+ }
+ if (len != 0) {
+ buffer[len] = '\0';
+ RETURN ( __MKSTRING_L(buffer, len COMMA_CON) );
+ }
}
err: ;
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
^ self errorWriteOnly
@@ -2653,48 +2635,43 @@
__READING__(f)
- if (feof(f)) {
- __INST(hitEOF) = true;
- RETURN (nil);
- }
-
/*
* skip spaces
*/
c = '\n';
while (! done) {
- lastC = c;
-
- __BEGIN_INTERRUPTABLE__
- do {
- c = getc(f);
- } while ((c < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
-
- atBeginOfLine = 0;
- switch (c) {
- case '\n':
- case ' ':
- case '\t':
- case '\r':
- case '\b':
- case '\014':
- break;
-
- case EOF:
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- goto err;
- }
- __INST(hitEOF) = true;
- RETURN (nil);
-
- default:
- atBeginOfLine = (lastC == '\n');
- ungetc(c, f);
- done = 1;
- break;
- }
+ lastC = c;
+
+ __BEGIN_INTERRUPTABLE__
+ do {
+ c = getc(f);
+ } while ((c < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
+
+ atBeginOfLine = 0;
+ switch (c) {
+ case '\n':
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\b':
+ case '\014':
+ break;
+
+ case EOF:
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ __INST(hitEOF) = true;
+ }
+ goto err;
+
+ default:
+ atBeginOfLine = (lastC == '\n');
+ ungetc(c, f);
+ done = 1;
+ break;
+ }
}
/*
@@ -2705,84 +2682,84 @@
index = 0;
while (! feof(f)) {
- /*
- * do we have to resize the buffer ?
- */
- if ((index+2) >= currSize) {
- OBJ newBuffer;
- char *nbp;
-
- newBuffer = __MKEMPTYSTRING(currSize * 2 COMMA_CON);
- if (newBuffer == nil) {
- /*
- * mhmh - chunk seems to be very big ....
- */
- outOfMemory = true;
- goto err;
- }
- nbp = __stringVal(newBuffer);
- if (!fastFlag) {
- /*
- * old buffer may have moved - refetch pointer
- */
- bufferPtr = __stringVal(buffer);
- }
- bcopy(bufferPtr, nbp, index);
- bufferPtr = nbp;
- bufferPtr[index] = '\0';
- buffer = newBuffer;
- fastFlag = 0;
- currSize = currSize * 2;
- }
-
- __BEGIN_INTERRUPTABLE__
- do {
- c = getc(f);
- } while (c < 0 && (errno == EINTR));
- __END_INTERRUPTABLE__
-
- if (atBeginOfLine && (c == '%')) {
- __BEGIN_INTERRUPTABLE__
- do {
- peekC = getc(f);
- } while (peekC < 0 && (errno == EINTR));
- __END_INTERRUPTABLE__
-
- ungetc(peekC, f);
- if (peekC == '{') {
- inPrimitive++;
- } else if (peekC == '}') {
- if (inPrimitive > 0) {
- inPrimitive--;
- }
- }
- } else {
- if (! inPrimitive) {
- if (c == '!') {
- __BEGIN_INTERRUPTABLE__
- do {
- c = getc(f);
- } while (c < 0 && (errno == EINTR));
- __END_INTERRUPTABLE__
-
- if (c != '!') {
- ungetc(c, f);
- break;
- }
- }
- }
- }
-
- if (c < 0) {
- __INST(hitEOF) = true;
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- goto err;
- }
- break;
- }
- bufferPtr[index++] = c;
- atBeginOfLine = (c == '\n');
+ /*
+ * do we have to resize the buffer ?
+ */
+ if ((index+2) >= currSize) {
+ OBJ newBuffer;
+ char *nbp;
+
+ newBuffer = __MKEMPTYSTRING(currSize * 2 COMMA_CON);
+ if (newBuffer == nil) {
+ /*
+ * mhmh - chunk seems to be very big ....
+ */
+ outOfMemory = true;
+ goto err;
+ }
+ nbp = __stringVal(newBuffer);
+ if (!fastFlag) {
+ /*
+ * old buffer may have moved - refetch pointer
+ */
+ bufferPtr = __stringVal(buffer);
+ }
+ bcopy(bufferPtr, nbp, index);
+ bufferPtr = nbp;
+ bufferPtr[index] = '\0';
+ buffer = newBuffer;
+ fastFlag = 0;
+ currSize = currSize * 2;
+ }
+
+ __BEGIN_INTERRUPTABLE__
+ do {
+ c = getc(f);
+ } while (c < 0 && (errno == EINTR));
+ __END_INTERRUPTABLE__
+
+ if (atBeginOfLine && (c == '%')) {
+ __BEGIN_INTERRUPTABLE__
+ do {
+ peekC = getc(f);
+ } while (peekC < 0 && (errno == EINTR));
+ __END_INTERRUPTABLE__
+
+ ungetc(peekC, f);
+ if (peekC == '{') {
+ inPrimitive++;
+ } else if (peekC == '}') {
+ if (inPrimitive > 0) {
+ inPrimitive--;
+ }
+ }
+ } else {
+ if (! inPrimitive) {
+ if (c == '!') {
+ __BEGIN_INTERRUPTABLE__
+ do {
+ c = getc(f);
+ } while (c < 0 && (errno == EINTR));
+ __END_INTERRUPTABLE__
+
+ if (c != '!') {
+ ungetc(c, f);
+ break;
+ }
+ }
+ }
+ }
+
+ if (c < 0) {
+ __INST(hitEOF) = true;
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ goto err;
+ }
+ break;
+ }
+ bufferPtr[index++] = c;
+ atBeginOfLine = (c == '\n');
}
/*
@@ -2792,27 +2769,28 @@
* fast (C) buffer or from real (ST) buffer.
*/
if (fastFlag) {
- retVal = __MKSTRING_L(bufferPtr, index COMMA_CON);
+ retVal = __MKSTRING_L(bufferPtr, index COMMA_CON);
} else {
- retVal = __MKSTRING_ST_L(buffer, index COMMA_CON);
+ retVal = __MKSTRING_ST_L(buffer, index COMMA_CON);
}
err: ;
%}.
retVal isNil ifTrue:[
- "/
- "/ arrive here with retVal==nil either on error or premature EOF
- "/ or if running out of malloc-memory
- "/
- lastErrorNumber notNil ifTrue:[^ self readError].
- outOfMemory == true ifTrue:[
- "
- buffer memory allocation failed.
- When we arrive here, there was no memory available for the
- chunk. (seems to be too big of a chunk ...)
- Bad luck - you should increase the ulimit and/or swap space on your machine.
- "
- ^ ObjectMemory allocationFailureSignal raise.
- ]
+ "/
+ "/ arrive here with retVal==nil either on error or premature EOF
+ "/ or if running out of malloc-memory
+ "/
+ hitEOF ifTrue:[^ self pastEnd].
+ lastErrorNumber notNil ifTrue:[^ self readError].
+ outOfMemory == true ifTrue:[
+ "
+ buffer memory allocation failed.
+ When we arrive here, there was no memory available for the
+ chunk. (seems to be too big of a chunk ...)
+ Bad luck - you should increase the ulimit and/or swap space on your machine.
+ "
+ ^ ObjectMemory allocationFailureSignal raise.
+ ]
].
^ retVal
!
@@ -2831,44 +2809,55 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if ((__INST(binary) == true) && __isSmallInteger(anObject)) {
- peekValue = __intVal(anObject) & 0xFF;
- } else {
- if ((__INST(binary) != true) && __isCharacter(anObject)) {
- peekValue = __intVal(_characterVal(anObject)) & 0xFF;
- } else {
- peekValue = -1;
- }
- }
-
- if (peekValue >= 0) {
- __INST(position) = nil;
- f = __FILEVal(fp);
- __BEGIN_INTERRUPTABLE__
- __READING__(f)
-
- for (;;) {
- do {
- c = getc(f);
- } while ((c < 0) && (errno == EINTR));
+ if ((__INST(binary) == true) && __isSmallInteger(anObject)) {
+ peekValue = __intVal(anObject) & 0xFF;
+ } else {
+ if ((__INST(binary) != true) && __isCharacter(anObject)) {
+ peekValue = __intVal(_characterVal(anObject)) & 0xFF;
+ } else {
+ peekValue = -1;
+ }
+ }
+
+ if (peekValue >= 0) {
+ __INST(position) = nil;
+ f = __FILEVal(fp);
+ __BEGIN_INTERRUPTABLE__
+ __READING__(f)
+
+ for (;;) {
+ errno = 0;
+ do {
+ errno = 0;
+ if (__INST(buffered) == false) {
+ char ch;
+
+ c = read(fileno(f), &ch, 1);
+ if (c < 1)
+ c = EOF;
+ else
+ c = ch;
+ } else {
+ c = getc(f);
+ }
+ } while ((c < 0) && (errno == EINTR));
- if (c == EOF) {
- __END_INTERRUPTABLE__
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- break;
- }
- __INST(hitEOF) = true;
- RETURN (nil);
- }
- if (c == peekValue) {
- __END_INTERRUPTABLE__
- RETURN (anObject);
- }
- }
- }
+ if (c == EOF) {
+ __END_INTERRUPTABLE__
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ break;
+ }
+ __INST(hitEOF) = true;
+ } else if (c == peekValue) {
+ __END_INTERRUPTABLE__
+ RETURN (anObject);
+ }
+ }
+ }
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
^ super nextMatchFor:anObject
@@ -2890,67 +2879,58 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if (__INST(binary) == true) {
- if (__isSmallInteger(anObject)) {
- peekValue = __intVal(anObject) & 0xFF;
- } else {
- goto bad;
- }
- } else {
- if (__isCharacter(anObject)) {
- peekValue = __intVal(_characterVal(anObject)) & 0xFF;
- } else {
- goto bad;
- }
- }
-
- f = __FILEVal(fp);
-
- if (feof(f)) {
- __INST(hitEOF) = true;
- RETURN (false);
- }
-
- __READING__(f)
-
- errno = 0;
- __BEGIN_INTERRUPTABLE__
- do {
- if (feof(f)) {
- break;
- }
- c = getc(f);
- } while ((c < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
-
- if (feof(f)) {
- __INST(hitEOF) = true;
- }
-
- if (c == peekValue) {
- OBJ pos;
-
- if ((pos = __INST(position)) != nil) {
- __INST(position) = __MKSMALLINT(__intVal(pos) + 1);
- }
- RETURN (true);
- }
-
- if (c != EOF) {
- ungetc(c, f);
- RETURN (false);
- }
-
- __INST(hitEOF) = true;
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- } else {
- RETURN (false);
- }
+ if (__INST(binary) == true) {
+ if (__isSmallInteger(anObject)) {
+ peekValue = __intVal(anObject) & 0xFF;
+ } else {
+ goto bad;
+ }
+ } else {
+ if (__isCharacter(anObject)) {
+ peekValue = __intVal(_characterVal(anObject)) & 0xFF;
+ } else {
+ goto bad;
+ }
+ }
+
+ f = __FILEVal(fp);
+
+ __READING__(f)
+
+ errno = 0;
+ __BEGIN_INTERRUPTABLE__
+ do {
+ c = getc(f);
+ } while ((c < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
+
+ if (feof(f)) {
+ __INST(hitEOF) = true;
+ }
+
+ if (c == peekValue) {
+ OBJ pos;
+
+ if ((pos = __INST(position)) != nil) {
+ __INST(position) = __MKSMALLINT(__intVal(pos) + 1);
+ }
+ RETURN (true);
+ }
+
+ if (c != EOF) {
+ ungetc(c, f);
+ RETURN (false);
+ }
+
+ __INST(hitEOF) = true;
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ }
}
bad: ;
%}.
mode == #writeonly ifTrue:[^ self errorWriteOnly].
+ hitEOF ifTrue:[self pastEnd. ^ false].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
^ super peekFor:anObject
@@ -2970,27 +2950,27 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if (__INST(binary) != true) {
- f = __FILEVal(fp);
+ if (__INST(binary) != true) {
+ f = __FILEVal(fp);
- __READING__(f)
-
- __BEGIN_INTERRUPTABLE__
- if (fgets(buffer, sizeof(buffer)-1, f) != NULL) {
- __END_INTERRUPTABLE__
- RETURN ( self );
- }
- __END_INTERRUPTABLE__
-
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- } else {
- __INST(hitEOF) = true;
- RETURN ( nil );
- }
- }
+ __READING__(f)
+
+ __BEGIN_INTERRUPTABLE__
+ if (fgets(buffer, sizeof(buffer)-1, f) != NULL) {
+ __END_INTERRUPTABLE__
+ RETURN ( self );
+ }
+ __END_INTERRUPTABLE__
+
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ __INST(hitEOF) = true;
+ }
+ }
}
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
binary ifTrue:[^ self errorBinary].
@@ -3010,54 +2990,46 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if (__INST(binary) != true) {
- f = __FILEVal(fp);
+ if (__INST(binary) != true) {
+ f = __FILEVal(fp);
- if (feof(f)) {
- __INST(hitEOF) = true;
- RETURN ( nil );
- }
-
- __READING__(f)
-
- __BEGIN_INTERRUPTABLE__
- while (1) {
- do {
- if (feof(f)) {
- __END_INTERRUPTABLE__
- __INST(hitEOF) = true;
- RETURN ( nil );
- }
- c = getc(f);
- } while ((c < 0) && (errno == EINTR));
-
- switch (c) {
- case ' ':
- case '\t':
- case '\n':
- case '\r':
- case '\b':
- case '\014':
- break;
-
- default:
- __END_INTERRUPTABLE__
- if (c < 0) {
- __INST(hitEOF) = true;
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- goto err;
+ __READING__(f)
+
+ __BEGIN_INTERRUPTABLE__
+ while (1) {
+ do {
+ c = getc(f);
+ } while ((c < 0) && (errno == EINTR));
+
+ switch (c) {
+ case ' ':
+ case '\t':
+ case '\n':
+ case '\r':
+ case '\b':
+ case '\014':
+ break;
+
+ default:
+ __END_INTERRUPTABLE__
+ if (c < 0) {
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ __INST(hitEOF) = true;
}
- RETURN ( nil );
- }
- ungetc(c, f);
- RETURN ( __MKCHARACTER(c & 0xFF) );
- }
- }
- }
+ goto err;
+ } else {
+ ungetc(c, f);
+ RETURN ( __MKCHARACTER(c & 0xFF) );
+ }
+ }
+ }
+ }
}
err: ;
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
@@ -3078,47 +3050,43 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if (__INST(binary) != true) {
- f = __FILEVal(fp);
- __READING__(f)
-
- __BEGIN_INTERRUPTABLE__
- while (1) {
+ if (__INST(binary) != true) {
+ f = __FILEVal(fp);
+ __READING__(f)
+
+ __BEGIN_INTERRUPTABLE__
+ while (1) {
- if (feof(f)) {
- __END_INTERRUPTABLE__
- __INST(hitEOF) = true;
- RETURN ( nil );
- }
-
- do {
- c = getc(f);
- } while ((c < 0) && (errno == EINTR));
-
- switch (c) {
- case ' ':
- case '\t':
- case '\b':
- break;
-
- default:
- __END_INTERRUPTABLE__
- if (c < 0) {
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- goto err;
- }
- __INST(hitEOF) = true;
- RETURN ( nil );
- }
- ungetc(c, f);
- RETURN ( __MKCHARACTER(c & 0xFF) );
- }
- }
- }
+
+ do {
+ c = getc(f);
+ } while ((c < 0) && (errno == EINTR));
+
+ switch (c) {
+ case ' ':
+ case '\t':
+ case '\b':
+ break;
+
+ default:
+ __END_INTERRUPTABLE__
+ if (c < 0) {
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ goto err;
+ }
+ __INST(hitEOF) = true;
+ } else {
+ ungetc(c, f);
+ RETURN ( __MKCHARACTER(c & 0xFF) );
+ }
+ }
+ }
+ }
}
err: ;
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
@@ -3140,51 +3108,45 @@
__INST(lastErrorNumber) = nil;
if (((fp = __INST(filePointer)) != nil)
&& (__INST(mode) != @symbol(writeonly))) {
- if (__INST(binary) == true) {
- /* searched for object must be a smallInteger */
- if (! __isSmallInteger(aCharacter)) goto badArgument;
- cSearch = __intVal(aCharacter);
- } else {
- /* searched for object must be a character */
- if (! __isCharacter(aCharacter)) goto badArgument;
- cSearch = __intVal(_characterVal(aCharacter));
- }
- /* Q: should we just say: "not found" ? */
- if ((cSearch < 0) || (cSearch > 255)) goto badArgument;
-
- f = __FILEVal(fp);
- __READING__(f)
-
- __BEGIN_INTERRUPTABLE__
- while (1) {
-#ifdef NOTNEEDED
- if (feof(f)) {
- __END_INTERRUPTABLE__
- RETURN ( nil );
- }
-#endif
- do {
- c = getc(f);
- } while ((c < 0) && (errno == EINTR));
-
- if (c == cSearch) {
- __END_INTERRUPTABLE__
- RETURN (self);
- }
- if (c < 0) {
- __END_INTERRUPTABLE__
- if (ferror(f) && (errno != 0)) {
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- break;
- } else {
- __INST(hitEOF) = true;
- RETURN (nil);
- }
- }
- }
+ if (__INST(binary) == true) {
+ /* searched for object must be a smallInteger */
+ if (! __isSmallInteger(aCharacter)) goto badArgument;
+ cSearch = __intVal(aCharacter);
+ } else {
+ /* searched for object must be a character */
+ if (! __isCharacter(aCharacter)) goto badArgument;
+ cSearch = __intVal(_characterVal(aCharacter));
+ }
+ /* Q: should we just say: "not found" ? */
+ if ((cSearch < 0) || (cSearch > 255)) goto badArgument;
+
+ f = __FILEVal(fp);
+ __READING__(f)
+
+ __BEGIN_INTERRUPTABLE__
+ while (1) {
+ do {
+ c = getc(f);
+ } while ((c < 0) && (errno == EINTR));
+
+ if (c == cSearch) {
+ __END_INTERRUPTABLE__
+ RETURN (self);
+ }
+ if (c < 0) {
+ __END_INTERRUPTABLE__
+ if (ferror(f) && (errno != 0)) {
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ __INST(hitEOF) = true;
+ }
+ break;
+ }
+ }
}
badArgument: ;
%}.
+ hitEOF ifTrue:[^ self pastEnd].
lastErrorNumber notNil ifTrue:[^ self readError].
filePointer isNil ifTrue:[^ self errorNotOpen].
(mode == #writeonly) ifTrue:[^ self errorWriteOnly].
@@ -3791,6 +3753,6 @@
!ExternalStream class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.97 1996-04-07 02:12:19 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.98 1996-04-25 08:34:32 stefan Exp $'
! !
ExternalStream initialize!