Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.forth Subject: Re: Parsing timestamps? Date: Wed, 11 Jun 2025 09:25:50 -0000 (UTC) Organization: A noiseless patient Spider Lines: 93 Message-ID: <102bi2q$1t4tk$1@dont-email.me> References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> <7e21117d37c506cccd8e79323c416fd1@www.novabbs.com> <1021bsd$31o0d$1@dont-email.me> <1028t95$15jgs$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Injection-Date: Wed, 11 Jun 2025 11:25:51 +0200 (CEST) Injection-Info: dont-email.me; posting-host="a65681a0684c26d2549e7084c784e693"; logging-data="2003892"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/+5D/tx2xUatwnwaNEuCS5" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:/Jbg0SxZHJIQUPoPaHiTDPuJlBo= B. Pym wrote: > B. Pym wrote: > > > 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. > > > > > > -marcel > > > > : CHAR-NUMERIC? 48 58 WITHIN ; > > : SKIP-NON-NUMERIC ( adr u -- adr2 u2) > > BEGIN > > DUP IF OVER C@ CHAR-NUMERIC? NOT ELSE 0 THEN > > WHILE > > 1 /STRING > > REPEAT ; > > > > : SCAN-NEXT-NUMBER ( n adr len -- n2 adr2 len2) > > 2>R 60 * 0. 2R> >NUMBER > > 2>R D>S + 2R> ; > > > > : PARSE-TIME ( adr len -- seconds) > > 0 -ROT > > BEGIN > > SKIP-NON-NUMERIC > > DUP > > WHILE > > SCAN-NEXT-NUMBER > > REPEAT > > 2DROP ; > > > > S" hello 1::36 world" PARSE-TIME CR . > > 96 ok > > > > : SCAN-NUMBER-OR-SKIP ( n adr len -- n' adr' len') > DUP >R > 0 0 2SWAP >NUMBER > DUP R> = > IF 2SWAP 2DROP 1 /STRING > ELSE > 2>R D>S SWAP 60 * + 2R> > THEN ; > > : PARSE-TIME ( adr len -- seconds) > 0 -ROT > BEGIN > DUP > WHILE > SCAN-NUMBER-OR-SKIP > REPEAT > 2DROP ; > > S" hi 5 or 1 is 44 ho " PARSE-TIME CR . > 18104 > Using local variables. : SCAN-NUMBER-OR-SKIP { n adr len -- n' adr' len' } 0. adr len >NUMBER { adr' len' } D>S { m } len' len = IF n adr len 1 /STRING ELSE n 60 * m + adr' len' THEN ;