home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.forth      Forth programmers eat a lot of Bratwurst      117,927 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 116,908 of 117,927   
   Hans Bezemer to dxf   
   Re: Parsing timestamps?   
   28 Oct 24 18:07:32   
   
   From: the.beez.speaks@gmail.com   
      
   On 19-10-2024 03:29, dxf wrote:   
    > On 19/10/2024 1:46 am, Gerry Jackson wrote:   
    >> On 06/10/2024 08:51, 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   
    >>   
    >> Another solution   
    >>   
    >> : /t  ( ca u -- sec min hour )   
    >>     3        \ a count, decremented every recurse   
    >>     [: -rot dup 0>   
    >>        if 0. 2swap >number 1 /string 2swap drop ( -- ct ca' u' n1 )   
    >>           >r rot 1-   
    >>           recurse r> swap exit   
    >>        then 2drop   
    >>     ;] execute   
    >>     0 ?do 0 loop   \ 0 hours and minutes if missing in source string   
    >> ;   
    >> : .t   cr . ." hr "  . ." min " . ." sec " ;   
    >>   
    >> cr   
    >> 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   
    >> s" " /t .t   
    >> s" :" /t .t   
    >> s" :53" /t .t   
    >> s" 11/12/13" /t .t   \ Different separator   
    >> s" 11::13" /t .t   
    >> s" :::" /t .t   
    >> s" 3:" /t .t   
    >> s" 1:2:" /t .t   
    >>   
    >> \ Results   
    >> 1 hr 2 min 3 sec   
    >> 0 hr 2 min 3 sec   
    >> 0 hr 0 min 3 sec   
    >> 23 hr 59 min 59 sec   
    >> 0 hr 0 min 3 sec   
    >> 0 hr 0 min 0 sec   
    >> 0 hr 0 min 0 sec   
    >> 0 hr 0 min 53 sec   
    >> 11 hr 12 min 13 sec   
    >> 11 hr 0 min 13 sec   
    >> 0 hr 0 min 0 sec   
    >> 0 hr 0 min 3 sec   
    >> 0 hr 1 min 2 sec   
    >>   
    >> The last two could be regarded as wrong but you indicated elsewhere   
   that they wouldn't occur.   
    >   
    > In practice several others too as separators in isolation are unlikely.   
    >   
    >> Any non-digit is a separator   
    >   
    > That prompted me to look at sjack's code again and found SPLIT could   
   be omitted:   
    >   
    >   : (number) ( a u -- ud a' u' )  0 0 2swap >number ;   
    >   
    >   : /int ( a u -- a' u' u2 )  (number) 2swap drop ;   
    >   
    >   : .t   cr . ." hr "  . ." min " . ." sec " ;   
    >   
    >   : /t ( a u -- sec min hr )   
    >     2>r  0 0 0  2r>  begin   
    >       /int  5 roll drop  -rot  dup while  1 /string   
    >     repeat 2drop  swap rot ;   
    >   
    >   
    > 1 hr 2 min 3 sec  ok   
    > 0 hr 2 min 3 sec  ok   
    > 0 hr 0 min 3 sec  ok   
    > 23 hr 59 min 59 sec  ok   
    > 0 hr 0 min 3 sec  ok   
    > 0 hr 0 min 0 sec  ok   
    > 0 hr 0 min 0 sec  ok   
    > 0 hr 0 min 53 sec  ok   
    > 11 hr 12 min 13 sec  ok   
    > 11 hr 0 min 13 sec  ok   
    > 0 hr 0 min 0 sec  ok   
    > 0 hr 3 min 0 sec  ok   
    > 1 hr 2 min 0 sec  ok   
    >   
   I have put the complication elsewhere. If we assume we're working in   
   decimal, you don't even need >NUMBER:   
      
   char 0 negate +constant 0-   
      
   : /int    ( a1 n1 -- a2 n2 n3)   
      0 >r 1 >r 1- chars over +   
      begin   
       over 1- over <   
      while   
        dup c@ is-digit   
      while   
        dup c@ 0- r> tuck * r> + >r 10 * >r 1-   
      repeat over - rdrop r> -rot   
      
      
   : /t /int /int /int 2drop ;   
      
   : .t . ." hr "  . ." min " . ." sec " cr ;   
      
   Notes for 4tH-isms:   
   - : 0- [char] 0 - ;   
   - : is-digit [char] 0 [char] 9 1+ within ;   
   - Add an additional THEN after REPEAT;   
   - RDROP, replace with R> DROP.   
      
   pp4th -x timesplit.4th   
   1 hr 2 min 3 sec   
   0 hr 2 min 3 sec   
   0 hr 0 min 3 sec   
   23 hr 59 min 59 sec   
   0 hr 0 min 3 sec   
   0 hr 0 min 0 sec   
   0 hr 0 min 0 sec   
   0 hr 0 min 53 sec   
   11 hr 12 min 13 sec   
   11 hr 0 min 13 sec   
   0 hr 0 min 0 sec   
   0 hr 3 min 0 sec   
   1 hr 2 min 0 sec   
      
   Hans Bezemer   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca