ExternalStream.st
changeset 1281 b4b3abffdf32
parent 1141 8ea1b43f7034
child 1295 83f594f05c52
--- 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!