Path: ...!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Ruvim Newsgroups: comp.lang.forth Subject: Re: Parsing timestamps? Date: Sun, 6 Oct 2024 17:34:27 +0400 Organization: A noiseless patient Spider Lines: 83 Message-ID: References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> <923a7df6941efa78ef7d0629d183cd736f9eb2f5@i2pn2.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sun, 06 Oct 2024 15:34:28 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e46068a955d916fa6a0f28fb20080d2c"; logging-data="1213773"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19JYpupCB/XdroxreblLux6" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:1V1nGL3HvOKDXrZX36Jejj7EX2I= Content-Language: en-US In-Reply-To: Bytes: 3606 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? > > Maybe your `>int` works incorrectly with an empty string? > > > For testing I use: > >   : >int ( sd.number -- u ) 0. 2swap >number 2drop drop ; >   \ the empty string produces 0 Oh, I missed your definition for ">INT", because you use ">int" (sic lower case) in your definition for ".T" Then, it's unclear what fails on your side. -- Ruvim