MultiReadStream.st
author Stefan Vogel <sv@exept.de>
Sun, 11 Jul 2010 19:21:36 +0200
changeset 2463 cbb5fd7ae437
parent 2450 ffafc2eb3364
child 2654 b6e04b9a3500
permissions -rw-r--r--
added: #position - needed for CScanner
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2449
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
PeekableStream subclass:#MultiReadStream
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'streamStack'
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Streams-Misc'
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!MultiReadStream class methodsFor:'documentation'!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    Stacked streams. At any time, another stream can be stacked onto
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
    a stream stack. Making this streams contents to be returned before the
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    rest. To the stream reader, this looks like a bunch of embedded streams.
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    Useful when reading files which include each other, or to handle
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
    define-macro expansion in a c-parser.
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    [instance variables:]
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
    "Created: / 21-05-2010 / 14:34:48 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
examples
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    |s|
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
    s := MultiReadStream on:('abcd' readStream).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
    self assert:(s peek == $a).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
    self assert:(s next == $a).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
    s pushInputStream:('1234' readStream).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
    self assert:(s next == $1).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
    self assert:(s next == $2).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
    s pushInputStream:('aa' readStream).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
    self assert:(s next == $a).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    self assert:(s next == $a).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    self assert:(s atEnd not).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    self assert:(s next == $3).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    self assert:(s next == $4).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    self assert:(s next == $b).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    self assert:(s next == $c).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    self assert:(s next == $d).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    self assert:(s atEnd).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    self assert:(s peek == nil).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    self assert:(s next == nil).
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    "Created: / 21-05-2010 / 14:27:53 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
! !
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
!MultiReadStream class methodsFor:'instance creation'!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
on:aReadStream
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    ^ self basicNew pushInputStream:aReadStream
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    "Created: / 21-05-2010 / 14:26:03 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
! !
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
!MultiReadStream methodsFor:'private'!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
checkCurrentStreamAtEnd
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    [streamStack notEmpty and:[streamStack last atEnd]] whileTrue:[
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
        self popInputStream
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    ].
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    "Created: / 21-05-2010 / 14:30:20 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
! !
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
!MultiReadStream methodsFor:'stream protocol'!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
atEnd
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    self checkCurrentStreamAtEnd.
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    ^ streamStack isEmpty
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    "Created: / 21-05-2010 / 14:31:48 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
2450
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
    81
contentsSpecies 
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
    82
    streamStack isEmptyOrNil ifTrue:[^ super contentsSpecies].
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
    83
    ^ streamStack first contentsSpecies
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
    84
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
    85
    "Created: / 21-05-2010 / 14:44:26 / cg"
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
    86
!
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
    87
2449
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
next
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    self checkCurrentStreamAtEnd.
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    streamStack isEmpty ifTrue:[^ self pastEndRead].
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    ^ streamStack last next
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    "Created: / 21-05-2010 / 14:31:23 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
peek
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    self checkCurrentStreamAtEnd.
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    streamStack isEmpty ifTrue:[^ self pastEndRead].
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    ^ streamStack last peek
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    "Created: / 21-05-2010 / 14:29:06 / cg"
2450
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   102
!
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   103
2463
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   104
position
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   105
    "/ thats depatable !!
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   106
    "/ the code below only makes sense, if we see the multiStream as some kind of
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   107
    "/ macro-expanding c-define stream
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   108
    ^ streamStack first position
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   109
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   110
    "Created: / 21-05-2010 / 14:52:40 / cg"
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   111
!
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   112
2450
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   113
position1Based
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   114
    "/ thats depatable !!
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   115
    "/ the code below only makes sense, if we see the multiStream as some kind of
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   116
    "/ macro-expanding c-define stream
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   117
    ^ streamStack first position1Based
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   118
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   119
    "Created: / 21-05-2010 / 14:52:40 / cg"
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   120
!
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   121
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   122
readStream
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   123
    ^ self
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   124
Claus Gittinger <cg@exept.de>
parents: 2449
diff changeset
   125
    "Created: / 21-05-2010 / 14:51:05 / cg"
2449
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
! !
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
!MultiReadStream methodsFor:'stream stacking'!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
popInputStream
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
    streamStack removeLast
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    "Created: / 21-05-2010 / 14:25:30 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
pushInputStream:aReadStream
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    streamStack isNil ifTrue:[
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
        streamStack := OrderedCollection new.
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    ].
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    streamStack add:aReadStream
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    "Created: / 21-05-2010 / 14:25:17 / cg"
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
! !
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
!MultiReadStream class methodsFor:'documentation'!
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
version_CVS
2463
cbb5fd7ae437 added: #position
Stefan Vogel <sv@exept.de>
parents: 2450
diff changeset
   148
    ^ '$Header: /cvs/stx/stx/libbasic2/MultiReadStream.st,v 1.3 2010-07-11 17:21:36 stefan Exp $'
2449
1401dd52e200 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
! !