terminals/Xtreams__PointerReadStream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 01 Feb 2012 00:37:59 +0000
changeset 98 bd334e72464f
parent 96 85e395d8e3d7
child 100 bd080ca99f68
permissions -rw-r--r--
Fix in #read:into:at:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/terminals' }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
ReadStream subclass:#PointerReadStream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'length contentsSpecies position'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:''
96
85e395d8e3d7 pool name fixes
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 78
diff changeset
     8
	poolDictionaries:'Xtreams::XtreamsPool'
25
02e7c3b6f63c added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 9
diff changeset
     9
	category:'Xtreams-Terminals'
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
PointerReadStream comment:'Read stream on external heap, commonly used to unmarshal output or an external library call. The terminal is a CPointer and its associated CType is used to interpret the bytes on the heap. The length of the stream should be set, to avoid reading past the allocated memory space.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
{{{
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
	| buffer |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
	buffer := CIntegerType unsignedChar malloc: 50.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
	[	buffer writing
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
			length: 50;
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
			write: ''Hello World!!''.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
		buffer reading
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
			length: 12;
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
			contentsSpecies: ByteString;
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
			rest
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
	] ensure: [ buffer free ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
}}}
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
Instance Variables
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
	length	<Integer> allocated size of the stream as a number of elements of associated CType
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
	contentsSpecies	<Class> species for collections of elements of this stream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
	position	<Integer> current position of the stream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
!PointerReadStream methodsFor:'accessing'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
get
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
	| object |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	(length isNil or: [ position < length ]) ifFalse: [ Incomplete zero raise ].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
	object := source at: position.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
	position := position + 1.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
	^object
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
read: anInteger into: aSequenceableCollection at: startIndex
98
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    46
        
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    47
        | count available |
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    48
        count := (available := self available) isNil ifTrue: [ anInteger ] ifFalse: [ available min: anInteger ].
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    49
        self breakPoint: #jv.
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    50
        self breakPoint: #mk.
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    51
        "There is no UnsignedChar here..."
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    52
        source type referentType = UnsignedChar
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    53
                ifTrue: [ source copyAt: position to: aSequenceableCollection size: anInteger startingAt: startIndex. ]
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    54
                ifFalse: [ startIndex to: startIndex + count - 1 do: [ :i | aSequenceableCollection at: i put: self get ] ].
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    55
        position := position + count.
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    56
        ^count < anInteger
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    57
                ifTrue: [ (Incomplete on: aSequenceableCollection count: count at: startIndex) raise ]
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    58
                ifFalse: [ count ]
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    59
bd334e72464f Fix in #read:into:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 96
diff changeset
    60
    "Modified: / 01-02-2012 / 00:37:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
!PointerReadStream methodsFor:'initialize-release'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
close
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
contentsSpecies
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
	^contentsSpecies
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
contentsSpecies: aClass
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
	contentsSpecies := aClass
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
length: anObject
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
	length := anObject
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
on: aPointer
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
	super on: aPointer.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
	contentsSpecies := Array.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
	position := 0
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
!PointerReadStream methodsFor:'private'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
streamingInsertInto: aWriteStream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
	^length
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
		ifNil: [ self error: 'Cannot stream from an unbounded stream' ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
		ifNotNil: [ super streamingInsertInto: aWriteStream ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
streamingWriteInto: aWriteStream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
	^length
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    96
		ifNil: [ self error: 'Cannot stream from an unbounded stream' ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
		ifNotNil: [ super streamingWriteInto: aWriteStream ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
!PointerReadStream methodsFor:'seeking'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
++ anInteger
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
	| count |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
	anInteger < 0 ifTrue: [ ^self -- anInteger negated ].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
	count := self available ifNil: [ anInteger ] ifNotNil: [ :available | available min: anInteger ].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
	position := position + anInteger.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
	count < anInteger ifTrue: [(Incomplete count: count) raise].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
	^anInteger
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
-- anInteger
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   113
	| count |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   114
	anInteger < 0 ifTrue: [ ^self ++ anInteger negated ].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   115
	count := position min: anInteger.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   116
	position := position - count.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   117
	count = anInteger ifTrue: [^anInteger].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   118
	(Incomplete count: count) raise
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   119
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   120
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   121
available
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   122
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   123
	^self length ifNotNil: [ super available ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   124
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   125
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   126
length
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   127
	^length
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   128
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   129
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   130
position
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   131
	^position
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   132
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   133
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   134
position: aPosition
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   135
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   136
	aPosition < 0 ifTrue: [Incomplete zero raise].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   137
	length ifNil: [ ^position := aPosition ].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   138
	aPosition > length ifFalse: [ ^position := aPosition ].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   139
	position := length.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   140
	^(Incomplete count: length) raise
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   141
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   142
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   143
!PointerReadStream methodsFor:'testing'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   144
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   145
isPositionable
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   146
	^true
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   147
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   148
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   149
!PointerReadStream class methodsFor:'documentation'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   150
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   151
version_SVN
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   152
    ^ '$Id$'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   153
! !