Deutsch   English   Français   Italiano  
<vdud3e$151ad$6@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Ruvim <ruvim.pinka@gmail.com>
Newsgroups: comp.lang.forth
Subject: Re: Parsing timestamps?
Date: Sun, 6 Oct 2024 20:15:42 +0400
Organization: A noiseless patient Spider
Lines: 89
Message-ID: <vdud3e$151ad$6@dont-email.me>
References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org>
 <vdtptd$151ad$1@dont-email.me>
 <923a7df6941efa78ef7d0629d183cd736f9eb2f5@i2pn2.org>
 <vdu2vc$151ad$3@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sun, 06 Oct 2024 18:15:43 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="e46068a955d916fa6a0f28fb20080d2c";
	logging-data="1213773"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/DeSWDV83AjKmu06UsVug0"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:mVQ4dr42qzps2NxdgkSn9PuZLS4=
Content-Language: en-US
In-Reply-To: <vdu2vc$151ad$3@dont-email.me>
Bytes: 3801

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