aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-04-25 07:46:37 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-04-25 07:46:37 -0700
commit07ed770a33acef21ea523f4ac5ac2e8f3b510b4f (patch)
tree131b059bf1731c6a850b1e1d4c8ba56070140cc0
parent7253942c532942d8789d45451e5aa6998c30cb32 (diff)
downloadcppawk-07ed770a33acef21ea523f4ac5ac2e8f3b510b4f.tar.gz
cppawk-07ed770a33acef21ea523f4ac5ac2e8f3b510b4f.tar.bz2
cppawk-07ed770a33acef21ea523f4ac5ac2e8f3b510b4f.zip
New header: <array.h>
-rw-r--r--cppawk-include/array.h98
-rwxr-xr-xruntests5
-rw-r--r--testcases-array108
3 files changed, 211 insertions, 0 deletions
diff --git a/cppawk-include/array.h b/cppawk-include/array.h
new file mode 100644
index 0000000..f3b7a22
--- /dev/null
+++ b/cppawk-include/array.h
@@ -0,0 +1,98 @@
+// cppawk: C preprocessor wrapper around awk
+// Copyright 2022 Kaz Kylheku <kaz@kylheku.com>
+//
+// BSD-2 License
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef __CPPAWK_ARRAY_H
+#define __CPPAWK_ARRAY_H
+
+#ifndef __CPPAWK_BASE_H
+#include "base.h"
+#endif
+
+#ifndef __CPPAWK_ITER_PRIV_H
+#include "iter-priv.h"
+#endif
+
+#ifndef __CPPAWK_CONS_PRIV_H
+#include "cons-priv.h"
+#endif
+
+#if __have_indirect_functions
+#ifndef __CPPAWK_FUN_PRIV_H
+#include "fun-priv.h"
+#endif
+#endif
+
+function fields_to_array(__to_array,
+ __i, __val)
+{
+ delete __to_array
+
+ __to_array[0] = $0
+
+ __dofields (__i, __val)
+ __to_array[__i] = __val
+}
+
+function array_to_fields(__from_array,
+ __i, __val)
+{
+ for (__i = 0; ; __i++)
+ if (__i in __from_array)
+ $__i = __from_array[__i]
+ else
+ break
+}
+
+#if __have_indirect_functions
+
+function maparray(__fun, __from_array, __to_array)
+{
+ delete __to_array
+ __doarray (key, value, __from_array)
+ __to_array[key] = __call(__fun, value)
+}
+
+function group_by(__fun, __list, __to_array,
+ __item, __key)
+{
+ delete __to_array
+
+ __dolist (__item, __list) {
+ __key = __call(__fun, __item)
+ if (__key in __to_array)
+ __to_array[__key] = __list_add(__to_array[__key], __item)
+ else
+ __to_array[__key] = __list_add(__list_begin(), __item)
+ }
+
+ for (__key in __to_array)
+ __to_array[__key] = __list_end(__to_array[__key])
+}
+
+#endif
+
+#endif
diff --git a/runtests b/runtests
index 6216efc..339dcd2 100755
--- a/runtests
+++ b/runtests
@@ -36,3 +36,8 @@ if [ -z "$suite" -o "$suite" = "field" ] ; then
cppawk=./cppawk ./testsuite.awk testcases-field
cppawk="./cppawk --awk=mawk" ./testsuite.awk testcases-field
fi
+
+if [ -z "$suite" -o "$suite" = "array" ] ; then
+ cppawk=./cppawk ./testsuite.awk testcases-array
+ cppawk="./cppawk --awk=mawk" ./testsuite.awk -v skip=5,6 testcases-array
+fi
diff --git a/testcases-array b/testcases-array
new file mode 100644
index 0000000..1d28c50
--- /dev/null
+++ b/testcases-array
@@ -0,0 +1,108 @@
+1:
+$cppawk '
+#include <array.h>
+
+BEGIN {
+ $0 = "1 2 3 4"
+ fields_to_array(a)
+
+ for (i in a)
+ count++
+
+ print "count =", count
+
+ for (i = 1; i <= 4; i++)
+ printf "a[%s] = %s\n", i, a[i]
+
+ print "a[0] =", a[0]
+}'
+:
+count = 5
+a[1] = 1
+a[2] = 2
+a[3] = 3
+a[4] = 4
+a[0] = 1 2 3 4
+--
+2:
+$cppawk '
+#include <array.h>
+
+BEGIN {
+ fields_to_array(a)
+
+ count = 0
+ for (i in a)
+ count++
+
+ print "count =", count
+ print "a[0] =", a[0]
+}'
+:
+count = 1
+a[0] =
+--
+3:
+$cppawk '
+#include <array.h>
+BEGIN {
+ x = fun(cos)
+}
+:
+ERR
+--
+4:
+$cppawk '
+#include <array.h>
+
+BEGIN {
+ a[0] = "foo"
+ for (i = 1; i <= 10; i++)
+ a[i] = i
+ delete a[7]
+ array_to_fields(a)
+ print
+}'
+:
+1 2 3 4 5 6
+--
+5:
+$cppawk '
+#include <array.h>
+#include <cons.h>
+#include <fun.h>
+
+function even(x)
+{
+ return x % 2 == 0
+}
+
+BEGIN {
+ group_by(fun(even), iota(1, 10), a)
+ print sexp(a[0]);
+ print sexp(a[1]);
+}'
+:
+(1 3 5 7 9)
+(2 4 6 8 10)
+--
+6:
+$cppawk '
+#include <array.h>
+#include <cons.h>
+#include <fun.h>
+
+function even(x)
+{
+ return x % 2 == 0
+}
+
+BEGIN {
+ group_by(fun(even), iota(1, 10), a)
+ maparray(fun(reverse), a, b)
+ print sexp(b[0])
+ print sexp(b[1])
+}'
+:
+(9 7 5 3 1)
+(10 8 6 4 2)