Path: ...!news.misty.com!weretis.net!feeder9.news.weretis.net!i2pn.org!i2pn2.org!.POSTED!not-for-mail From: dxf Newsgroups: comp.lang.forth Subject: Re: Parsing timestamps? Date: Sat, 19 Oct 2024 12:29:18 +1100 Organization: i2pn2 (i2pn.org) Message-ID: References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Sat, 19 Oct 2024 01:29:22 -0000 (UTC) Injection-Info: i2pn2.org; logging-data="2670680"; mail-complaints-to="usenet@i2pn2.org"; posting-account="XPw7UV90Iy7EOhY4YuUXhpdoEf5Vz7K+BsxA/Cx8bVc"; User-Agent: Mozilla Thunderbird Content-Language: en-GB X-Spam-Checker-Version: SpamAssassin 4.0.0 In-Reply-To: Bytes: 3596 Lines: 99 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