Path: ...!weretis.net!feeder9.news.weretis.net!i2pn.org!i2pn2.org!.POSTED!not-for-mail From: dxf Newsgroups: comp.lang.forth Subject: Reverse SCAN SPLIT Date: Mon, 7 Oct 2024 19:52:15 +1100 Organization: i2pn2 (i2pn.org) Message-ID: <5c65a8f1fdfc3e9937a825842fe23dc2758f48ef@i2pn2.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Injection-Date: Mon, 7 Oct 2024 08:52:20 -0000 (UTC) Injection-Info: i2pn2.org; logging-data="937806"; mail-complaints-to="usenet@i2pn2.org"; posting-account="XPw7UV90Iy7EOhY4YuUXhpdoEf5Vz7K+BsxA/Cx8bVc"; User-Agent: Mozilla Thunderbird X-Spam-Checker-Version: SpamAssassin 4.0.0 Content-Language: en-GB Bytes: 1532 Lines: 30 Earlier I mentioned scanning in reverse. Here's an implementation. [undefined] dxforth [if] : \CHAR ( a u -- a2 u2 c ) 1- 2dup + c@ ; [then] \ As for SCAN but scan from end : SCAN< ( a u c -- a2 u2 | a 0 ) >r over swap begin dup while \char r@ = until 1+ then rot drop rdrop ; \ As for SPLIT but scan from end. Latter string is topmost. : SPLIT< ( a u c -- a2 u2 a3 u3 ) >r 2dup r> scan< 2swap 2 pick /string ; \ example : /T ( a u -- hour min sec ) 3 0 do [char] : split< 0 0 2swap >number 2drop drop -rot ( u ... a u) dup if 1- then loop 2drop swap rot ; : T /t cr rot . ." hr " swap . ." min " . ." sec " ; s" 1:2:3" t s" 02:03" t s" 06:" t s" 03" t s" 23:59:59" t s" 0:00:03" t