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,850 of 117,927   
   Ruvim to Ruvim   
   Re: Parsing timestamps?   
   06 Oct 24 20:15:42   
   
   From: ruvim.pinka@gmail.com   
      
   On 2024-10-06 17:22, Ruvim wrote:   
   > On 2024-10-06 15:59, dxf wrote:   
   >> On 6/10/2024 9:48 pm, Ruvim wrote:   
   >>> On 2024-10-06 11: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   
   >>>   
   >>>   
   >>> I would use `split-string` factor as:   
   >>>   
   >>>    : /t ( sd.time -- sd.hour sd.min sd.sec )   
   >>>      s" :" split-string   
   >>>      s" :" split-string   
   >>>    ;   
   >>>   
   >>>    \ Where   
   >>>   
   >>>    : split-string   
   >>>      ( sd.text sd.separator -- sd.left sd.right | sd.text 0 0 )   
   >>>      dup >r  3 pick >r  ( R: u.[sd.separator][1] addr.[st.text][2] )   
   >>>      search 0= if 2rdrop 0 0 exit then ( addr u )   
   >>>      over r@ - r> swap  2swap r> /string   
   >>>    ;   
   >>   
   >> It fails with s" 03".  The test case may be unreasonable so I tried   
   >> s" :03"  however it also fails.  The complication is most tools scan   
   >> from the beginning whereas we would like to scan from the end.   
   >   
   >   
   > You did not provide output for test cases.   
   >   
   > I expect that "03" is equivalent to "03:00:00", which means 3 hours, 0   
   > minutes, 0 seconds.   
   > And ":03" is equivalent to "00:03:00", which means 0 hours, 3 minutes, 0   
   > seconds.   
   >   
   > My above implementation for `/t` produces:   
   >   
   >    s" 1:2:3"   /t .t   \ "1 hr 2 min 3 sec"   
   >    s" 02:03"   /t .t   \ "2 hr 3 min 0 sec"   
   >    s" 03"      /t .t   \ "3 hr 0 min 0 sec"   
   >    s" :03"     /t .t   \ "0 hr 3 min 0 sec"   
   >   
   >   
   > What is wrong?   
      
   Well, I see what you meant.   
      
      : /t ( sd.time -- sd.hour sd.min sd.sec )   
        s" :" split-string  dup 0= if 2swap 0. 2swap exit then   
        s" :" split-string  dup 0= if 2rot 2rot then   
      ;   
      
      s" 02:03"   /t .t   \ "0 hr 2 min 3 sec"   
      s" 03"      /t .t   \ "0 hr 0 min 3 sec"   
      s" :03"     /t .t   \ "0 hr 0 min 3 sec"   
      
      
      
   Probably, a better interface would be:   
      
      : parse-time ( sd.time -- u.sec u.min u.hour )   
        s" :" split-string-last  parse-uint -rot   
        s" :" split-string-last  parse-uint -rot   
                                 parse-uint   
      ;   
      
      
   --   
   Ruvim   
      
   --- 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