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