aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-03-29 00:03:37 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-03-29 00:03:37 -0700
commit206a772af57912cc510796bfc3611ad8e2f77777 (patch)
tree8d771086c9a48e364f783b3025090d07b3c4ed8a
parent5f011784b51309ca25e1c732564f1072399dc5d0 (diff)
downloadcppawk-206a772af57912cc510796bfc3611ad8e2f77777.tar.gz
cppawk-206a772af57912cc510796bfc3611ad8e2f77777.tar.bz2
cppawk-206a772af57912cc510796bfc3611ad8e2f77777.zip
New public header <narg.h>.
-rw-r--r--cppawk-include/narg.h39
-rwxr-xr-xruntests4
-rw-r--r--testcases-narg43
3 files changed, 86 insertions, 0 deletions
diff --git a/cppawk-include/narg.h b/cppawk-include/narg.h
new file mode 100644
index 0000000..ce38b37
--- /dev/null
+++ b/cppawk-include/narg.h
@@ -0,0 +1,39 @@
+// cppawk: C preprocessor wrapper around awk
+// 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_NARG_H
+#define CPPAWK_NARG_H
+
+#ifndef __CPPAWK_NARG_PRIV_H
+#include "narg-priv.h"
+#endif
+
+#define narg(...) __narg(__VA_ARGS__)
+#define varexpand(mac1, mac2, ...) __varexpand(mac1, mac2, __VA_ARGS__)
+#define revarg(...) __revarg(__VA_ARGS__)
+
+#endif
diff --git a/runtests b/runtests
index 3396b07..fd7bef4 100755
--- a/runtests
+++ b/runtests
@@ -1,6 +1,10 @@
#!/bin/sh
trap 'rm -f output script.sh' EXIT INT TERM
+
cppawk=./cppawk ./testsuite.awk testcases
cppawk="./cppawk --nobash" ./testsuite.awk testcases
+
cppawk=./cppawk ./testsuite.awk testcases-case
cppawk="./cppawk --awk=mawk" ./testsuite.awk testcases-case
+
+cppawk=./cppawk ./testsuite.awk testcases-narg
diff --git a/testcases-narg b/testcases-narg
new file mode 100644
index 0000000..c275e42
--- /dev/null
+++ b/testcases-narg
@@ -0,0 +1,43 @@
+1:
+$cppawk '
+#include <narg.h>
+BEGIN { print narg(x), narg(x, y), narg(x, y, z), narg(x, y, z, w) }'
+:
+1 2 3 4
+--
+2:
+$cppawk '
+#include <narg.h>
+BEGIN { print narg(a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a) }'
+:
+32
+--
+3:
+$cppawk '
+#include <narg.h>
+BEGIN { print narg(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) }'
+:
+ERR
+--
+4:
+$cppawk '
+#include <narg.h>
+#define first(x) x
+#define rest(prev, x) prev : x
+#define colonize(...) [varexpand(first, rest, __VA_ARGS__)]
+#define str(x) #x
+#define xstr(x) str(x)
+#define scolonize(...) xstr(colonize(__VA_ARGS__))
+BEGIN { print scolonize(1), scolonize(1,2), scolonize(1, 2, 3) }'
+:
+[1] [1 : 2] [1 : 2 : 3]
+--
+5:
+$cppawk '
+#include <narg.h>
+#define str(x) #x
+#define xstr(x) str(x)
+#define srev(...) xstr((revarg(__VA_ARGS__)))
+BEGIN { print srev(1), srev(1,2), srev(1, 2, 3) }'
+:
+(1) (2, 1) (3, 2, 1)