# HG changeset patch # User Claus Gittinger # Date 1500025437 -7200 # Node ID 2fbda206b29376810547db1544f1959e62c68410 # Parent cd76ffe41e4c9625b7feab75fb779e57f7183cbc class: CharacterArray changed: #scanf: #scanf_scanArgFrom:to:format: obsolete methods removed (fwd. to PrintfScanf) diff -r cd76ffe41e4c -r 2fbda206b293 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 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'!