Deutsch   English   Français   Italiano  
<102bi2q$1t4tk$1@dont-email.me>

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

Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
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 ;