ExtStream.st
changeset 932 f57ec42ceb44
parent 872 af04035b443d
child 933 2eebae059045
--- a/ExtStream.st	Fri Feb 02 20:21:40 1996 +0100
+++ b/ExtStream.st	Sun Feb 04 20:06:39 1996 +0100
@@ -17,7 +17,7 @@
 		lastErrorNumber'
 	 classVariableNames:'Lobby LastErrorNumber 
 		InvalidReadSignal InvalidWriteSignal InvalidModeSignal
-		OpenErrorSignal StreamNotOpenSignal'
+		OpenErrorSignal StreamNotOpenSignal InvalidOperationSignal'
 	 poolDictionaries:''
 	 category:'Streams-External'
 !
@@ -196,6 +196,10 @@
 	InvalidModeSignal nameClass:self message:#invalidModeSignal.
 	InvalidModeSignal notifierString:'binary/text mode mismatch'.
 
+	InvalidOperationSignal :=  StreamErrorSignal newSignalMayProceed:false.
+	InvalidOperationSignal nameClass:self message:#invalidOperationSignal.
+	InvalidOperationSignal notifierString:'unsupported file operation'.
+
 	StreamNotOpenSignal := StreamErrorSignal newSignalMayProceed:false.
 	StreamNotOpenSignal nameClass:self message:#streamNotOpenSignal.
 	StreamNotOpenSignal notifierString:'stream is not open'.
@@ -244,6 +248,13 @@
     ^ InvalidModeSignal
 !
 
+invalidOperationSignal
+    "return the signal raised when an unsupported or invalid
+     I/O operation is attempted"
+
+    ^ InvalidOperationSignal
+!
+
 invalidReadSignal
     "return the signal raised when reading from writeonly streams"
 
@@ -526,6 +537,15 @@
 		      in:thisContext sender
 !
 
+errorUnsupportedOperation
+    "report an error, that some unsupported operation was attempted"
+
+    ^ InvalidOperationSignal
+	raiseRequestWith:self
+	errorString:'unsupported operation'
+		 in:thisContext sender
+!
+
 errorWriteOnly
     "report an error, that the stream is a writeOnly stream"
 
@@ -1185,6 +1205,41 @@
     self position:"0" 1
 !
 
+truncateTo:newSize
+    "truncate the underlying OS file to newSize.
+     Warning: this may not be implemented on all platforms."
+%{  /* NOCONTEXT */
+#ifdef HAS_FTRUNCATE
+    FILE *f;
+    OBJ fp;
+
+    if (((fp = _INST(filePointer)) != nil)
+     && (_INST(mode) != @symbol(readonly))) {
+        if (__isSmallInteger(newSize)) {
+	    f = __FILEVal(fp);
+
+	    ftruncate(fileno(f), __intVal(newSize));
+	    RETURN (self);
+	}
+    }
+#endif
+%}.
+    filePointer isNil ifTrue:[^ self errorNotOpen].
+    (mode == #readonly) ifTrue:[^ self errorReadOnly].
+    ^ self errorUnsupportedOperation
+
+    "
+     |s|
+
+     s := 'test' asFilename writeStream.
+     s next:1000 put:$a.
+     s truncateTo:100.
+     s close.
+
+     ('test' asFilename fileSize) printNL
+    "
+!
+
 setToEnd
     "redefined since it must be implemented differently"
 
@@ -3474,6 +3529,6 @@
 !ExternalStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Attic/ExtStream.st,v 1.84 1996-01-16 19:11:19 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Attic/ExtStream.st,v 1.85 1996-02-04 19:06:39 cg Exp $'
 ! !
 ExternalStream initialize!