| Deutsch English Français Italiano |
|
<72c9670d5935524d42be0ef5c6c48338@www.novabbs.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder9.news.weretis.net!i2pn.org!i2pn2.org!.POSTED!not-for-mail From: amalawi@gmail.com (alaa) Newsgroups: comp.lang.forth Subject: Re: Parsing =?UTF-8?B?dGltZXN0YW1wcz8=?= Date: Wed, 9 Oct 2024 15:27:46 +0000 Organization: novaBBS Message-ID: <72c9670d5935524d42be0ef5c6c48338@www.novabbs.com> References: <1f433fabcb4d053d16cbc098dedc6c370608ac01@i2pn2.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Info: i2pn2.org; logging-data="1275383"; mail-complaints-to="usenet@i2pn2.org"; posting-account="CGY3L3DSIgT3XSLVxzkjfjJhqfxQsX86rIUmBfYnDco"; User-Agent: Rocksolid Light X-Rslight-Site: $2y$10$or.8VMA.KsgRMXaGEc6H9eQ4qdXmUhX5VyX/7gsFSDnejFDe8YPk2 X-Spam-Checker-Version: SpamAssassin 4.0.0 X-Rslight-Posting-User: bcbbdf547e63ec6cb50f26602e18585764a277ee Bytes: 2409 Lines: 37 Hi, here is another way, which was fun: \ https://www.novabbs.com/devel/article-flat.php?id=28040&group=comp.lang.forth#28040 VOCABULARY timestamps-parser ALSO timestamps-parser DEFINITIONS \ Idea: parse backward VARIABLE a VARIABLE n : >an n ! a ! ; : /an 0 a ! 0 n ! ; : ch ( -- c ) a @ n @ + 1- C@ ; : more? ( -- t/f ) n @ 0<> ; : ch+ ( -- ) more? NOT ABORT" exceeded string" -1 n +! ; : colon ( -- ) more? IF ch ':' <> ABORT" Expected colon!" ch+ THEN ; : d? ( c -- t/f ) '0' '9' 1+ WITHIN ; : digit? ( c -- t/f ) d? NOT ABORT" Expected a digit!" ; : d ( -- ) ch digit? ch 48 - ch+ ; : [d] ( -- n ) ch d? IF ch 48 - ch+ ELSE 0 THEN ; : hr ( -- n ) [d] [d] 10 * + ; : min ( -- n ) [d] [d] 10 * + ; : sec ( -- n ) d [d] 10 * + ; : parse ( a n -- s m h ) >an sec colon min colon hr /an ; : .hr ( n -- ) ?DUP IF . ." hr " THEN ; : .min ( n -- ) ?DUP IF . ." min " THEN ; : .sec ( n -- ) ?DUP IF . ." sec " THEN ; : .ts ( s m h -- ) .hr .min .sec ; \ Examples : e1 S" 1:2:3" ; CR e1 type e1 parse .s .ts : e2 S" 02:03" ; CR CR e2 type e2 parse .s .ts : e3 S" 03" ; CR CR e3 type e3 parse .s .ts : e4 S" 23:59:59" ; CR CR e4 type e4 parse .s .ts : e5 S" 0:00:03" ; CR CR e5 type e5 parse .s .ts : e6 S" " ; CR CR e6 type e6 parse .s .ts \ will fail since we expect at least one digit with 'd' word, we can use '[d]' for optional digit \ another stupid idea/hack to try: count ':', replace them with BL, Evaluate string, push missing fields as zeros