"
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
"{ Package: 'stx:libbasic' }"
ExternalStream subclass:#NonPositionableExternalStream
instanceVariableNames:''
classVariableNames:'StdInStream StdOutStream StdErrorStream'
poolDictionaries:''
category:'Streams-External'
!
!NonPositionableExternalStream primitiveDefinitions!
%{
#ifndef _STDIO_H_INCLUDED_
# include <stdio.h>
# define _STDIO_H_INCLUDED_
#endif
%}
! !
!NonPositionableExternalStream class methodsFor:'documentation'!
copyright
"
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
!
documentation
"
This class provides common protocol for all non-positionable,
external streams. Concrete subclasses are terminal streams, pipe streams,
PrinterStreams, Sockets etc.
There are three special instances of this class, representing stdin,
stdout and stderr of the smalltalk/X process (see Unix manuals, if you
dont know what those are used for). These special streams are bound to
to globals Stdin, Stdout and Stderr at early initialization time
(see Smalltalk>>initializeStandardStreams).
The name of this class is a historical leftover - it should be called
'TTYStream' or similar.
[author:]
Claus Gittinger
"
! !
!NonPositionableExternalStream class methodsFor:'instance creation'!
forStderr
"{ Pragma: +optSpace }"
"return a NonPositionableExternalStream object for writing to
Unixes standard error output file descriptor"
StdErrorStream isNil ifTrue:[
StdErrorStream := self basicNew initializeForStderr
].
^ StdErrorStream
!
forStdin
"{ Pragma: +optSpace }"
"return a NonPositionableExternalStream object for reading from
Unixes standard input file descriptor"
StdInStream isNil ifTrue:[
StdInStream := self basicNew initializeForStdin
].
^ StdInStream
!
forStdout
"{ Pragma: +optSpace }"
"return a NonPositionableExternalStream object for writing to
Unixes standard output file descriptor"
StdOutStream isNil ifTrue:[
StdOutStream := self basicNew initializeForStdout
].
^ StdOutStream
! !
!NonPositionableExternalStream methodsFor:'error handling'!
positionError
"{ Pragma: +optSpace }"
"notify that this stream has no concept of a position"
^ PositionErrorSignal raiseRequestWith:self
"
Stderr positionError
"
! !
!NonPositionableExternalStream methodsFor:'positioning'!
position
"{ Pragma: +optSpace }"
"catch position - there is none here"
^ self positionError
!
position:aPosition
"{ Pragma: +optSpace }"
"catch position - there is none here"
^ self positionError
!
skip:numberToSkip
"skip count bytes/characters, return the receiver"
"dont know how to unread ..."
numberToSkip < 0 ifTrue:[
PositionErrorSignal raiseRequest.
^ self
].
numberToSkip timesRepeat:self next
"Modified: / 30.7.1999 / 12:42:12 / cg"
!
skipThroughAll:aCollection
"skip for and through the sequence given by the argument, aCollection;
return nil if not found, the receiver otherwise.
On a successful match, the next read will return elements after aCollection;
if no match was found, the receiver will be positioned at the end.
Redefined to be the same as Stream>>#skipThroughAll, to undo
the redefinition from PositionableStream"
|buffer l first idx|
l := aCollection size.
first := aCollection at:1.
[self atEnd] whileFalse:[
buffer isNil ifTrue:[
buffer := self nextAvailable:l.
].
buffer = aCollection ifTrue:[
^ self
].
idx := buffer indexOf:first startingAt:2.
idx == 0 ifTrue:[
buffer := nil
] ifFalse:[
buffer := (buffer copyFrom:idx) , (self nextAvailable:(idx - 1))
]
].
^ nil
"
|s|
s := ReadStream on:'12345678901234567890'.
s skipThroughAll:'901'.
s upToEnd
"
"
|s|
s := ReadStream on:'12345678901234567890'.
s skipThroughAll:'1234'.
s upToEnd
"
"
|s|
s := ReadStream on:'12345678901234567890'.
s skipThroughAll:'999'.
s atEnd
"
"Modified: / 11.1.1997 / 19:09:06 / cg"
"Created: / 15.1.1998 / 23:33:37 / stefan"
! !
!NonPositionableExternalStream methodsFor:'printing & storing'!
printOn:aStream
"{ Pragma: +optSpace }"
"append a user printed representation of the receiver to aStream.
The format is suitable for a human - not meant to be read back."
|myName|
self == Stdin ifTrue:[
myName := 'Stdin'.
] ifFalse:[
self == Stdout ifTrue:[
myName := 'Stdout'.
] ifFalse:[
self == Stderr ifTrue:[
myName := 'Stderr'.
]
]
].
myName notNil ifTrue:[
aStream nextPutAll:myName.
^ self
].
super printOn:aStream
!
storeOn:aStream
"{ Pragma: +optSpace }"
"append a printed representation of the receiver on aStream, from
which the receiver can be reconstructed."
((self == Stdin)
or:[self == Stdout
or:[self == Stderr]]) ifTrue:[
^ self printOn:aStream
].
super storeOn:aStream
! !
!NonPositionableExternalStream methodsFor:'private'!
handleForStderr
"{ Pragma: +optSpace }"
"return a stderr handle"
%{
RETURN ( __MKOBJ(stderr) );
%}
!
handleForStdin
"{ Pragma: +optSpace }"
"return a stdin handle"
%{
RETURN ( __MKOBJ(stdin) );
%}
!
handleForStdout
"{ Pragma: +optSpace }"
"return a stdout handle"
%{
RETURN ( __MKOBJ(stdout) );
%}
!
initializeForStderr
"{ Pragma: +optSpace }"
"setup for writing to stderr"
mode := #readwrite.
buffered := false.
filePointer := self handleForStderr.
OperatingSystem isMSWINDOWSlike ifTrue:[
eolMode := #crlf
]
!
initializeForStdin
"{ Pragma: +optSpace }"
"setup for reading stdin"
mode := #readonly.
"/ buffered := true.
buffered := false.
filePointer := self handleForStdin.
!
initializeForStdout
"{ Pragma: +optSpace }"
"setup for writing to stdout"
mode := #readwrite.
buffered := false.
filePointer := self handleForStdout.
OperatingSystem isMSWINDOWSlike ifTrue:[
eolMode := #crlf
]
!
reOpen
"{ Pragma: +optSpace }"
"reopen the stream after an image restart.
If I am one of the standard streams, reopen is easy"
(self == StdInStream) ifTrue:[
^ self initializeForStdin
].
(self == StdOutStream) ifTrue:[
^ self initializeForStdout
].
(self == StdErrorStream) ifTrue:[
^ self initializeForStderr
].
^ super reOpen
! !
!NonPositionableExternalStream methodsFor:'queries'!
atEnd
"return true, if position is at end"
(self == StdInStream) ifTrue:[
OperatingSystem hasConsole ifFalse:[
^ true
]
].
"first, wait to avoid blocking on the read.
On end of stream or error, readWait will return"
self readWait.
^ super atEnd.
!
current
"for compatibility with Transcript - allow Transcript current,
even if redirected to the standardError"
self == Transcript ifTrue:[
^ self
].
^ super current
!
isPositionable
"return true, if the stream supports positioning (this one is not)"
^ false
! !
!NonPositionableExternalStream class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libbasic/NonPositionableExternalStream.st,v 1.42 2002-11-11 09:29:46 cg Exp $'
! !