pack: support numbered format strings.
parent
1456e14a09
commit
77c122941d
|
@ -36,6 +36,9 @@ IN: pack.tests
|
|||
"cstiq" [ pack-native ] keep unpack-native
|
||||
] unit-test
|
||||
|
||||
{ B{ 1 2 3 4 5 0 0 0 } } [ { 1 2 3 4 5 } "4ci" pack-le ] unit-test
|
||||
{ { 1 2 3 4 5 } } [ B{ 1 2 3 4 5 0 0 0 } "4ci" unpack-le ] unit-test
|
||||
|
||||
[ 9 ] [ "iic" packed-length ] unit-test
|
||||
[ "iii" read-packed-le ] must-infer
|
||||
[ "iii" read-packed-be ] must-infer
|
||||
|
|
|
@ -1,11 +1,7 @@
|
|||
! Copyright (C) 2009 Doug Coleman.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: alien alien.c-types arrays assocs byte-arrays io
|
||||
io.binary io.streams.string kernel math math.parser namespaces
|
||||
make parser quotations sequences strings vectors
|
||||
words macros math.functions math.bitwise fry generalizations
|
||||
combinators.smart io.streams.byte-array io.encodings.binary
|
||||
math.vectors combinators multiline endian ;
|
||||
USING: alien.c-types ascii assocs combinators combinators.smart
|
||||
endian fry io kernel macros math math.vectors sequences strings ;
|
||||
IN: pack
|
||||
|
||||
GENERIC: >n-byte-array ( obj n -- byte-array )
|
||||
|
@ -33,6 +29,13 @@ M: string >n-byte-array ( n string -- byte-array ) heap-size >n-byte-array ;
|
|||
|
||||
<PRIVATE
|
||||
|
||||
: expand-pack-format ( str -- str' )
|
||||
f swap [
|
||||
dup digit?
|
||||
[ [ 0 or 10 * ] [ CHAR: 0 - ] bi* + f ]
|
||||
[ [ 1 or ] [ <string> ] bi* f swap ] if
|
||||
] { } map-as "" concat-as nip ; foldable
|
||||
|
||||
CONSTANT: pack-table
|
||||
H{
|
||||
{ CHAR: c s8>byte-array }
|
||||
|
@ -90,6 +93,7 @@ CONSTANT: packed-length-table
|
|||
PRIVATE>
|
||||
|
||||
MACRO: pack ( str -- quot )
|
||||
expand-pack-format
|
||||
[ pack-table at '[ _ execute ] ] { } map-as
|
||||
'[ [ [ _ spread ] input<sequence ] B{ } append-outputs-as ] ;
|
||||
|
||||
|
@ -116,6 +120,7 @@ MACRO: pack ( str -- quot )
|
|||
PRIVATE>
|
||||
|
||||
MACRO: unpack ( str -- quot )
|
||||
expand-pack-format
|
||||
[ [ ch>packed-length ] { } map-as start/end ]
|
||||
[ [ unpack-table at '[ @ ] ] { } map-as ] bi
|
||||
[ '[ [ _ _ ] dip <slice> @ ] ] 3map
|
||||
|
|
Loading…
Reference in New Issue