File: split.fs

package info (click to toggle)
openbios-sparc 1.0%2Bsvn640-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 4,412 kB
  • ctags: 12,091
  • sloc: ansic: 57,249; asm: 2,680; xml: 1,335; cpp: 414; makefile: 224; sh: 190
file content (49 lines) | stat: -rw-r--r-- 1,076 bytes parent folder | download | duplicates (16)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
\ implements split-before, split-after and left-split 
\ as described in 4.3 (Path resolution)

\ delimeter returned in R-string
: split-before ( addr len delim -- addr-R len-R addr-L len-L ) 
  0 rot dup >r 0 ?do
    ( str char cnt R: len <sys> )
    2 pick over + c@ 2 pick = if leave then
    1+
  loop
  nip
  2dup + r> 2 pick -
  2swap
;

\ delimeter returned in L-string
: split-after ( addr len delim -- addr-R len-R addr-L len-L ) 
  over 1- rot dup >r 0 ?do
    ( str char cnt R: len <sys> )
    2 pick over + c@ 2 pick = if leave then
    1-
	loop
  nip
	dup 0 >= if 1+ else drop r@ then
	2dup + r> 2 pick -
  2swap
;

\ delimiter not returned
: left-split ( addr len delim -- addr-R len-R addr-L len-L )
  0 rot dup >r 0 ?do
    ( str char cnt R: len <sys> )
    2 pick i + c@ 2 pick = if leave then
    1+
  loop
  nip
  2dup + 1+ r> 2 pick -
  dup if 1- then
  2swap
;

\ delimiter not returned [THIS FUNCTION IS NOT NEEDED]
: right-split ( addr len delim -- addr-R len-R addr-L len-L )
	dup >r
	split-after
	dup if 2dup + 1-
		c@ r@ = if 1- then then
	r> drop
;