ExternalStream.st
changeset 3681 55dc17d40aab
parent 3674 c51550d1df17
child 3682 6de8ac1d3e88
--- a/ExternalStream.st	Tue Jul 28 12:35:37 1998 +0200
+++ b/ExternalStream.st	Tue Jul 28 12:41:15 1998 +0200
@@ -22,6 +22,7 @@
 !
 
 !ExternalStream primitiveDefinitions!
+
 %{
 
 #ifdef __openVMS__                                        
@@ -133,6 +134,14 @@
 
 #endif /* WIN32 */
 
+extern char *__survStartPtr, *__survEndPtr;
+
+#define xxxDEBUGBUFFER(buf)  \
+    if (((char *)(buf) >= __survStartPtr) \
+     && ((char *)(buf) < __survEndPtr)) { \
+        __fatal0("read into survivor\n"); \
+    }
+
 /*
  * stdio library requires an fseek before reading whenever a file
  * is open for read/write and the last operation was a write.
@@ -148,15 +157,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 */  \
     }
 
 
@@ -166,64 +175,69 @@
 #else
 #define __UNGETC__(c, f, isBuffered)                    \
     if (isBuffered) {                                   \
-	ungetc((c), (f));                               \
+        ungetc((c), (f));                               \
     } else {                                            \
-	__INST(readAhead) = __MKSMALLINT((c));          \
+        __INST(readAhead) = __MKSMALLINT((c));          \
     }
 #endif
 
 #ifdef NO_STDIO
 #define __READBYTE__(ret, f, buf, isBuffered)           \
     {                                                   \
-	OBJ rA = __INST(readAhead);                     \
-	if (rA != nil) {                                \
-	    *(buf) = __intVal(rA);                      \
-	    __INST(readAhead) = nil;                    \
-	    (ret) = 1;                                  \
-	} else {                                        \
-	    for (;;) {                                  \
-		CLEAR_ERRNO;                            \
-		(ret) = READ(f, buf, 1);                \
-		if ((ret) >= 0 || 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);                \
+                DEBUGBUFFER(buf);                       \
+                if ((ret) >= 0 || errno != EINTR)       \
+                    break;                              \
+                __HANDLE_INTERRUPTS__;                  \
+            }                                           \
+        }                                               \
     }
 #else
 #define __READBYTE__(ret, f, buf, isBuffered)           \
     if (isBuffered) {                                   \
-	for (;;) {                                      \
-	    CLEAR_ERRNO;                                \
-	    (ret) = getc(f);                            \
-	    if ((ret) >= 0) {                           \
-		*(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);                      \
-	    __INST(readAhead) = nil;                    \
-	    (ret) = 1;                                  \
-	} else {                                        \
-	    for (;;) {                                  \
-		CLEAR_ERRNO;                            \
-		(ret) = read(fileno(f), buf, 1);        \
-		if ((ret) >= 0 || 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 || errno != EINTR)       \
+                    break;                              \
+                __HANDLE_INTERRUPTS__;                  \
+            }                                           \
+        }                                               \
    }                                                                          
 #endif
 
@@ -234,79 +248,84 @@
 #ifdef NO_STDIO
 #define __READBYTES__(ret, f, buf, cnt, isBuffered)     \
     {                                                   \
-	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;                            \
-		(ret) = READ(f, (buf)+__offs, (cnt)-__offs); \
-		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)) {                        \
+            OBJ rA = __INST(readAhead);                 \
+            if (rA != nil) {                            \
+                (buf)[__offs] = __intVal(rA);           \
+                DEBUGBUFFER(buf);                       \
+                __INST(readAhead) = nil;                \
+                (ret) = 1;                              \
+            } else {                                    \
+                CLEAR_ERRNO;                            \
+                (ret) = READ(f, (buf)+__offs, (cnt)-__offs); \
+                DEBUGBUFFER(buf);                       \
+                if ((ret) <= 0) {                       \
+                    if ((ret) < 0 && errno == EINTR) {  \
+                        __HANDLE_INTERRUPTS__;          \
+                        continue;                       \
+                    }                                   \
+                    break;                              \
+                }                                       \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
    }
 #else
 #define __READBYTES__(ret, f, buf, cnt, isBuffered)     \
     (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;                                  \
-	    }                                           \
-	    (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;                                 \
-	int fd = fileno(f);                             \
-							\
-	while (__offs < (cnt)) {                        \
-	    OBJ rA = __INST(readAhead);                 \
-	    if (rA != nil) {                            \
-		(buf)[__offs] = __intVal(rA);           \
-		__INST(readAhead) = nil;                \
-		(ret) = 1;                              \
-	    } else {                                    \
-		CLEAR_ERRNO;                            \
-		(ret) = read(fd, (buf)+__offs, (cnt)-__offs);                 \
-		if ((ret) <= 0) {                       \
-		    if ((ret) < 0 && errno == EINTR) {  \
-			__HANDLE_INTERRUPTS__;          \
-			continue;                       \
-		    }                                   \
-		    break;                              \
-		}                                       \
-	    }                                           \
-	    __offs += (ret);                            \
-	}                                               \
-	if (__offs > 0)                                 \
-	    (ret) = __offs;                             \
+        int __offs = 0;                                 \
+        int fd = fileno(f);                             \
+                                                        \
+        while (__offs < (cnt)) {                        \
+            OBJ rA = __INST(readAhead);                 \
+            if (rA != nil) {                            \
+                DEBUGBUFFER(buf);                       \
+                (buf)[__offs] = __intVal(rA);           \
+                __INST(readAhead) = nil;                \
+                (ret) = 1;                              \
+            } else {                                    \
+                CLEAR_ERRNO;                            \
+                (ret) = read(fd, (buf)+__offs, (cnt)-__offs);                 \
+                DEBUGBUFFER(buf);                       \
+                if ((ret) <= 0) {                       \
+                    if ((ret) < 0 && errno == EINTR) {  \
+                        __HANDLE_INTERRUPTS__;          \
+                        continue;                       \
+                    }                                   \
+                    break;                              \
+                }                                       \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
    }
 
 #if defined(F_GETFL) && defined(F_SETFL) && defined(FNDELAY)
@@ -314,16 +333,16 @@
         fcntl(fd, F_GETFL, 0);
 
 # define SETFLAGS(fd, flags) \
-	fcntl(fd, F_SETFL, flags)
+        fcntl(fd, F_SETFL, flags)
 
 # define SETNONBLOCKING(fd) \
-	{ \
-	    int flags; \
-	    flags = fcntl(fd, F_GETFL, 0); \
-	    if (flags >= 0) { \
-		fcntl(fd, F_SETFL, flags | FNDELAY); \
-	    } \
-	}
+        { \
+            int flags; \
+            flags = fcntl(fd, F_GETFL, 0); \
+            if (flags >= 0) { \
+                fcntl(fd, F_SETFL, flags | FNDELAY); \
+            } \
+        }
 #else
 # define GETFLAGS(fd) 0
 # define SETFLAGS(fd, flags) /* nothing */
@@ -333,59 +352,60 @@
 #define __READAVAILBYTES__(ret, f, buf, cnt, isBuffered) \
   {                                                     \
     int __offs = 0;                                     \
-    int oldFlags;					\
-							\
+    int oldFlags;                                       \
+                                                        \
     (ret) = 0;                                          \
-    oldFlags = GETFLAGS(fileno(f));			\
-    SETNONBLOCKING(fileno(f));				\
+    oldFlags = GETFLAGS(fileno(f));                     \
+    SETNONBLOCKING(fileno(f));                          \
     if (isBuffered) {                                   \
-	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;                                  \
-	    }                                           \
-	    (buf)[__offs++] = (ret);                    \
-	}                                               \
-	if (__offs > 0)                                 \
-	    (ret) = __offs;                             \
+        while (__offs < (cnt)) {                        \
+            CLEAR_ERRNO;                                \
+            (ret) = getc(f);                            \
+            if ((ret) < 0) {                            \
+                if (ferror(f)) {                        \
+                    if (errno == EINTR) {               \
+                        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);           \
-		__INST(readAhead) = nil;                \
-		(ret) = 1;                              \
-		__offs += (ret);                        \
-		continue;                               \
-	    }                                           \
-	    CLEAR_ERRNO;                                \
-	    (ret) = read(fd, (buf)+__offs, (cnt)-__offs); \
-	    if ((ret) < 0) {          			\
-	        if (errno == EINTR) {                   \
-		    __HANDLE_INTERRUPTS__;              \
-		    continue;                           \
-		}					\
-		break;					\
-	    }                                           \
-	    __offs += (ret);                            \
-	    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;                \
+                (ret) = 1;                              \
+                __offs += (ret);                        \
+                continue;                               \
+            }                                           \
+            CLEAR_ERRNO;                                \
+            (ret) = read(fd, (buf)+__offs, (cnt)-__offs); \
+            DEBUGBUFFER(buf);                           \
+            if ((ret) < 0) {                            \
+                if (errno == EINTR) {                   \
+                    break;                              \
+                }                                       \
+                break;                                  \
+            }                                           \
+            __offs += (ret);                            \
+            break;                                      \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
     }                                                   \
-    SETFLAGS(fileno(f), oldFlags);			\
+    SETFLAGS(fileno(f), oldFlags);                      \
   }
 
 #endif
@@ -400,32 +420,34 @@
     int __ooffs = obj_offs;                             \
     int __offs = 0;                                     \
     char *buf = (char *)(obj);                          \
-							\
+                                                        \
     (ret) = 0;                                          \
     {                                                   \
-	while (__offs < (cnt)) {                        \
-	    OBJ rA = __INST(readAhead);                 \
-	    if (rA != nil) {                            \
-		(buf)[__ooffs+__offs] = __intVal(rA);   \
-		__INST(readAhead) = nil;                \
-		(ret) = 1;                              \
-	    } else {                                    \
-		CLEAR_ERRNO;                            \
-		(ret) = READ(f, (buf)+__ooffs+__offs, (cnt)-__offs); \
-		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)) {                        \
+            OBJ rA = __INST(readAhead);                 \
+            if (rA != nil) {                            \
+                (buf)[__ooffs+__offs] = __intVal(rA);   \
+                DEBUGBUFFER(buf);                       \
+                __INST(readAhead) = nil;                \
+                (ret) = 1;                              \
+            } else {                                    \
+                CLEAR_ERRNO;                            \
+                (ret) = READ(f, (buf)+__ooffs+__offs, (cnt)-__offs); \
+                DEBUGBUFFER(buf);                       \
+                if ((ret) <= 0) {                       \
+                    if ((ret) < 0 && errno == EINTR) {  \
+                        __HANDLE_INTERRUPTS__;          \
+                        /* refetch */                   \
+                        buf = (char *)(obj);            \
+                        continue;                       \
+                    }                                   \
+                    break;                              \
+                }                                       \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
     }                                                   \
   }
 #else
@@ -434,57 +456,61 @@
     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 (errno == EINTR) {               \
-			__HANDLE_INTERRUPTS__;          \
-			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 (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);   \
-		__INST(readAhead) = nil;                \
-		(ret) = 1;                              \
-	    } else {                                    \
-		CLEAR_ERRNO;                            \
-		(ret) = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \
-		if ((ret) <= 0) {                       \
-		    if ((ret) < 0 && errno == EINTR) {  \
-			__HANDLE_INTERRUPTS__;          \
-			/* refetch */                   \
-			buf = (char *)(obj);            \
-			continue;                       \
-		    }                                   \
-		    break;                              \
-		}                                       \
-	    }                                           \
-	    __offs += (ret);                            \
-	}                                               \
-	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;                \
+                (ret) = 1;                              \
+            } else {                                    \
+                CLEAR_ERRNO;                            \
+                (ret) = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \
+                DEBUGBUFFER(buf);                       \
+                if ((ret) <= 0) {                       \
+                    if ((ret) < 0 && errno == EINTR) {  \
+                        __HANDLE_INTERRUPTS__;          \
+                        /* refetch */                   \
+                        buf = (char *)(obj);            \
+                        continue;                       \
+                    }                                   \
+                    break;                              \
+                }                                       \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
     }                                                   \
   }
 
@@ -493,56 +519,57 @@
     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 (errno == EINTR) {               \
-			__HANDLE_INTERRUPTS__;          \
-			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 (errno == EINTR) {               \
+                        clearerr(f);                    \
+                        /* refetch */                   \
+                        buf = (char *)(obj);            \
+                        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);   \
-		__INST(readAhead) = nil;                \
-		(ret) = 1;                              \
-		__offs += (ret);                        \
-		continue;                               \
-	    }                                           \
-	    CLEAR_ERRNO;                                \
-	    (ret) = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \
-	    if ((ret) < 0 && errno == EINTR) {          \
-		__HANDLE_INTERRUPTS__;                  \
-		/* refetch */                           \
-		buf = (char *)(obj);                    \
-		continue;                               \
-	    }                                           \
-	    __offs += (ret);                            \
-	    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;                \
+                (ret) = 1;                              \
+                __offs += (ret);                        \
+                continue;                               \
+            }                                           \
+            CLEAR_ERRNO;                                \
+            (ret) = read(fd, (buf)+__ooffs+__offs, (cnt)-__offs); \
+            DEBUGBUFFER(buf);                           \
+            if ((ret) < 0 && errno == EINTR) {          \
+                /* refetch */                           \
+                buf = (char *)(obj);                    \
+                break;                               \
+            }                                           \
+            __offs += (ret);                            \
+            break;                                      \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
     }                                                   \
   }
 
@@ -551,39 +578,39 @@
 
 #ifdef NO_STDIO
 #define __WRITEBYTE__(ret, f, buf, isBuffered)          \
-	for (;;) {                                      \
-	    CLEAR_ERRNO;                                \
-	    (ret) = WRITE(f, buf, 1);                   \
-	    if ((ret) >= 0 || errno != EINTR)           \
-		break;                                  \
-	    __HANDLE_INTERRUPTS__;                      \
-	}
+        for (;;) {                                      \
+            CLEAR_ERRNO;                                \
+            (ret) = WRITE(f, buf, 1);                   \
+            if ((ret) >= 0 || errno != EINTR)           \
+                break;                                  \
+            __HANDLE_INTERRUPTS__;                      \
+        }
 #else
 #define __WRITEBYTE__(ret, f, buf, isBuffered)          \
     if (isBuffered) {                                   \
-	for (;;) {                                      \
-	    CLEAR_ERRNO;                                \
-	    ret = putc(*(buf), f);                      \
-	    if ((ret) >= 0) {                           \
-		(ret) = 1;                              \
-	    } else if (ferror(f)) {                     \
-		if (errno == EINTR) {                   \
-		    __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)) {                     \
+                if (errno == EINTR) {                   \
+                    __HANDLE_INTERRUPTS__;              \
+                    clearerr(f);                        \
+                    continue;                           \
+                }                                       \
+            } else                                      \
+                (ret) = 0;                              \
+            break;                                      \
+        }                                               \
     } else {                                            \
-	for (;;) {                                      \
-	    CLEAR_ERRNO;                                \
-	    (ret) = write(fileno(f), buf, 1);           \
-	    if ((ret) >= 0 || errno != EINTR)           \
-		break;                                  \
-	    __HANDLE_INTERRUPTS__;                      \
-	}                                               \
+        for (;;) {                                      \
+            CLEAR_ERRNO;                                \
+            (ret) = write(fileno(f), buf, 1);           \
+            if ((ret) >= 0 || errno != EINTR)           \
+                break;                                  \
+            __HANDLE_INTERRUPTS__;                      \
+        }                                               \
    }                                                                          
 #endif
 
@@ -595,62 +622,62 @@
 #define __WRITEBYTES__(ret, f, buf, cnt, isBuffered)    \
     (ret) = 0;                                          \
     {                                                   \
-	int __offs = 0;                                 \
-	while (__offs < (cnt)) {                        \
-	    CLEAR_ERRNO;                                \
-	    ret = WRITE(f, (buf)+__offs, (cnt)-__offs); \
-	    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); \
+            if (ret <= 0) {                             \
+                if (ret < 0 && errno == EINTR) {        \
+                    __HANDLE_INTERRUPTS__;              \
+                    continue;                           \
+                }                                       \
+                break;                                  \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
    }
 #else
 #define __WRITEBYTES__(ret, f, buf, cnt, isBuffered)    \
     (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;                       \
-		    }                                   \
-		    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 (errno == EINTR) {               \
+                        __HANDLE_INTERRUPTS__;          \
+                        clearerr(f);                    \
+                        continue;                       \
+                    }                                   \
+                    break;                              \
+                } else {                                \
+                    (ret) = 0;                          \
+                }                                       \
+            }                                           \
+            __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 && 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 && errno == EINTR) {        \
+                    __HANDLE_INTERRUPTS__;              \
+                    continue;                           \
+                }                                       \
+                break;                                  \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
    }
 #endif
 
@@ -664,25 +691,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);               \
-	    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);               \
+            if (ret <= 0) {                             \
+                if (ret < 0 && errno == EINTR) {        \
+                    __HANDLE_INTERRUPTS__;              \
+                    /* refetch */                       \
+                    buf = (char *)(obj);                \
+                    continue;                           \
+                }                                       \
+                break;                                  \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
     }                                                   \
   }
 #else
@@ -691,47 +718,47 @@
     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);                            \
-	}                                               \
-	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 (errno == EINTR) {               \
+                        __HANDLE_INTERRUPTS__;          \
+                        /* refetch */                   \
+                        buf = (char *)(obj);            \
+                        clearerr(f);                    \
+                        continue;                       \
+                    }                                   \
+                    break;                              \
+                } else {                                \
+                    (ret) = 0;                          \
+                }                                       \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
     } else {                                            \
-	while (__offs < (cnt)) {                        \
-	    CLEAR_ERRNO;                                \
-	    ret = write(fileno(f), (buf)+__ooffs+__offs, (cnt)-__offs);       \
-	    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(fileno(f), (buf)+__ooffs+__offs, (cnt)-__offs);       \
+            if (ret <= 0) {                             \
+                if (ret < 0 && errno == EINTR) {        \
+                    __HANDLE_INTERRUPTS__;              \
+                    /* refetch */                       \
+                    buf = (char *)(obj);                \
+                    continue;                           \
+                }                                       \
+                break;                                  \
+            }                                           \
+            __offs += (ret);                            \
+        }                                               \
+        if (__offs > 0)                                 \
+            (ret) = __offs;                             \
     }                                                   \
   }
 #endif
@@ -1673,8 +1700,7 @@
      notice: this one is based on the underlying OSs fileDescriptor -
      this may not be available on all platforms (i.e. non unix systems)."
 
-%{  /* NOCONTEXT */
-
+%{
     FILEPOINTER f;
     OBJ fp;
     FILE *fdopen();
@@ -2446,76 +2472,76 @@
 
     __INST(lastErrorNumber) = nil;
     if (((fp = __INST(filePointer)) != nil)
-	&& (__INST(mode) != @symbol(writeonly))
-	&& __bothSmallInteger(count, start)
+        && (__INST(mode) != @symbol(writeonly))
+        && __bothSmallInteger(count, start)
     ) {
-	f = __FILEVal(fp);
-
-	cnt = __intVal(count);
-	offs = __intVal(start) - 1;
-
-	oClass = __Class(anObject);
-	if (oClass == ExternalBytes) {
-	    OBJ sz;
-
-	    nInstBytes = 0;
-	    extPtr = (char *)(__externalBytesAddress(anObject));
-	    sz = __externalBytesSize(anObject);
-	    if (__isSmallInteger(sz)) {
-		objSize = __intVal(sz);
-	    } else {
-		objSize = 0; /* unknown */
-	    }
-	} else {
-	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
-		case BYTEARRAY:
-		case WORDARRAY:
-		case LONGARRAY:
-		case SWORDARRAY:
-		case SLONGARRAY:
-		case FLOATARRAY:
-		case DOUBLEARRAY:
-		    break;
-		default:
-		    goto bad;
-	    }
-	    extPtr = (char *)0;
-	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
-	    nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
-	    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);
-	    } 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);
-	    }
-	    if (ret > 0) {
-		pos = __INST(position);
-		if (pos != nil) {
-		    __INST(position) = __MKSMALLINT(__intVal(pos) + ret);
-		}
-		RETURN (__MKSMALLINT(ret));
-	    }
-	    if (ret == 0) { 
-		__INST(hitEOF) = true;
-	    } else /* ret < 0 */ {
-		__INST(position) = nil;
-		__INST(lastErrorNumber) = __MKSMALLINT(errno);
-	    }
-	}
+        f = __FILEVal(fp);
+
+        cnt = __intVal(count);
+        offs = __intVal(start) - 1;
+
+        oClass = __Class(anObject);
+        if (oClass == ExternalBytes) {
+            OBJ sz;
+
+            nInstBytes = 0;
+            extPtr = (char *)(__externalBytesAddress(anObject));
+            sz = __externalBytesSize(anObject);
+            if (__isSmallInteger(sz)) {
+                objSize = __intVal(sz);
+            } else {
+                objSize = 0; /* unknown */
+            }
+        } else {
+            switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
+                case BYTEARRAY:
+                case WORDARRAY:
+                case LONGARRAY:
+                case SWORDARRAY:
+                case SLONGARRAY:
+                case FLOATARRAY:
+                case DOUBLEARRAY:
+                    break;
+                default:
+                    goto bad;
+            }
+            extPtr = (char *)0;
+            nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
+            nInstBytes = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
+            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);
+            } 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);
+            }
+            if (ret > 0) {
+                pos = __INST(position);
+                if (pos != nil) {
+                    __INST(position) = __MKSMALLINT(__intVal(pos) + ret);
+                }
+                RETURN (__MKSMALLINT(ret));
+            }
+            if (ret == 0) { 
+                __INST(hitEOF) = true;
+            } else /* ret < 0 */ {
+                __INST(position) = nil;
+                __INST(lastErrorNumber) = __MKSMALLINT(errno);
+            }
+        }
     }
 bad: ;
 %}.
@@ -4697,6 +4723,6 @@
 !ExternalStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.172 1998-07-25 16:39:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.173 1998-07-28 10:41:15 cg Exp $'
 ! !
 ExternalStream initialize!