Path: ...!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: Mon, 7 Oct 2024 02:34:19 +1100 Organization: i2pn2 (i2pn.org) Message-ID: <3f677402affc744ccafcb2cbcc5a664c26b98ba2@i2pn2.org> References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> <7e21117d37c506cccd8e79323c416fd1@www.novabbs.com> <306ac44092ac6cd60b0d98b34d5b323b48996f58@i2pn2.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Sun, 6 Oct 2024 15:34:20 -0000 (UTC) Injection-Info: i2pn2.org; logging-data="837165"; mail-complaints-to="usenet@i2pn2.org"; posting-account="XPw7UV90Iy7EOhY4YuUXhpdoEf5Vz7K+BsxA/Cx8bVc"; User-Agent: Mozilla Thunderbird In-Reply-To: <306ac44092ac6cd60b0d98b34d5b323b48996f58@i2pn2.org> X-Spam-Checker-Version: SpamAssassin 4.0.0 Content-Language: en-GB Bytes: 2809 Lines: 66 On 6/10/2024 11:58 pm, dxf wrote: > On 6/10/2024 7:59 pm, mhx wrote: >> On Sun, 6 Oct 2024 7:51:31 +0000, 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 >> >> Why don't you use the fact that >NUMBER returns the given >> string starting with the first unconverted character? >> SPLIT should be redundant. > > Good idea! > > : /T ( a u -- hour min sec ) > 3 0 do > 0 0 2swap >number rot drop ( u ... a u) > dup if over c@ [char] : = 1 and /string then > loop 2drop > 2 0 do dup 0= if rot rot then loop ; > > : .T cr . ." sec " . ." min " . ." hr " ; > > 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 Bug fix: variable cnt : @SEC ( a u -- ud ) \ HH:MM:SS or free-form 0 cnt ! 3 0 do 0 0 2swap >number rot drop ( u ... a u) dup if 1 /string 1 cnt +! then loop 2drop cnt @ 1+ 0 do rot loop ( fixup) ; \ swap secs/min * + swap secs/hour um* rot 0 d+ ; : .3 ( h m s -- ) cr rot . swap . . ; s" 00:00:06" @sec .3 s" 00:06:00" @sec .3 s" 06:00:00" @sec .3 cr s" 06" @sec .3 s" 06:00" @sec .3 s" 06:00:00" @sec .3