class: CharacterArray
authorClaus Gittinger <cg@exept.de>
Fri, 14 Jul 2017 11:43:57 +0200
changeset 4473 2fbda206b293
parent 4472 cd76ffe41e4c
child 4474 98208d107b52
class: CharacterArray changed: #scanf: #scanf_scanArgFrom:to:format: obsolete methods removed (fwd. to PrintfScanf)
extensions.st
--- 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'!