aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppawk-include/iter.h14
-rw-r--r--testcases-iter36
2 files changed, 50 insertions, 0 deletions
diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h
index 77163de..9e48c7e 100644
--- a/cppawk-include/iter.h
+++ b/cppawk-include/iter.h
@@ -129,6 +129,14 @@
#define __fini_from_step(idx, from, step) 1
#define __step_from_step(idx, from, step) idx += (step)
+#define __init_first_then(var, first, then) (var = (first))
+#define __test_first_then(var, first, then) 1
+#define __prep_first_then(var, first, then) 1
+#define __fini_first_then(var, first, then) 1
+#define __step_first_then(var, first, then) (var = (then))
+
+#define for_var(var, expr) first_then(var, expr, expr)
+
#define __init_list(iter, var, list) iter = (list)
#define __test_list(iter, var, list) !endp(iter)
#define __prep_list(iter, var, list) var = car(iter)
@@ -153,6 +161,12 @@
#define __fini_collect(var, expr) var = list_end(var)
#define __step_collect(var, expr) 1
+#define __init_collect_plus(var, expr) var = list_begin()
+#define __test_collect_plus(var, expr) 1
+#define __prep_collect_plus(var, expr) var = list_add(var, expr)
+#define __fini_collect_plus(var, expr) var = list_end(list_add(var, expr))
+#define __step_collect_plus(var, expr) 1
+
#define __init_summing(var, expr) var = 0
#define __test_summing(var, expr) 1
#define __prep_summing(var, expr) var += (expr)
diff --git a/testcases-iter b/testcases-iter
index b9b7d22..629420e 100644
--- a/testcases-iter
+++ b/testcases-iter
@@ -332,3 +332,39 @@ BEGIN {
}'
:
min = -3
+--
+16:
+$cppawk '
+#include <iter.h>
+
+
+function index_from(str, ch, start,
+ sstr, pos)
+{
+ sstr = substr(str, start)
+ pos = index(sstr, ch)
+ return pos ? pos + start - 1 : 0
+}
+
+function sscl(string, char)
+{
+ loop (first_then (start, 1, end + 1),
+ for_var (end, index_from(string, char, start)),
+ collect_plus (out, end ? substr(string, start, end - start)
+ : substr(string, start)),
+ while (end))
+ { }
+ return out
+}
+
+BEGIN {
+ print sexp(sscl(",", ","))
+ print sexp(sscl("a,", ","))
+ print sexp(sscl(",a", ","))
+ print sexp(sscl("a,b,c", ","))
+}'
+:
+(nil nil)
+("a" nil)
+(nil "a")
+("a" "b" "c")