dxf
2024-10-07 08:52:15 UTC
Earlier I mentioned scanning in reverse. Here's an implementation.
[undefined] dxforth [if]
: \CHAR ( a u -- a2 u2 c ) 1- 2dup + c@ ;
[then]
\ As for SCAN but scan from end
: SCAN< ( a u c -- a2 u2 | a 0 )
rot drop rdrop ;
\ As for SPLIT but scan from end. Latter string is topmost.
: SPLIT< ( a u c -- a2 u2 a3 u3 )
: /T ( a u -- hour min sec )
3 0 do
[char] : split< 0 0 2swap >number 2drop drop -rot
( u ... a u) dup if 1- then
loop 2drop swap rot ;
: T /t cr rot . ." hr " swap . ." min " . ." sec " ;
s" 1:2:3" t
s" 02:03" t
s" 06:" t
s" 03" t
s" 23:59:59" t
s" 0:00:03" t
[undefined] dxforth [if]
: \CHAR ( a u -- a2 u2 c ) 1- 2dup + c@ ;
[then]
\ As for SCAN but scan from end
: SCAN< ( a u c -- a2 u2 | a 0 )
rot drop rdrop ;
\ As for SPLIT but scan from end. Latter string is topmost.
: SPLIT< ( a u c -- a2 u2 a3 u3 )
r 2dup r> scan< 2swap 2 pick /string ;
\ example: /T ( a u -- hour min sec )
3 0 do
[char] : split< 0 0 2swap >number 2drop drop -rot
( u ... a u) dup if 1- then
loop 2drop swap rot ;
: T /t cr rot . ." hr " swap . ." min " . ." sec " ;
s" 1:2:3" t
s" 02:03" t
s" 06:" t
s" 03" t
s" 23:59:59" t
s" 0:00:03" t