substreams/Xtreams__MatchReadSubstream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 01 Feb 2012 00:56:17 +0000
changeset 103 726bf2ca0b99
parent 67 a87e5ce04545
child 109 9587e2df7029
permissions -rw-r--r--
Removed methods from FileHandle to make it compilable. Having methods there is not a good idea anyway.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/substreams' }"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
ReadSubstream subclass:#MatchReadSubstream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'substreamAtEnd pattern patternStart inclusive hasReread reread
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
		buffer backtrack'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     8
	classVariableNames:''
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     9
	poolDictionaries:''
22
e0653bbdbe61 added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 4
diff changeset
    10
	category:'Xtreams-Substreams'
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
MatchReadSubstream comment:'This is a substream bounded by a string pattern. The algorithm used doesn''t need to peek or step back to detect the pattern, so it can be used on non-positionable streams.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
Instance Variables
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
	substreamAtEnd	<Boolean> is this substream at end
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
	pattern	<String> the bounding pattern
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
	patternStart	<Integer>
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
	inclusive	<Boolean> is the boundary part of the substream contents
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
	hasReread	<Boolean>
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
	reread	<Object>
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
	buffer	<RingBuffer> read-ahead buffer (to be able to stop before pattern if inclusive is false)
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
	backtrack	<Array> backtracking table for pattern
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
!MatchReadSubstream class methodsFor:'instance creation'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
on: aSource pattern: aPattern backtrack: aBacktrack inclusive: aBoolean
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
	^self new on: aSource pattern: aPattern backtrack: aBacktrack inclusive: aBoolean
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
!MatchReadSubstream methodsFor:'accessing'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
get
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
	buffer hasDataToRead ifTrue: [^buffer get].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	substreamAtEnd ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
	self gobble.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
	buffer hasDataToRead ifFalse: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
	^buffer get
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
read: anInteger into: aSequenceableCollection at: startIndex
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
	| count amount |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
	count := 0.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
	[count < anInteger and: [buffer hasDataToRead or: [substreamAtEnd not]]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
		[buffer hasDataToRead ifFalse: [self gobble].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
		buffer hasDataToRead ifFalse: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
		amount := buffer readSize min: (anInteger - count).
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
		buffer read: amount into: aSequenceableCollection at: startIndex + count.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
		count := count + amount].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
	count < anInteger ifTrue: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
	^anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
!MatchReadSubstream methodsFor:'initialize-release'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
close
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
	super close.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
	buffer recycle
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
on: aSource pattern: aPattern backtrack: aBacktrack inclusive: aBoolean
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
	self on: aSource.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
	pattern := aPattern.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
	buffer := RingBuffer new: pattern size class: self contentsSpecies.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
	hasReread := false.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
	backtrack := aBacktrack.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
	patternStart := 1.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
	inclusive := aBoolean.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
	substreamAtEnd := false
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
subseekend
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
	[buffer hasDataToRead or: [substreamAtEnd not]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
		[buffer hasDataToRead ifFalse: [self gobble].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
		buffer readSkip: buffer readSize]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
!MatchReadSubstream methodsFor:'private'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
gobble
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
	| object match patternStop progress |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
	patternStop := patternStart.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
	[hasReread
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
		ifTrue: [hasReread := false. object := reread. reread := nil]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
		ifFalse: [object := source get].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
	[(match := object = (pattern at: patternStop)) ifTrue: [patternStop := patternStop + 1].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
	match and: [patternStop <= pattern size]]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
		whileTrue: [object := source get]]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
			on: Incomplete do: [:incomplete |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    96
				sourceAtEnd := substreamAtEnd := true].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
	"A full pattern match"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
	patternStop > pattern size ifTrue: [
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
		inclusive ifTrue: [buffer write: pattern size from: pattern at: 1].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
		substreamAtEnd := true.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
		^self].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
	"No match at all, write out the object we just read"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
	progress := patternStop - patternStart.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
	(patternStart = 1 and: [progress = 0]) ifTrue: [
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
		sourceAtEnd ifFalse: [buffer put: object].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
		patternStart := 1.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
		^self].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
	"Partial match, write out the part of the pattern previously matched and keep the object we just read to be re-read next time"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
	hasReread := true.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   113
	reread := object.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   114
	buffer write: progress from: pattern at: patternStart.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   115
	patternStart := backtrack at: patternStop
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   116
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   117
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   118
streamingInsert: anInteger into: aWriteStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   119
	| count amount |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   120
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   121
	count := 0.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   122
	[count < anInteger and: [buffer hasDataToRead or: [substreamAtEnd not]]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   123
		[buffer hasDataToRead ifFalse: [self gobble].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   124
		buffer hasDataToRead ifFalse: [(Incomplete count: count) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   125
		amount := buffer readSize min: (anInteger - count).
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   126
		aWriteStream insert: amount from: buffer.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   127
		count := count + amount].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   128
	count < anInteger ifTrue: [(Incomplete count: count) raise]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   129
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   130
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   131
streamingInsertInto: aWriteStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   132
	| amount |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   133
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   134
	[buffer hasDataToRead or: [substreamAtEnd not]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   135
		[buffer hasDataToRead ifFalse: [self gobble].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   136
		amount := buffer readSize.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   137
		aWriteStream insert: amount from: buffer]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   138
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   139
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   140
streamingWrite: anInteger into: aWriteStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   141
	| count amount |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   142
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   143
	count := 0.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   144
	[count < anInteger and: [buffer hasDataToRead or: [substreamAtEnd not]]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   145
		[buffer hasDataToRead ifFalse: [self gobble].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   146
		buffer hasDataToRead ifFalse: [(Incomplete count: count) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   147
		amount := buffer readSize min: (anInteger - count).
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   148
		aWriteStream write: amount from: buffer.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   149
		count := count + amount].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   150
	count < anInteger ifTrue: [(Incomplete count: count) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   151
	^anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   152
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   153
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   154
streamingWriteInto: aWriteStream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   155
	| amount count |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   156
	count := 0.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   157
	[buffer hasDataToRead or: [substreamAtEnd not]] whileTrue:
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   158
		[buffer hasDataToRead ifFalse: [self gobble].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   159
		amount := buffer readSize.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   160
		aWriteStream write: amount from: buffer.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   161
		count := count + amount ].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   162
	^count
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   163
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   164
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   165
!MatchReadSubstream methodsFor:'seeking'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   166
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   167
-= anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   168
	^anInteger isZero
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   169
		ifTrue:	[self subseekend. 0]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   170
		ifFalse:	[super -= anInteger]
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   171
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   172
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   173
!MatchReadSubstream methodsFor:'testing'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   174
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   175
isPositionable
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   176
	^false
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   177
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   178
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   179
!MatchReadSubstream class methodsFor:'documentation'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   180
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   181
version_SVN
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   182
    ^ '$Id$'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   183
! !