aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/forth2012/string
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
commit67d25d837ac55f28a366c0a3b262e439a6e75fc3 (patch)
treedf7715c7724c5935ab87c807f3b8b4ef529315e3 /amforth-6.5/common/lib/forth2012/string
parente0d6784e89dba33226c0edb815bb974486fa7c48 (diff)
Add AmForth
Diffstat (limited to 'amforth-6.5/common/lib/forth2012/string')
-rw-r--r--amforth-6.5/common/lib/forth2012/string/search.frt23
-rw-r--r--amforth-6.5/common/lib/forth2012/string/split.frt15
-rw-r--r--amforth-6.5/common/lib/forth2012/string/trailing.frt10
3 files changed, 48 insertions, 0 deletions
diff --git a/amforth-6.5/common/lib/forth2012/string/search.frt b/amforth-6.5/common/lib/forth2012/string/search.frt
new file mode 100644
index 0000000..36c0339
--- /dev/null
+++ b/amforth-6.5/common/lib/forth2012/string/search.frt
@@ -0,0 +1,23 @@
+
+\ mostly from gforth. Minor modifications however..
+
+: str= ( c-addr1 u1 c-addr2 u2 -- f ) \ gforth
+ compare 0= ;
+
+: string-prefix? ( c-addr1 u1 c-addr2 u2 -- f ) \ gforth
+ \ Is c-addr2 u2 a prefix of c-addr1 u1 ?
+ tuck 2>r min 2r> str= ;
+
+: >= < 0= ;
+
+: search ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag ) \ string
+ 2>r 2dup
+ begin
+ dup r@ >= \ 2r@ nip >=
+ while
+ 2dup 2r@ string-prefix? if
+ 2swap 2drop 2r> 2drop true exit
+ then
+ 1 /string
+ repeat
+ 2drop 2r> 2drop 0 ;
diff --git a/amforth-6.5/common/lib/forth2012/string/split.frt b/amforth-6.5/common/lib/forth2012/string/split.frt
new file mode 100644
index 0000000..c627ed3
--- /dev/null
+++ b/amforth-6.5/common/lib/forth2012/string/split.frt
@@ -0,0 +1,15 @@
+\ Newsgroups: comp.lang.forth
+\ Date: Sat, 21 Jun 2014 13:48:57 -0700 (PDT)
+\ From: Julian Fondren <julian....@gmail.com>
+\ slightly modified for amforth (rdrop, false)
+
+\ split a string at the first occurance
+
+\ #require 2over.frt
+\ #require search.frt
+
+: split ( 'string' 'separator' -- 'before' 'after' -1 | 0 )
+ dup >r 2over 2swap search 0= if 2drop 2drop r> drop 0 exit then
+ 2>r r@ - 2r> r> /string true
+;
+
diff --git a/amforth-6.5/common/lib/forth2012/string/trailing.frt b/amforth-6.5/common/lib/forth2012/string/trailing.frt
new file mode 100644
index 0000000..51e709d
--- /dev/null
+++ b/amforth-6.5/common/lib/forth2012/string/trailing.frt
@@ -0,0 +1,10 @@
+
+
+: -trailing ( c_addr u1 -- c_addr u2 ) \ string dash-trailing
+\ Adjust the string specified by {c-addr, u1} to remove all
+\ trailing spaces. {u2} is the length of the modified string.
+ begin
+ dup
+ while
+ 1- 2dup + c@ bl <>
+ until 1+ then ;