class: CharacterArray
changed:
#scanf:
#scanf_scanArgFrom:to:format:
obsolete methods removed (fwd. to PrintfScanf)
--- a/extensions.st Fri Jul 14 11:42:51 2017 +0200
+++ b/extensions.st Fri Jul 14 11:43:57 2017 +0200
@@ -550,37 +550,46 @@
!CharacterArray methodsFor:'converting'!
-scanf:dataStream
+scanf:dataStreamOrString
"Return a Collection of objects found in the Character Stream
<dataStream> as interpreted according to the receiver.
The receiver is assumed to be a conversion control string as
specified in the Unix C-language manual page for scanf(3).
For copyright information, see goodies/String-printf_scanf.chg"
- |results format char|
+ |dataStream|
- results := OrderedCollection new.
- format := ReadStream on:self.
- [ format atEnd ] whileFalse:[
- char := format next.
- (char == Character space or:[ char == Character tab ]) ifTrue:[
- dataStream skipSeparators.
- format skipSeparators
- ].
- char == $% ifTrue:[
- self
- scanf_scanArgFrom:dataStream
- to:results
- format:format
- ] ifFalse:[
- dataStream peekFor:char
- ]
- ].
- ^ results
+ dataStream := dataStreamOrString readStream.
+ ^ PrintfScanf scanf:self fromStream:dataStream
+
+"/ |results format char|
+"/
+"/ results := OrderedCollection new.
+"/ format := ReadStream on:self.
+"/ [ format atEnd ] whileFalse:[
+"/ char := format next.
+"/ (char == Character space or:[ char == Character tab ]) ifTrue:[
+"/ dataStream skipSeparators.
+"/ format skipSeparators
+"/ ].
+"/ char == $% ifTrue:[
+"/ PrintfScanf scanArgFrom:dataStream to:results format:format.
+"/ ] ifFalse:[
+"/ dataStream peekFor:char
+"/ ]
+"/ ].
+"/ ^ results
"
'%d %x' scanf:(ReadStream on:'1234 ff00')
+ '%d %s' scanf:(ReadStream on:'1234 ff00')
+ '%d %b' scanf:(ReadStream on:'1234 1111')
+ '%d %f' scanf:(ReadStream on:'1234 1111')
+ '%d %f' scanf:(ReadStream on:'1234 1111.2345')
+ '%d %q' scanf:(ReadStream on:'1234 1111.2345')
"
+
+ "Modified: / 14-07-2017 / 11:11:49 / cg"
! !
!CharacterArray methodsFor:'private'!
@@ -601,106 +610,14 @@
For copyright information, see goodies/String-printf_scanf.chg"
- |final width char pos data scanset exclusive return last|
-
- final := [:retval |
- collection add:retval.
- data == dataStream ifFalse:[
- dataStream position:dataStream position + data position
- ].
- ^ self
- ].
- width := 0.
- char := format peek.
- char == $% ifTrue:[
- ^ dataStream peekFor:char
- ].
- char == $* ifTrue:[
- format next.
- char := format peek.
- final := [:retval |
- data == dataStream ifFalse:[
- dataStream position:dataStream position + data position
- ].
- ^ self
- ]
- ].
- char isDigit ifTrue:[
- width := Integer readFrom:format.
- char := format peek
- ].
- ('slhduoxfeg' includes:char) ifTrue:[
- dataStream skipSeparators
- ].
- width = 0 ifTrue:[
- data := dataStream
- ] ifFalse:[
- pos := dataStream position.
- data := ReadStream on:(dataStream next:width).
- dataStream position:pos
- ].
- char == $s ifTrue:[
- final value:(data upToSeparator)
- ].
- char == $c ifTrue:[
- width = 0 ifTrue:[
- final value:(String with:data next)
- ] ifFalse:[
- final value:data contents
- ]
- ].
- char == $[ "What a mess!!" ifTrue:[
- return := WriteStream on:(String new:8).
- scanset := IdentitySet new.
- format next.
- width = 0 ifTrue:[
- width := SmallInteger maxVal
- ].
- exclusive := format peekFor:$^.
- [
- last := char.
- char := format next.
- char == $]
- ] whileFalse:[
- char == $- ifFalse:[
- scanset add:char
- ] ifTrue:[
- last to:format next do:[:c |
- scanset add:c
- ]
- ]
- ].
- [
- data atEnd not and:[ (scanset includes:data peek) xor:exclusive ]
- ] whileTrue:[ return nextPut:data next ].
- final value:return contents
- ].
- ('lh' includes:char) ifTrue:[
- format next.
- char := format peek
- ].
- ('DUdu' includes:char) ifTrue:[
- final value:(Integer readFrom:data)
- ].
- ('FEGfeg' includes:char) ifTrue:[
- final value:(Float readFrom:data)
- ].
- ('b' includes:char) ifTrue:[
- final value:(Integer readFrom:data radix:2)
- ].
- ('Oo' includes:char) ifTrue:[
- final value:(Integer readFrom:data radix:8)
- ].
- ('Xx' includes:char) ifTrue:[
- final value:(Integer readFrom:data radix:16)
- ]
+ PrintfScanf scanArgFrom:dataStream to:collection format:format.
"
'%d %x' sscanf:'1234 ff00'
'%d %x %b' sscanf:'1234 ff00 1001'
"
- "Modified: / 29-11-2011 / 11:55:39 / cg"
+ "Modified: / 14-07-2017 / 11:09:35 / cg"
! !
!CharacterArray methodsFor:'converting'!