-
Notifications
You must be signed in to change notification settings - Fork 0
/
split-string.clp
65 lines (59 loc) · 2.23 KB
/
split-string.clp
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
(deffunction split-string (?string $?options)
(bind ?max-split -1)
(bind ?max-substring -1)
(bind ?omit-blank TRUE)
(bind ?separator nil)
(bind ?separators (create$ " " (format nil "%c" 9) (format nil "%c" 10)))
(bind ?option-length (length$ ?options))
(bind ?i 1)
(while (<= ?i ?option-length)
(switch (nth$ ?i ?options)
(case -max-split
then (bind ?max-split (nth$ (+ ?i 1) ?options))
(bind ?i (+ ?i 2)))
(case -max-substring
then (bind ?max-substring (nth$ (+ ?i 1) ?options))
(bind ?i (+ ?i 2)))
(case -omit-blank
then (bind ?omit-blank (nth$ (+ ?i 1) ?options))
(bind ?i (+ ?i 2)))
(case -separator
then (bind ?separator (nth$ (+ ?i 1) ?options))
(bind ?i (+ ?i 2)))
(case -separators
then (bind ?separators (create$))
(while (eq STRING
(type (bind ?s (nth$ (bind ?i (+ ?i 1)) ?options))))
(bind ?separators ?separators ?s)))
(default
(UNNAMED::leave-message ERROR join-strings
"invalid option `%s'" (nth$ ?i ?options))
(return))))
(if (= ?max-substring 0)
then (return (create$)))
(if (= ?max-split 0)
then (return (create$ ?string)))
(if (eq nil ?separator)
then (bind ?i FALSE)
(foreach ?s ?separators
(if (and (bind ?j (str-index ?s ?string))
(or (not ?i) (< ?j ?i)))
then (bind ?i ?j)
(bind ?separator-length (str-length ?s))))
else (bind ?i (str-index ?separator ?string))
(bind ?separator-length (str-length ?separator)))
(if (not ?i)
then (create$ ?string)
else (bind ?rest
(split-string (sub-string (+ ?i ?separator-length)
(str-length ?string)
?string)
-max-split (- ?max-split 1)
-max-substring (- ?max-substring 1)
-omit-blank ?omit-blank
-separator ?separator
-separators ?separators))
(if (and ?omit-blank
(= ?i 1))
then ?rest
else (create$ (sub-string 1 (- ?i 1) ?string) ?rest))))