• Re: Parsing =?UTF-8?B?dGltZXN0YW1wcz8=?=

    From mhx@21:1/5 to dxf on Sun Oct 6 08:59:23 2024
    On Sun, 6 Oct 2024 7:51:31 +0000, dxf wrote:

    Is there an easier way of doing this? End goal is a double number representing centi-secs.


    empty decimal

    : SPLIT ( a u c -- a2 u2 a3 u3 ) >r 2dup r> scan 2swap 2 pick - ;
    : >INT ( adr len -- u ) 0 0 2swap >number 2drop drop ;

    : /T ( a u -- $hour $min $sec )
    2 0 do [char] : split 2swap dup if 1 /string then loop
    2 0 do dup 0= if 2rot 2rot then loop ;

    : .T 2swap 2rot cr >int . ." hr " >int . ." min " >int . ." sec " ;

    s" 1:2:3" /t .t
    s" 02:03" /t .t
    s" 03" /t .t
    s" 23:59:59" /t .t
    s" 0:00:03" /t .t

    Why don't you use the fact that >NUMBER returns the given
    string starting with the first unconverted character?
    SPLIT should be redundant.

    -marcel

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Ahmed@21:1/5 to dxf on Tue Oct 8 06:08:17 2024
    On Tue, 8 Oct 2024 3:07:31 +0000, dxf wrote:

    Not bad. Here's a translation. Hopefully it's equivalent (?)

    : split ( a u c -- a2 u2 a3 u3 )
    >r 2dup r> scan 2swap 2 pick - ;

    : number ( a u -- u ) 0 0 2swap >number 2drop ;

    : xx. ( u -- ) 0 <# bl hold # # #> type ;
    : tab3. ( h m s -- ) 3 spaces ( tab) rot xx. swap xx. xx. ;

    : ts_elms ( a u -- h m s )
    2>r 0 0 0 2r> begin
    [char] : skip [char] : split dup 0> while
    number drop 5 roll drop -rot
    repeat 2drop 2drop ;

    s" 25" ts_elms tab3. 00 00 25 ok
    s" 10:25" ts_elms tab3. 00 10 25 ok
    s" 2:10:25" ts_elms tab3. 02 10 25 ok

    I know you don't care about this case, but:
    s" 1:1:" ts_elms tab3. 00 01 01 ok
    It should be 01 01 00

    Ahmed

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Ahmed@21:1/5 to All on Tue Oct 8 18:12:14 2024
    Hi, Here is a programme that uses your split word.
    I think it works for all combinations (formats).

    \ here begins the code

    : SPLIT ( a u c -- a2 u2 a3 u3 ) >r 2dup r> scan 2swap 2 pick - ;

    : advance 1- swap 1+ swap ;

    : .00?1
    dup 1 3 within 0= if 2drop s" 00" then
    ;

    : .00?2
    dup 0= if 2drop s" 00" exit then
    dup 1 3 within 0= if 2drop 2swap 2>r s" 00" 2swap 2r> then
    ;

    : .00?3
    dup 0= if 2drop s" 00" exit then
    dup 1 3 within 0= if 2drop 2swap 2>r s" 00" 2rot 2rot 2r> then
    ;

    : step1 [char] : split 2swap 2>r .00?1 2swap 2r> advance ;
    : step2 [char] : split 2swap 2>r .00?2 2swap 2r> advance ;
    : step3 [char] : split 2swap 2>r .00?3 2swap 2r> advance ;

    : :t s" --" 2swap step1 step2 step3 2drop 2drop ;

    : sts space type space ;
    : .hr sts ." hr" ;
    : .min sts ." min" ;
    : .sec sts ." sec" ;

    : .t 2>r 2swap .hr .min 2r> .sec ;
    \ the code finshes here.

    Some tests (gforth under wsl):

    s" 10:20:30" :t .t 10 hr 20 min 30 sec ok
    s" 1:20:30" :t .t 1 hr 20 min 30 sec ok

    s" 1:2:30" :t .t 1 hr 2 min 30 sec ok
    s" 1:2:3" :t .t 1 hr 2 min 3 sec ok
    s" :2:3" :t .t 00 hr 2 min 3 sec ok
    s" 2:3" :t .t 00 hr 2 min 3 sec ok
    s" :3" :t .t 00 hr 00 min 3 sec ok
    s" ::3" :t .t 00 hr 00 min 3 sec ok
    s" ::" :t .t 00 hr 00 min 00 sec ok
    s" :" :t .t 00 hr 00 min 00 sec ok
    s" " :t .t 00 hr 00 min 00 sec ok
    s" 1:" :t .t 00 hr 1 min 00 sec ok
    s" :1:" :t .t 00 hr 1 min 00 sec ok
    s" 10::" :t .t 10 hr 00 min 00 sec ok
    s" 10:5:" :t .t 10 hr 5 min 00 sec ok
    s" 10:5:2" :t .t 10 hr 5 min 2 sec ok

    Ahmed

    --

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)