ExternalStream.st
changeset 17474 18c7b1b817b4
parent 17473 0990997cb355
child 17475 a31762a088b7
--- a/ExternalStream.st	Mon Feb 16 19:11:01 2015 +0100
+++ b/ExternalStream.st	Mon Feb 16 19:41:02 2015 +0100
@@ -5944,153 +5944,157 @@
      || (__INST(handleType) == @symbol(socketFilePointer))
      || (__INST(handleType) == @symbol(socketHandle))
      || (__INST(handleType) == @symbol(pipeFilePointer))) {
-        if (((fp = __INST(handle)) != nil)
-            && (__INST(mode) != @symbol(readonly))
-        ) {
-            f = __FILEVal(fp);
-            if (! f) {
-                fprintf(stderr, "oops - fileHandle is NULL in nextPutAll:\n");
-                __INST(handle) = nil;
-                goto out;
-            }
-            if (_buffered = (__INST(buffered) == true)) {
-                __WRITING__(f)
-            }
-
-            if (__isStringLike(aCollection)) {
-                OBJ mode = __INST(eolMode);
-                char *stringP = __stringVal(aCollection);
-                len = __stringSize(aCollection);
-
-                if (__INST(binary) != true
-                    && ((mode == @symbol(cr))
-                        || (mode == @symbol(etx))
-                        || (mode == @symbol(eot))
-                        || (mode == @symbol(crlf)))
-                    && memchr(stringP, '\n', len) != NULL)
-                {
-                    // there is a '\n' to be translated, replace it into a buffer
-
-                    char *end = stringP + len;
-                    char sep[2];
-                    int sepLen = 1;
-                    int bufLen;
-                    char *buf, *endBuf, *sp, *dp;
-
-                    sep[0] = '\n';
-                    if (mode == @symbol(crlf)) {
-                         sep[0] = '\r'; sep[1] = '\n'; sepLen = 2;
-                    } else if (mode == @symbol(cr)) {
-                         sep[0] = '\r';
-                    } else if (mode == @symbol(eot)) {
-                         sep[0] = '\004';
-                    } else if (mode == @symbol(etx)) {
-                         sep[0] = '\003';
-                    }
-
-                    // estimate size of buffer - assume every 4th char is a separator
-                    bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen);
-                    buf = (char *)malloc(bufLen);
-                    if (buf == NULL) {
-                        error = __mkSmallInteger(ENOMEM);
-                        goto out;
-                    }
-
-                    endBuf = buf + bufLen;
-
-                    for (sp = stringP, dp = buf; sp < end; sp++) {
-                        if ((dp+sepLen) >= endBuf) {
-                            char *newBuf;
-
-                            bufLen = bufLen * 2;
-                            newBuf = (char *)realloc(buf, bufLen);
-                            if (newBuf == NULL) {
-                                free(buf);
-                                error = __mkSmallInteger(ENOMEM);
-                                goto out;
-                            }
-                            endBuf = newBuf + bufLen;
-                            dp = newBuf + (dp-buf);
-                            buf = newBuf;
-                        }
-
-                        if (*sp == '\n') {
-                            strcpy(dp, sep);
-                            dp += sepLen;
-                        } else {
-                            *dp++ = *sp;
-                        }
-                    }
-
-                    len = dp - buf;
+	if (((fp = __INST(handle)) != nil)
+	    && (__INST(mode) != @symbol(readonly))
+	) {
+	    f = __FILEVal(fp);
+	    if (! f) {
+		fprintf(stderr, "oops - fileHandle is NULL in nextPutAll:\n");
+		__INST(handle) = nil;
+		goto out;
+	    }
+	    if (_buffered = (__INST(buffered) == true)) {
+		__WRITING__(f)
+	    }
+
+	    if (__isStringLike(aCollection)) {
+		OBJ mode = __INST(eolMode);
+		char *stringP = __stringVal(aCollection);
+		len = __stringSize(aCollection);
+
+		if (__INST(binary) != true
+		    && ((mode == @symbol(cr))
+			|| (mode == @symbol(etx))
+			|| (mode == @symbol(eot))
+			|| (mode == @symbol(crlf)))
+		    && memchr(stringP, '\n', len) != NULL)
+		{
+		    // there is a '\n' to be translated, replace it into a buffer
+
+		    char *end;
+		    char sep[2];
+		    int sepLen = 1;
+		    int bufLen;
+		    char *buf, *endBuf, *sp, *dp;
+
+		    sep[0] = '\n';
+		    if (mode == @symbol(crlf)) {
+			 sep[0] = '\r'; sep[1] = '\n'; sepLen = 2;
+		    } else if (mode == @symbol(cr)) {
+			 sep[0] = '\r';
+		    } else if (mode == @symbol(eot)) {
+			 sep[0] = '\004';
+		    } else if (mode == @symbol(etx)) {
+			 sep[0] = '\003';
+		    }
+
+		    // estimate size of buffer - assume every 4th char is a separator
+		    bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen);
+		    buf = (char *)malloc(bufLen);
+		    if (buf == NULL) {
+			error = __mkSmallInteger(ENOMEM);
+			goto out;
+		    }
+
+		    endBuf = buf + bufLen;
+		    end = stringP + len;
+		    for (sp = stringP, dp = buf; sp < end; sp++) {
+			char c;
+
+			if ((dp+sepLen) >= endBuf) {
+			    char *newBuf;
+
+			    bufLen = bufLen * 2;
+			    newBuf = (char *)realloc(buf, bufLen);
+			    if (newBuf == NULL) {
+				free(buf);
+				error = __mkSmallInteger(ENOMEM);
+				goto out;
+			    }
+			    endBuf = newBuf + bufLen;
+			    dp = newBuf + (dp-buf);
+			    buf = newBuf;
+			}
+
+			if ((c = *sp++) == '\n') {
+			    *dp++ = sep[0];
+			    if (sepLen == 2) {
+				*dp++ = sep[1];
+			    };
+			} else {
+			    *dp++ = c;
+			}
+		    }
+
+		    len = dp - buf;
 #ifdef WIN32
-                    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
-                        cnt = __win32_fwrite(buf, 1, len, f);
-                    } else
+		    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
+			cnt = __win32_fwrite(buf, 1, len, f);
+		    } else
 #endif
-                    {
-                        __WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType));
-                    }
-                    free(buf);
-                } else  {  // No EOL conversion needed
+		    {
+			__WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType));
+		    }
+		    free(buf);
+		} else  {  // No EOL conversion needed
 #ifdef WIN32
-                    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
-                        cnt = __win32_fwrite(stringP, 1, len, f);
-                    } else
+		    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
+			cnt = __win32_fwrite(stringP, 1, len, f);
+		    } else
 #endif
-                    {
-                        o_offs = stringP - (char *)__InstPtr(aCollection);
-                        __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType));
-                    }
-                }
-            } else {   // Not a String
-                if (__INST(binary) == true) {
-                    INT offs;
-
-                    if (__isByteArrayLike(aCollection)) {
-                        offs = 0;
-                        len = __byteArraySize(aCollection);
-                    } else if (__isBytes(aCollection)) {
-                        offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars));
-                        len = __byteArraySize(aCollection) - offs;
-                    } else
-                        goto out;
+		    {
+			o_offs = stringP - (char *)__InstPtr(aCollection);
+			__WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType));
+		    }
+		}
+	    } else {   // Not a String
+		if (__INST(binary) == true) {
+		    INT offs;
+
+		    if (__isByteArrayLike(aCollection)) {
+			offs = 0;
+			len = __byteArraySize(aCollection);
+		    } else if (__isBytes(aCollection)) {
+			offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars));
+			len = __byteArraySize(aCollection) - offs;
+		    } else
+			goto out;
 #ifdef WIN32
-                    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
-                        cnt = __win32_fwrite(__stringVal(aCollection), 1, len, f);
-                    } else
+		    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
+			cnt = __win32_fwrite(__stringVal(aCollection), 1, len, f);
+		    } else
 #endif
-                    {
-                        o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element) - (char *)__InstPtr(aCollection);
-                        o_offs += offs;
-                        __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType));
-                    }
-                } else  // Not binary mode
-                    goto out;
-            }
-
-            // Now check for errors
-            if (cnt == len) {
-                if (__isSmallInteger(__INST(position))) {
-                    INT np = __intVal(__INST(position)) + len;
-                    OBJ t;
-
-                    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
-                } else {
-                    __INST(position) = nil; /* i.e. do not know */
-                }
-                RETURN (self);
-            }
-            fprintf(stderr, "cnt=%d len=%d\n", cnt, len);
-            error = __mkSmallInteger(__threadErrno);
-        }
+		    {
+			o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element) - (char *)__InstPtr(aCollection);
+			o_offs += offs;
+			__WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs, len, _buffered, __INST(handleType));
+		    }
+		} else  // Not binary mode
+		    goto out;
+	    }
+
+	    // Now check for errors
+	    if (cnt == len) {
+		if (__isSmallInteger(__INST(position))) {
+		    INT np = __intVal(__INST(position)) + len;
+		    OBJ t;
+
+		    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
+		} else {
+		    __INST(position) = nil; /* i.e. do not know */
+		}
+		RETURN (self);
+	    }
+	    fprintf(stderr, "cnt=%d len=%d\n", cnt, len);
+	    error = __mkSmallInteger(__threadErrno);
+	}
     }
 out: ;
 %}.
     error notNil ifTrue:[
-        lastErrorNumber := error.
-        self writeError:error.
-        ^ self
+	lastErrorNumber := error.
+	self writeError:error.
+	^ self
     ].
     handle isNil ifTrue:[self errorNotOpen. ^ self].
     (mode == #readonly) ifTrue:[self errorReadOnly. ^ self].
@@ -6117,165 +6121,169 @@
      || (__INST(handleType) == @symbol(socketFilePointer))
      || (__INST(handleType) == @symbol(socketHandle))
      || (__INST(handleType) == @symbol(pipeFilePointer))) {
-        if (((fp = __INST(handle)) != nil)
-            && (__INST(mode) != @symbol(readonly))
-            && __bothSmallInteger(start, stop)
-        ) {
-            f = __FILEVal(fp);
-            if (_buffered = (__INST(buffered) == true)) {
-                __WRITING__(f)
-            }
-            iStart = __intVal(start);
-            iStop = __intVal(stop);
-            if ((iStart < 1) || (iStop < iStart)) {
-                RETURN(self);
-            }
-            if (__isStringLike(aCollection)) {
-                char *stringP;
-                OBJ mode = __INST(eolMode);
-
-                len = __stringSize(aCollection);
-                if (iStop > len) {
-                    RETURN(self);
-                }
-                if (iStop > len)
-                    iStop = len;
-                len = iStop - iStart + 1;
-                stringP = __stringVal(aCollection) + iStart - 1;
-
-                if (__INST(binary) != true
-                    && ((mode == @symbol(cr))
-                        || (mode == @symbol(etx))
-                        || (mode == @symbol(eot))
-                        || (mode == @symbol(crlf)))
-                    && memchr(stringP, '\n', len) != NULL)
-                {
-                    // see if there is a \n which needs to be translated, replace it
-
-                    char *end = stringP + len;
-                    char sep[2];
-                    int sepLen = 1;
-                    int bufLen;
-                    char *buf, *endBuf, *sp, *dp;
-
-                    sep[0] = '\n';
-                    if (mode == @symbol(crlf)) {
-                         sep[0] = '\r'; sep[1] = '\n'; sepLen = 2;
-                    } else if (mode == @symbol(cr)) {
-                         sep[0] = '\r';
-                    } else if (mode == @symbol(eot)) {
-                         sep[0] = '\004';
-                    } else if (mode == @symbol(etx)) {
-                         sep[0] = '\003';
-                    }
-
-                    // estimate size of buffer - assume every 4th char is a separator
-                    bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen);
-                    buf = (char *)malloc(bufLen);
-                    if (buf == NULL) {
-                        error = __mkSmallInteger(ENOMEM);
-                        goto out;
-                    }
-
-                    endBuf = buf + bufLen;
-
-                    for (sp = stringP, dp = buf; sp < end; sp++) {
-                        if ((dp+sepLen) >= endBuf) {
-                            char *newBuf;
-
-                            bufLen = bufLen * 2;
-                            newBuf = (char *)realloc(buf, bufLen);
-                            if (newBuf == NULL) {
-                                free(buf);
-                                error = __mkSmallInteger(ENOMEM);
-                                goto out;
-                            }
-                            endBuf = newBuf + bufLen;
-                            dp = newBuf + (dp-buf);
-                            buf = newBuf;
-                        }
-
-                        if (*sp == '\n') {
-                            strcpy(dp, sep);
-                            dp += sepLen;
-                        } else {
-                            *dp++ = *sp;
-                        }
-                    }
-
-                    len = dp - buf;
+	if (((fp = __INST(handle)) != nil)
+	    && (__INST(mode) != @symbol(readonly))
+	    && __bothSmallInteger(start, stop)
+	) {
+	    f = __FILEVal(fp);
+	    if (_buffered = (__INST(buffered) == true)) {
+		__WRITING__(f)
+	    }
+	    iStart = __intVal(start);
+	    iStop = __intVal(stop);
+	    if ((iStart < 1) || (iStop < iStart)) {
+		RETURN(self);
+	    }
+	    if (__isStringLike(aCollection)) {
+		char *stringP;
+		OBJ mode = __INST(eolMode);
+
+		len = __stringSize(aCollection);
+		if (iStop > len) {
+		    RETURN(self);
+		}
+		if (iStop > len)
+		    iStop = len;
+		len = iStop - iStart + 1;
+		stringP = __stringVal(aCollection) + iStart - 1;
+
+		if (__INST(binary) != true
+		    && ((mode == @symbol(cr))
+			|| (mode == @symbol(etx))
+			|| (mode == @symbol(eot))
+			|| (mode == @symbol(crlf)))
+		    && memchr(stringP, '\n', len) != NULL)
+		{
+		    // see if there is a \n which needs to be translated, replace it
+
+		    char *end = stringP + len;
+		    char sep[2];
+		    int sepLen = 1;
+		    int bufLen;
+		    char *buf, *endBuf, *sp, *dp;
+
+		    sep[0] = '\n';
+		    if (mode == @symbol(crlf)) {
+			 sep[0] = '\r'; sep[1] = '\n'; sepLen = 2;
+		    } else if (mode == @symbol(cr)) {
+			 sep[0] = '\r';
+		    } else if (mode == @symbol(eot)) {
+			 sep[0] = '\004';
+		    } else if (mode == @symbol(etx)) {
+			 sep[0] = '\003';
+		    }
+
+		    // estimate size of buffer - assume every 4th char is a separator
+		    bufLen = (sepLen == 1) ? len : (len + ((len/4) + 1) * sepLen);
+		    buf = (char *)malloc(bufLen);
+		    if (buf == NULL) {
+			error = __mkSmallInteger(ENOMEM);
+			goto out;
+		    }
+
+		    endBuf = buf + bufLen;
+
+		    for (sp = stringP, dp = buf; sp < end; sp++) {
+			char c;
+
+			if ((dp+sepLen) >= endBuf) {
+			    char *newBuf;
+
+			    bufLen = bufLen * 2;
+			    newBuf = (char *)realloc(buf, bufLen);
+			    if (newBuf == NULL) {
+				free(buf);
+				error = __mkSmallInteger(ENOMEM);
+				goto out;
+			    }
+			    endBuf = newBuf + bufLen;
+			    dp = newBuf + (dp-buf);
+			    buf = newBuf;
+			}
+
+			if ((c = *sp++) == '\n') {
+			    *dp++ = sep[0];
+			    if (sepLen == 2) {
+				*dp++ = sep[1];
+			    };
+			} else {
+			    *dp++ = c;
+			}
+		    }
+
+		    len = dp - buf;
 #ifdef WIN32
-                    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
-                        cnt = __win32_fwrite(buf, 1, len, f);
-                    } else
+		    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
+			cnt = __win32_fwrite(buf, 1, len, f);
+		    } else
 #endif
-                    {
-                        __WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType));
-                    }
-                    free(buf);
-                } else  {  // No EOL conversion needed
+		    {
+			__WRITEBYTES__(cnt, f, buf, len, _buffered, __INST(handleType));
+		    }
+		    free(buf);
+		} else  {  // No EOL conversion needed
 #ifdef WIN32
-                    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
-                        cnt = __win32_fwrite(stringP, 1, len, f);
-                    } else
+		    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
+			cnt = __win32_fwrite(stringP, 1, len, f);
+		    } else
 #endif
-                    {
-                        o_offs = (char *)__stringVal(aCollection)-(char *)__InstPtr(aCollection);
-                        __WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs+iStart-1, len, _buffered, __INST(handleType));
-                    }
-                }
-            } else {  // Not a string
-                if (__INST(binary) == true) {
-                    int offs;
-
-                    if (__isByteArrayLike(aCollection)) {
-                        offs = 0;
-                        len = __byteArraySize(aCollection);
-                    } else if (__isBytes(aCollection)) {
-                        offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars));
-                        len = __byteArraySize(aCollection) - offs;
-                    } else
-                        goto out;
-
-                    if (iStop > len) {
-                        RETURN(self);
-                    }
-                    if (iStop > len)
-                        iStop = len;
-                    len = iStop - iStart + 1;
-                    offs += iStart - 1;
+		    {
+			o_offs = (char *)__stringVal(aCollection)-(char *)__InstPtr(aCollection);
+			__WRITEBYTES_OBJ__(cnt, f, aCollection, o_offs+iStart-1, len, _buffered, __INST(handleType));
+		    }
+		}
+	    } else {  // Not a string
+		if (__INST(binary) == true) {
+		    int offs;
+
+		    if (__isByteArrayLike(aCollection)) {
+			offs = 0;
+			len = __byteArraySize(aCollection);
+		    } else if (__isBytes(aCollection)) {
+			offs = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(aCollection))->c_ninstvars));
+			len = __byteArraySize(aCollection) - offs;
+		    } else
+			goto out;
+
+		    if (iStop > len) {
+			RETURN(self);
+		    }
+		    if (iStop > len)
+			iStop = len;
+		    len = iStop - iStart + 1;
+		    offs += iStart - 1;
 #ifdef WIN32
-                    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
-                        cnt = __win32_fwrite(__stringVal(aCollection)+iStart-1, 1, len, f);
-                    } else
+		    if ((f == __win32_stdout()) || (f == __win32_stderr())) {
+			cnt = __win32_fwrite(__stringVal(aCollection)+iStart-1, 1, len, f);
+		    } else
 #endif
-                    {
-                        o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element)-(char *)__InstPtr(aCollection);
-                        __WRITEBYTES_OBJ__(cnt, f,  aCollection, o_offs+offs, len, _buffered, __INST(handleType));
-                    }
-                } else
-                    goto out;
-            }
-            if (cnt == len) {
-                if (__isSmallInteger(__INST(position))) {
-                    INT np = __intVal(__INST(position)) + len;
-                    OBJ t;
-
-                    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
-                } else {
-                    __INST(position) = nil; /* i.e. do not know */
-                }
-                RETURN (self);
-            }
-            error = __mkSmallInteger(__threadErrno);
-        }
+		    {
+			o_offs = (char *)(__ByteArrayInstPtr(aCollection)->ba_element)-(char *)__InstPtr(aCollection);
+			__WRITEBYTES_OBJ__(cnt, f,  aCollection, o_offs+offs, len, _buffered, __INST(handleType));
+		    }
+		} else
+		    goto out;
+	    }
+	    if (cnt == len) {
+		if (__isSmallInteger(__INST(position))) {
+		    INT np = __intVal(__INST(position)) + len;
+		    OBJ t;
+
+		    t = __MKINT(np); __INST(position) = t; __STORE(self, t);
+		} else {
+		    __INST(position) = nil; /* i.e. do not know */
+		}
+		RETURN (self);
+	    }
+	    error = __mkSmallInteger(__threadErrno);
+	}
     }
 out: ;
 %}.
     error notNil ifTrue:[
-        lastErrorNumber := error.
-        self writeError:error.
-        ^ self
+	lastErrorNumber := error.
+	self writeError:error.
+	^ self
     ].
     ^ super nextPutAll:aCollection startingAt:start to:stop
 !
@@ -6427,11 +6435,11 @@
 !ExternalStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.407 2015-02-16 18:11:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.408 2015-02-16 18:41:02 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.407 2015-02-16 18:11:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ExternalStream.st,v 1.408 2015-02-16 18:41:02 cg Exp $'
 ! !