16 lines
454 B
Forth
16 lines
454 B
Forth
variable a
|
|
: n>a (.) tuck a @ swap move a +! ;
|
|
: >a a @ c! 1 a +! ;
|
|
: encode ( c-addr +n a -- a n' )
|
|
dup a ! -rot over c@ 1 2swap 1 /string bounds ?do
|
|
over i c@ = if 1+
|
|
else n>a >a i c@ 1 then
|
|
loop n>a >a a @ over - ;
|
|
|
|
: digit? [char] 0 [ char 9 1+ literal ] within ;
|
|
: decode ( c-addr +n a -- a n' )
|
|
dup a ! 0 2swap bounds ?do
|
|
i c@ digit? if 10 * i c@ [char] 0 - + else
|
|
a @ over i c@ fill a +! 0 then
|
|
loop drop a @ over - ;
|