WriteStream.st
changeset 63 1f0cdefb013f
parent 10 4f1f9a91e406
child 68 59faa75185ba
--- a/WriteStream.st	Fri Feb 25 14:05:47 1994 +0100
+++ b/WriteStream.st	Fri Feb 25 14:07:09 1994 +0100
@@ -26,7 +26,7 @@
 streamed-upon collection if it cannot grow. Thus its slightly incompatible to ST-80 since
 aStream contents does not always return the original collection. This will change soon.
 
-$Header: /cvs/stx/stx/libbasic/WriteStream.st,v 1.5 1993-11-08 02:32:41 claus Exp $
+$Header: /cvs/stx/stx/libbasic/WriteStream.st,v 1.6 1994-02-25 13:07:09 claus Exp $
 '!
 
 !WriteStream class methodsFor:'instance creation'!
@@ -72,7 +72,7 @@
     (aNumber < collection size) ifTrue:[writeLimit := aNumber]
 ! !
 
-!WriteStream methodsFor:'reading/writing'!
+!WriteStream methodsFor:'reading'!
 
 next
     "catch read access to write stream - report an error"
@@ -84,11 +84,75 @@
     "catch read access to write stream - report an error"
 
     self shouldNotImplement
-!
+! !
+
+!WriteStream methodsFor:'writing'!
 
 nextPut:anObject
     "append the argument, anObject to the stream"
 
+%{  /* NOCONTEXT */
+
+#ifdef NOTDEF
+
+    REGISTER int pos;
+    unsigned ch;
+    OBJ coll;
+
+    coll = _INST(collection);
+    if (_isNonNilObject(coll)
+     && _isSmallInteger(_INST(position))) {
+
+        pos = _intVal(_INST(position));
+
+        if (_isSmallInteger(_INST(writeLimit)) 
+         && (pos <= _intVal(_INST(writeLimit)))
+         && (pos > 0)) {
+            OBJ cls;
+
+            cls = _qClass(coll);
+            if (cls == String) {
+                if (__isCharacter(anObject) 
+                 && (pos <= _stringSize(coll))) {
+                    _StringInstPtr(coll)->s_element[pos-1] = _intVal(_characterVal(anObject));
+                    _INST(position) = _MKSMALLINT(pos + 1);
+                    if (_isSmallInteger(_INST(readLimit))
+                     && (pos >= _intVal(_INST(readLimit)))) {
+                        _INST(readLimit) = _MKSMALLINT(pos + 1);
+                    }
+                    RETURN ( anObject );
+                }
+            } else if (cls == ByteArray) {
+                if (_isSmallInteger(anObject) 
+                 && ((ch = _intVal(anObject)) >= 0)
+                 && (ch <= 255)
+                 && (pos <= _byteArraySize(coll))) {
+                    _ByteArrayInstPtr(coll)->ba_element[pos-1] = ch;
+                    _INST(position) = _MKSMALLINT(pos + 1);
+                    if (_isSmallInteger(_INST(readLimit))
+                     && (pos >= _intVal(_INST(readLimit)))) {
+                        _INST(readLimit) = _MKSMALLINT(pos + 1);
+                    }
+                    RETURN ( anObject );
+                }
+            } else if (cls == Array) {
+                if (pos <= _arraySize(coll)) {
+                     _ArrayInstPtr(coll)->a_element[pos-1] = anObject;
+                    __STORE(coll, anObject);
+                    _INST(position) = _MKSMALLINT(pos + 1);
+                    if (_isSmallInteger(_INST(readLimit))
+                     && (pos >= _intVal(_INST(readLimit)))) {
+                        _INST(readLimit) = _MKSMALLINT(pos + 1);
+                    }
+                    RETURN ( anObject );
+                }
+            }
+        }
+    }
+#endif
+
+%}
+.
     (position > collection size) ifTrue:[self growCollection].
     collection at:position put:anObject.
     (position > readLimit) ifTrue:[readLimit := position].
@@ -96,8 +160,28 @@
     ^anObject
 !
 
+next:count put:anObject
+    "append anObject count times to the receiver.
+     Redefined to avoid count grows of the underlying collection -
+     instead a single grow on the final size is performed."
+
+    |nMore final|
+
+    final := position + count - 1.
+    (final > collection size) ifTrue:[
+        self growCollection:final
+    ].
+    collection atAll:(position to:final) put:anObject.
+
+    position := position + count.
+    (position > readLimit) ifTrue:[readLimit := position - 1].
+    ^ anObject
+!
+
 nextPutAll:aCollection
-    "append all elements of the argument, aCollection to the stream"
+    "append all elements of the argument, aCollection to the stream.
+     Redefined to avoid count grows of the underlying collection -
+     instead a single grow on the final size is performed."
 
     |nMore final|
 
@@ -114,62 +198,23 @@
     position := position + nMore.
     (position > readLimit) ifTrue:[readLimit := position - 1].
     ^ aCollection
-!
-
-cr
-    "append a carriage-return to the stream"
-
-    self nextPut:(Character cr)
-!
-
-tab
-    "append a tab-character to the stream"
-
-    self nextPut:(Character tab)
-!
-
-crTab
-    "append a carriage-return followed by a tab to the stream"
-
-    self nextPut:(Character cr).
-    self nextPut:(Character tab)
-!
-
-space
-    "append a space character to the receiver-stream"
-
-    self nextPut:(Character space)
-!
-
-spaces:count
-    "append count space-characters to the receiver-stream"
-
-    1 to:count do:[:dummy |
-        self nextPut:(Character space)
-    ]
-!
-
-ff
-    "append a form-feed (new-pagee) to the receiver-stream"
-
-    self nextPut:(Character ff)
 ! !
 
 !WriteStream methodsFor:'ignored'!
 
 bold
-    "ignore font change - this allows WriteStreams to be compatible
-     to PrinterStreams"
+    "change font to bold - ignored here.
+     - this allows WriteStreams to be compatible to PrinterStreams"
 !
 
 italic
-    "ignore font change - this allows WriteStreams to be compatible
-     to PrinterStreams"
+    "change font to italic - ignored here.
+     - this allows WriteStreams to be compatible to PrinterStreams"
 !
 
 normal
-    "ignore font change - this allows WriteStreams to be compatible
-     to PrinterStreams"
+    "change font to normal - ignored here.
+     - this allows WriteStreams to be compatible to PrinterStreams"
 ! !
 
 !WriteStream methodsFor:'private'!