From da98d5314731206cd03038d589d10c5c32a0ce8c Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 2 Jul 2022 16:59:45 -0700 Subject: Restructure cppawk installation. cppawk now expects to be installed in some directory (typically "bin"), such that the include files are in a "share/cppawk/include" directory where "share" is a sibling of "bin". The git repository is restructured to match this shape; cppawk is moved into "bin", and the include files into "share/cppawk/include". --- INSTALL | 25 +- bin/cppawk | 224 ++++++++++ cppawk | 223 ---------- cppawk-include/array.h | 98 ----- cppawk-include/base.h | 60 --- cppawk-include/case-priv.h | 93 ---- cppawk-include/case.h | 46 -- cppawk-include/cons-priv.h | 906 --------------------------------------- cppawk-include/cons.h | 92 ---- cppawk-include/field.h | 88 ---- cppawk-include/fun-priv.h | 50 --- cppawk-include/fun.h | 39 -- cppawk-include/iter-priv.h | 45 -- cppawk-include/iter.h | 329 -------------- cppawk-include/narg-priv.h | 367 ---------------- cppawk-include/narg.h | 44 -- cppawk-include/varg-priv.h | 392 ----------------- cppawk-include/varg.h | 46 -- runtests | 30 +- share/cppawk/include/array.h | 98 +++++ share/cppawk/include/base.h | 60 +++ share/cppawk/include/case-priv.h | 93 ++++ share/cppawk/include/case.h | 46 ++ share/cppawk/include/cons-priv.h | 906 +++++++++++++++++++++++++++++++++++++++ share/cppawk/include/cons.h | 92 ++++ share/cppawk/include/field.h | 88 ++++ share/cppawk/include/fun-priv.h | 50 +++ share/cppawk/include/fun.h | 39 ++ share/cppawk/include/iter-priv.h | 45 ++ share/cppawk/include/iter.h | 329 ++++++++++++++ share/cppawk/include/narg-priv.h | 367 ++++++++++++++++ share/cppawk/include/narg.h | 44 ++ share/cppawk/include/varg-priv.h | 392 +++++++++++++++++ share/cppawk/include/varg.h | 46 ++ 34 files changed, 2951 insertions(+), 2941 deletions(-) create mode 100755 bin/cppawk delete mode 100755 cppawk delete mode 100644 cppawk-include/array.h delete mode 100644 cppawk-include/base.h delete mode 100644 cppawk-include/case-priv.h delete mode 100644 cppawk-include/case.h delete mode 100644 cppawk-include/cons-priv.h delete mode 100644 cppawk-include/cons.h delete mode 100644 cppawk-include/field.h delete mode 100644 cppawk-include/fun-priv.h delete mode 100644 cppawk-include/fun.h delete mode 100644 cppawk-include/iter-priv.h delete mode 100644 cppawk-include/iter.h delete mode 100644 cppawk-include/narg-priv.h delete mode 100644 cppawk-include/narg.h delete mode 100644 cppawk-include/varg-priv.h delete mode 100644 cppawk-include/varg.h create mode 100644 share/cppawk/include/array.h create mode 100644 share/cppawk/include/base.h create mode 100644 share/cppawk/include/case-priv.h create mode 100644 share/cppawk/include/case.h create mode 100644 share/cppawk/include/cons-priv.h create mode 100644 share/cppawk/include/cons.h create mode 100644 share/cppawk/include/field.h create mode 100644 share/cppawk/include/fun-priv.h create mode 100644 share/cppawk/include/fun.h create mode 100644 share/cppawk/include/iter-priv.h create mode 100644 share/cppawk/include/iter.h create mode 100644 share/cppawk/include/narg-priv.h create mode 100644 share/cppawk/include/narg.h create mode 100644 share/cppawk/include/varg-priv.h create mode 100644 share/cppawk/include/varg.h diff --git a/INSTALL b/INSTALL index fa6bd43..6d10143 100644 --- a/INSTALL +++ b/INSTALL @@ -1,14 +1,23 @@ Installing cppawk ----------------- -A cppawk installation consists of the cppawk script accompanied by -the cppawk-include directory containing the cppawk headers. -This directory is placed in the same directory as cppawk, side by side. +A cppawk installation consists of the cppawk script accompanied by the +an include directory containing the cppawk headers. -For instance, /usr/local/bin/cppawk and /usr/local/bin/cppawk-include/. +cppawk determines the directory in which it is located, calling that +directory selfdir. Then it instructs the preprocessor to look for +headers in $selfdir/../share/cppawk/include. For instance, if cppawk is +installed as /usr/local/bin/cppawk, it expects its header library to be +in the /usr/local/share/cppawk/include directory. + +Steps to install cppawk as /path/to/installation/cppawk/bin might be: # root=/path/to/installation -# install -d ${root} -# install cppawk ${root} -# cp -r cppawk-include ${root} -# chmod -R a+rX,go-w ${root} +# install -d ${root}/bin +# install -d ${root}/share/cppawk/include +# install cppawk ${root}/bin +# install share/cppawk/include/*.h ${root}/share/cppawk/include + +Historic note: originally, cppawk expected the include direcgtory +to be called cppawk-include, and to be located in the same directory +as itself. diff --git a/bin/cppawk b/bin/cppawk new file mode 100755 index 0000000..e5c95dc --- /dev/null +++ b/bin/cppawk @@ -0,0 +1,224 @@ +#!/bin/sh + +# cppawk: C preprocessor wrapper around awk +# Copyright 2022 Kaz Kylheku +# +# 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. + +# site configuration +prepro=cpp +incopt=-iquote # GNU extension: must be changed to -I for traditional cpp +dumpopt=-dM # GNU cpp option to dump macros +stdopt=-std=c99 # GNU cpp option for standard conformance +awk=gawk +prepro_opts="-D__gawk__=1 -D__cppawk_ver=20220419 $stdopt" + +# globals +bash=${BASH_VERSION+y} +# if this isn't bash, and there is a /bin/bash, let's re-execute ourselves +# with Bash, so we can use process substitution instead of temp files. +if ! [ $bash ] && [ -x /bin/bash ] ; then + exec /bin/bash "$0" "$@" +fi +awk_file= +awk_opts= +tmp_file= +prepro_only= + +selfdir="$(dirname "$0")" + +# functions + +# convert argument into quoted shell syntax +quote() +{ + case $1 in + *"'"* ) + case $1 in + *[\"\$\\]* ) + printf "'%s'" "$(printf "%s" "$1" | sed -e "s/'/'\\\\''/g")" + ;; + * ) + printf '"%s"' "$1" + ;; + esac + ;; + * ) + printf "'%s'" "$1" + ;; + esac +} + +die() +{ + fmt="$0: $1\n" ; shift + printf "$fmt" "$@" + exit 1 +} + +delhashbang_setline() +{ + sed -e "1s/^#!.*/#/" -e "1i#line 1 \"$1\"" "$1" +} + +delhashbang() +{ + sed -e "1s/^#!.*/#/" +} + +# Eliminate tracer lines in cpp output which continue a previous line, and +# merge the continued lines into one. Awk needs this because spurious newlines +# break its syntax. +collapse() +{ + awk ' + $1 == "#" { if ($2 != curline || $3 != curfile) + { print + if (have_line) + { printf("%s\n", line); + line = "" + have_line = 0 } } + startline = $2 + curline = startline - 1 + curfile = $3; + next } + 1 { if (++curline > startline) + { if (have_line) + { printf("%s\n", line) + line = "" } } + else + { sub(/^[ \t]+/, "") } + line = line $0 + have_line = 1 } + END { if (have_line) + printf("%s\n", line); }' +} + +prepro_opts="$prepro_opts -I$selfdir/../share/cppawk/include" + +while [ $# -gt 0 ] ; do + case $1 in + -M?* ) + die "-M family of cpp options not supported" + ;; + --prepro-only ) + prepro_only=y + ;; + --prepro=* ) + prepro=${1#*=} + ;; + --awk=* ) + awk=${1#*=} + case $awk in + gawk | mawk | */gawk | */mawk ) + prepro_opts="$prepro_opts -U__gawk__ -D__$(basename "$awk")__=1" + ;; + egawk | */egawk ) + prepro_opts="$prepro_opts -D__egawk__=1" + ;; + esac + ;; + --nobash ) + bash= + ;; + --dump-macros ) + prepro_opts="$prepro_opts $dumpopt" + prepro_only=y + ;; + -U* | -D* | -I* | -iquote* ) + prepro_opts="$prepro_opts $(quote "$1")" + ;; + -f ) + [ $# -gt 1 ] || die "-f requires argument" + [ -z "$awk_file" ] || die "-f can be only given once" + awk_file=$2 + shift + ;; + -F | -v | -E | -i | -l | -L ) + [ $# -gt 1 ] || die "%s requires argument" $1 + awk_opts="$awk_opts $1 $(quote "$2")" + shift + ;; + -- ) + break + ;; + -M | --bignum ) + awk_opts="$awk_opts $1" + prepro_opts="$prepro_opts -D__bignum__=1" + ;; + -P | --posix ) + awk_opts="$awk_opts $1" + prepro_opts="$prepro_opts -D__posix__=1" + ;; + -* ) + awk_opts="$awk_opts $(quote "$1")" + ;; + * ) + break + ;; + esac + shift +done + +awk="command $(quote "$awk")" +prepro="command $(quote "$prepro")" + +if [ -n "$awk_file" ] ; then + awk_file_dir=$(dirname "$awk_file") + if [ $prepro_only ] ; then + delhashbang_setline "$awk_file" \ + | eval "$prepro $incopt\"$awk_file_dir\" $prepro_opts - | collapse" + elif [ $bash ] ; then + prep='delhashbang_setline "$awk_file" \ + | eval "$prepro $incopt\"$awk_file_dir\" $prepro_opts - | collapse"' + eval "$awk $awk_opts -f <($prep) -- \"\$@\"" + else + trap 'rm -f $tmp_file' EXIT INT TERM + tmp_file=$(mktemp) + delhashbang_setline "$awk_file" \ + | eval "$prepro $incopt\"$awk_file_dir\" $prepro_opts - | collapse" \ + > $tmp_file + eval "$awk $awk_opts -f $tmp_file -- \"\$@\"" + fi +elif [ $# -gt 0 ] ; then + if [ $prepro_only ] ; then + printf "%s" "$1" | delhashbang \ + | eval "$prepro $incopt"$(pwd)" $prepro_opts - | collapse" + elif [ $bash ] ; then + code=$1; shift + prep='printf "%s" "$code" | delhashbang \ + | eval "$prepro $incopt"$(pwd)" $prepro_opts - | collapse"' + eval "$awk $awk_opts -f <($prep) -- \"\$@\"" + else + trap 'rm -f $tmp_file' EXIT INT TERM + tmp_file=$(mktemp) + printf "%s" "$1" | delhashbang \ + | eval "$prepro $incopt"$(pwd)" $prepro_opts - | collapse" > $tmp_file + shift + eval "$awk $awk_opts -f $tmp_file -- \"\$@\"" + fi +else + die "awk code must be specified" +fi diff --git a/cppawk b/cppawk deleted file mode 100755 index b965dad..0000000 --- a/cppawk +++ /dev/null @@ -1,223 +0,0 @@ -#!/bin/sh - -# cppawk: C preprocessor wrapper around awk -# Copyright 2022 Kaz Kylheku -# -# 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. - -# site configuration -prepro=cpp -incopt=-iquote # GNU extension: must be changed to -I for traditional cpp -dumpopt=-dM # GNU cpp option to dump macros -stdopt=-std=c99 # GNU cpp option for standard conformance -awk=gawk -prepro_opts="-D__gawk__=1 -D__cppawk_ver=20220419 $stdopt" - -# globals -bash=${BASH_VERSION+y} -# if this isn't bash, and there is a /bin/bash, let's re-execute ourselves -# with Bash, so we can use process substitution instead of temp files. -if ! [ $bash ] && [ -x /bin/bash ] ; then - exec /bin/bash "$0" "$@" -fi -awk_file= -awk_opts= -tmp_file= -prepro_only= -selfdir=$(dirname "$0") - -# functions - -# convert argument into quoted shell syntax -quote() -{ - case $1 in - *"'"* ) - case $1 in - *[\"\$\\]* ) - printf "'%s'" "$(printf "%s" "$1" | sed -e "s/'/'\\\\''/g")" - ;; - * ) - printf '"%s"' "$1" - ;; - esac - ;; - * ) - printf "'%s'" "$1" - ;; - esac -} - -die() -{ - fmt="$0: $1\n" ; shift - printf "$fmt" "$@" - exit 1 -} - -delhashbang_setline() -{ - sed -e "1s/^#!.*/#/" -e "1i#line 1 \"$1\"" "$1" -} - -delhashbang() -{ - sed -e "1s/^#!.*/#/" -} - -# Eliminate tracer lines in cpp output which continue a previous line, and -# merge the continued lines into one. Awk needs this because spurious newlines -# break its syntax. -collapse() -{ - awk ' - $1 == "#" { if ($2 != curline || $3 != curfile) - { print - if (have_line) - { printf("%s\n", line); - line = "" - have_line = 0 } } - startline = $2 - curline = startline - 1 - curfile = $3; - next } - 1 { if (++curline > startline) - { if (have_line) - { printf("%s\n", line) - line = "" } } - else - { sub(/^[ \t]+/, "") } - line = line $0 - have_line = 1 } - END { if (have_line) - printf("%s\n", line); }' -} - -prepro_opts="$prepro_opts -I$selfdir/cppawk-include" - -while [ $# -gt 0 ] ; do - case $1 in - -M?* ) - die "-M family of cpp options not supported" - ;; - --prepro-only ) - prepro_only=y - ;; - --prepro=* ) - prepro=${1#*=} - ;; - --awk=* ) - awk=${1#*=} - case $awk in - gawk | mawk | */gawk | */mawk ) - prepro_opts="$prepro_opts -U__gawk__ -D__$(basename "$awk")__=1" - ;; - egawk | */egawk ) - prepro_opts="$prepro_opts -D__egawk__=1" - ;; - esac - ;; - --nobash ) - bash= - ;; - --dump-macros ) - prepro_opts="$prepro_opts $dumpopt" - prepro_only=y - ;; - -U* | -D* | -I* | -iquote* ) - prepro_opts="$prepro_opts $(quote "$1")" - ;; - -f ) - [ $# -gt 1 ] || die "-f requires argument" - [ -z "$awk_file" ] || die "-f can be only given once" - awk_file=$2 - shift - ;; - -F | -v | -E | -i | -l | -L ) - [ $# -gt 1 ] || die "%s requires argument" $1 - awk_opts="$awk_opts $1 $(quote "$2")" - shift - ;; - -- ) - break - ;; - -M | --bignum ) - awk_opts="$awk_opts $1" - prepro_opts="$prepro_opts -D__bignum__=1" - ;; - -P | --posix ) - awk_opts="$awk_opts $1" - prepro_opts="$prepro_opts -D__posix__=1" - ;; - -* ) - awk_opts="$awk_opts $(quote "$1")" - ;; - * ) - break - ;; - esac - shift -done - -awk="command $(quote "$awk")" -prepro="command $(quote "$prepro")" - -if [ -n "$awk_file" ] ; then - awk_file_dir=$(dirname "$awk_file") - if [ $prepro_only ] ; then - delhashbang_setline "$awk_file" \ - | eval "$prepro $incopt\"$awk_file_dir\" $prepro_opts - | collapse" - elif [ $bash ] ; then - prep='delhashbang_setline "$awk_file" \ - | eval "$prepro $incopt\"$awk_file_dir\" $prepro_opts - | collapse"' - eval "$awk $awk_opts -f <($prep) -- \"\$@\"" - else - trap 'rm -f $tmp_file' EXIT INT TERM - tmp_file=$(mktemp) - delhashbang_setline "$awk_file" \ - | eval "$prepro $incopt\"$awk_file_dir\" $prepro_opts - | collapse" \ - > $tmp_file - eval "$awk $awk_opts -f $tmp_file -- \"\$@\"" - fi -elif [ $# -gt 0 ] ; then - if [ $prepro_only ] ; then - printf "%s" "$1" | delhashbang \ - | eval "$prepro $incopt"$(pwd)" $prepro_opts - | collapse" - elif [ $bash ] ; then - code=$1; shift - prep='printf "%s" "$code" | delhashbang \ - | eval "$prepro $incopt"$(pwd)" $prepro_opts - | collapse"' - eval "$awk $awk_opts -f <($prep) -- \"\$@\"" - else - trap 'rm -f $tmp_file' EXIT INT TERM - tmp_file=$(mktemp) - printf "%s" "$1" | delhashbang \ - | eval "$prepro $incopt"$(pwd)" $prepro_opts - | collapse" > $tmp_file - shift - eval "$awk $awk_opts -f $tmp_file -- \"\$@\"" - fi -else - die "awk code must be specified" -fi diff --git a/cppawk-include/array.h b/cppawk-include/array.h deleted file mode 100644 index f3b7a22..0000000 --- a/cppawk-include/array.h +++ /dev/null @@ -1,98 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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/cppawk-include/base.h b/cppawk-include/base.h deleted file mode 100644 index 4012d95..0000000 --- a/cppawk-include/base.h +++ /dev/null @@ -1,60 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_BASE_H -#define __CPPAWK_BASE_H - -#if __gawk__ && !defined __gawk_ver -#define __gawk_ver 040000 -#endif - -#define __cat(a, b) a ## b -#define __xcat(a, b) __cat(a, b) -#define __str(x) # x -#define __xstr(x) __str(x) -#define __g(name) __xcat(__, __xcat(name, __LINE__)) -#define __gx(name, ext) __xcat(__, __xcat(name, __xcat(ext, __LINE__))) - -#define __error(...) { printf(__VA_ARGS__); print; exit 1 } - -#define __present(arg) ((arg) != "" || (arg) != 0) - -#if __egawk__ -#define __let(...) @let (__VA_ARGS__) -#define __have_let 1 -#else -#define __let(...) -#endif - -#if __gawk__ -#define __have_switch 1 -#if __gawk_ver >= 040000 || __egawk__ -#define __have_indirect_functions 1 -#endif -#endif - -#endif diff --git a/cppawk-include/case-priv.h b/cppawk-include/case-priv.h deleted file mode 100644 index 825ed1b..0000000 --- a/cppawk-include/case-priv.h +++ /dev/null @@ -1,93 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_CASE_PRIV_H -#define __CPPAWK_CASE_PRIV_H - -#ifndef __CPPAWK_NARG_PRIV -#include "narg-priv.h" -#endif - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#if __have_switch - -#define __ca_first(x) case x: -#define __ca_next(p, x) p case x: - -#define __mx_first(x) __of(x) -#define __mx_next(p, x) p case x: - -#define __case_temps __ign -#define __case(expr) switch (expr) -#define __of(...) __varexpand(__ca_first, __ca_next, __VA_ARGS__) {{{ -#define __matching(...) __varexpand(__ca_first, __ca_next, __VA_ARGS__) {{{ -#define __mixed(x, y) __varexpand(__ca_first, __ca_next, __splice(x)) \ - __varexpand(__ca_first, __ca_next, __splice(y)) {{{ -#define __cbreak break; }}} -#define __cfall }}} -#define __cret(val) return val; }}} -#define __otherwise default: {{{ - -#else - -#define __clause(expr) if (__pass || (expr) && (__pass = 1)) -#define __of_first(x) (__val == (x)) -#define __of_next(p, x) p || (__val == (x)) -#define __mtch_first(x) (__val ~ (x)) -#define __mtch_next(p, \ - x) p || (__val ~ (x)) - -#if !__have_let -#define __case_temps __val, __once, __pass -#else -#define __case_temps __ign -#endif - -#define __case(expr) __let (__val, __once, __pass) \ - for ((__once = 1) && (__pass = 0) || (__val = expr); \ - __once; \ - __once = 0) -#define __of(...) __clause(__varexpand(__of_first, __of_next, \ - __VA_ARGS__)) {{{ -#define __matching(...) __clause(__varexpand(__mtch_first, mtch_next, \ - __VA_ARGS__)) {{{ -#define __mixed(x, y) __clause(__varexpand(__of_first, __of_next, \ - __splice(x)) || \ - __varexpand(__mtch_first, __mtch_next, \ - __splice(y))) {{{ -#define __cbreak break; }}} -#define __creturn(val) return val; }}} -#define __cfall }}} -#define __cret(val) return val; }}} -#define __otherwise if (__pass = 1) {{{ - -#endif - -#endif diff --git a/cppawk-include/case.h b/cppawk-include/case.h deleted file mode 100644 index d5ed331..0000000 --- a/cppawk-include/case.h +++ /dev/null @@ -1,46 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_CASE_H -#define __CPPAWK_CASE_H - -#ifndef __CPPAWK_CASE_PRIV_H -#include "case-priv.h" -#endif - -#define case_temps __case_temps -#define case(expr) __case(expr) -#define of(...) __of(__VA_ARGS__) -#define matching(...) __matching(__VA_ARGS__) -#define mixed(...) __mixed(__VA_ARGS__) -#define cbreak __cbreak -#define cfall __cfall -#define cret(val) __cret(val) -#define then __do -#define otherwise __otherwise - -#endif diff --git a/cppawk-include/cons-priv.h b/cppawk-include/cons-priv.h deleted file mode 100644 index 172f20f..0000000 --- a/cppawk-include/cons-priv.h +++ /dev/null @@ -1,906 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_CONS_PRIV_H -#define __CPPAWK_CONS_PRIV_H - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#ifndef __CPPAWK_ITER_PRIV_H -#include "iter-priv.h" -#endif - -#ifndef __CPPAWK_CASE_PRIV_H -#include "case-priv.h" -#endif - -#ifndef __CPPAWK_NARG_PRIV_H -#include "narg-priv.h" -#endif - -#if __have_indirect_functions -#ifndef __CPPAWK_FUN_PRIV_H -#include "fun-priv.h" -#endif -#endif - -#define __nil "" - -#define __prog_first(expr) ((expr) || 1) -#define __prog_next(prev, \ - expr) prev && ((expr) || 1) -#define __prog(...) (__varexpand(__prog_first, __prog_next, \ - __VA_ARGS__)) - -#define __progn_first(expr) (expr) -#define __progn_next(prev, \ - next) ((prev || 1) ? (next) : 0) -#define __progn(...) __varexpand(__progn_first, __progn_next, \ - __VA_ARGS__) - -#define __or_first(expr) (expr) -#define __or_next(prev, \ - next) ((__g(or) = prev) ? __g(or) : (next)) -#define __or(...) __varexpand(__or_first, __or_next, \ - __VA_ARGS__) - -#define __and_first(expr) (expr) -#define __and_next(prev, \ - next) ((__g(and) = prev) ? next : __g(and)) -#define __and(...) __varexpand(__and_first, __and_next, \ - __VA_ARGS__) - - -#define __push(item, list) (list = __cons(item, list)) - -#define __pop(list) (__progn(__g(ol) = (list), \ - list = __cdr(__g(ol)), \ - __car(__g(ol)))) - -#define __dolist(item, list) \ - for (__g(i) = list; \ - !__endp(__g(i)) && ((item = __car(__g(i))) || 1); \ - __g(i) = __cdr(__g(i))) - -#define __dolisti(item, index, list) \ - for (__prog(__g(i) = list, index = 0); \ - !__endp(__g(i)) && ((item = __car(__g(i))) || 1); \ - __prog(__g(i) = __cdr(__g(i)), index++)) - -#define __doconses(iter, list) \ - for (iter = list; __consp(iter); iter = __cdr(iter)) - -#define __list_begin() "" -#define __list_add(stk, item) __pack(stk, item) -#define __list_end(stk) __unpack(stk, __nil) -#define __list_end_atom(stk, atom) __unpack(stk, atom) - -#define __bag_init_first(x) (x = __list_begin()) -#define __bag_init_next(p, x) (p || 1) && __bag_init_first(x) - -#define __bag_done_first(x) (x = __list_end(x)) -#define __bag_done_next(p, x) (p || 1) && __bag_done_first(x) - -#define __bags(...) for ((__g(once) = 1) && \ - __varexpand(__bag_init_first, \ - __bag_init_next, \ - __VA_ARGS__); \ - __g(once) || \ - __varexpand(__bag_done_first, \ - __bag_done_next, \ - __VA_ARGS__) && 0; \ - __g(once) = 0) -#define __bag(bag, expr) bag = __list_add(bag, expr) - -#define __typecode(obj) (substr(obj, 1, 1)) - -function __consp(__obj) -{ - return __typecode(__obj) == "C" -} -#define __consp(obj) (__typecode(obj) == "C") - -function __atom(__obj) -{ - return __typecode(__obj) != "C" -} -#define __atom(obj) (__typecode(obj) != "C") - -function __null(__obj) -{ - return __obj == __nil && __obj != 0 -} - -function __endp(__obj) -{ - if (__obj == __nil && __obj != 0) - return 1 - if (__consp(__obj)) - return 0 - __error("endp: a proper list ends with nil, not %s", __obj) -} - -function __bs_esc(raw) -{ - gsub(/[\\\042]/, "\\\\&", raw) - return raw -} - -function __numberp(__obj) -{ - return __obj != "" && (__obj == 0 || __obj + 0 != 0) -} -#define __numberp(obj) (obj != "" && ((obj) == 0 || (obj) + 0 != 0)) - -function __stringp(__obj) -{ - return __typecode(__obj) == "T" -} -#define __stringp(obj) (__typecode(obj) == "T") - -function __symbolp(__obj) -{ - return __obj != 0 && __typecode(__obj) ~ /^S?$/ -} - -function __box(__raw, - __check, - __case_temps) -{ - if (!__present(__raw)) - return "U"; - - if (__present(__check)) - __error("box; excess argument %s", __check) - - if (__numberp(__raw)) - return __raw; - - return "T" __raw; -} - -function __unbox(__obj, - __check, - __case_temps) -{ - if (!__present(__obj)) - __error("unbox: missing or undefined argument") - - if (__present(__check)) - __error("unbox; excess argument %s", __check) - - __case (__typecode(__obj)) { - __of ("T", "S") - __cret (substr(__obj, 2)) - __of ("C") - __error("unbox: %s looks like a cons", __obj) - __cbreak - __of ("U") - __cret(__check) - __of ("") - __cret("nil") - __otherwise - if (!__numberp(__obj)) - __error("unbox: %s isn't symbol, number or boxed string", __obj) - __cret (__obj) - } -} - -function __box_str(__str) -{ - return "T" __str -} -#define __box_str(str) ("T" (str)) - -function __box_sym(__name) -{ - return __name == "nil" ? __nil : "S" __name -} - -function __cons(__a, __d) -{ - return "C" length(__a) "," length(__d) ":" __a __d -} - -function __car(__cell, - __col, __com, len) -{ - if (__consp(__cell)) { - __col = match(__cell, /:/) - __com = match(__cell, /,/) - if (__col == 0 || __com == 0 || __col <= __com) - __error("car: %s has a malformed cons header", __cell) - len = substr(__cell, 2, __com - 2 + 1) - return substr(__cell, __col + 1, len) - } else if (__null(__cell)) { - return __nil - } else { - __error("car: %s isn't a cons", __cell) - } -} - -function __cdr(__cell, - __col, __com, __alen, __dlen) -{ - if (__consp(__cell)) { - __col = match(__cell, /:/) - __com = match(__cell, /,/) - if (__col == 0 || __com == 0 || __col <= __com) - __error("cdr: %s has a malformed cons header", __cell) - __alen = substr(__cell, 2, __com - 2 + 1) - __dlen = substr(__cell, __com + 1, __col - __com) - return substr(__cell, __col + 1 + __alen, __dlen) - } else if (__null(__cell)) { - return __nil - } else { - __error("cdr: %s isn't a cons", __cell) - } -} - -function __sexp(__obj, - __d, __x, __y, __case_temps) -{ - if (!__present(__obj)) - __error("sexp: missing or undefined argument") - - __case (__typecode(__obj)) { - __of ("C") - __d = __cdr(__obj) - __x = __sexp(__car(__obj)) - if (__null(__d)) { - return "(" __x ")" - } else { - __y = __sexp(__d) - if (__typecode(__d) == "C") - return "(" __x " " substr(__y, 2) - else - return "(" __x " . " __y ")" - } - __cbreak - __of ("T") - __cret ("\"" __bs_esc(substr(__obj, 2)) "\"") - __of ("S") - __cret (__bs_esc(substr(__obj, 2))) - __of ("U") - __cret ("#U") - } - - if (__numberp(__obj)) { - return __obj - } else if (__null(__obj)) { - return "nil" - } else { - return "\"" __bs_esc(__obj) "\"" - } -} - -function __reverse(__lst, - __tmp) -{ - __tmp = __nil - - while (!__endp(__lst)) { - __push(__car(__lst), __tmp); - __lst = __cdr(__lst); - } - - return __tmp; -} - -function __values(__arr, - __tmp, __key, __value) -{ - __tmp = __list_begin() - - __doarray (__key, __value, __arr) - __tmp = __list_add(__tmp,__value) - - return __list_end(__tmp) -} - -function __keys(__array, - __key, __tmp) -{ - __tmp = __list_begin() - - for (__key in __array) - __tmp = __list_add(__tmp, __key) - - return __list_end(__tmp) -} - - -function __fields(__start, __count, - __tmp, __end, __val) -{ - if (!__present(__start)) - __start = 1 - - if (!__present(__count)) - __count = NF - __start + 1 - - if (__count < 1) - return __nil - - __end = __start + __count - 1 - - if (__end > NF) - __end = NF - - if (__start < 1) - __start = 1 - - if (__start > __end) - return __nil - - __tmp = __list_begin() - - for (; __start <= __end; __start++) - __tmp = __list_add(__tmp, $(__start)) - - return __list_end(__tmp) -} - -function __set_fields(__lst, __start, - __tmp, __item, __n) -{ - if (!__present(__start)) - __start = 1 - - __dolisti (__item, __n, __lst) - $(__n + __start) = __item - - NF = __n + __start - 1 - - return __n -} - -function __equal(__obj1, __obj2) -{ - if (__obj1 == __obj2) - return 1; - return __slow_equal(__obj1, __obj2) -} -#define __equal(obj1, obj2) ((obj1) == (obj2) ? 1 : __slow_equal(obj1, obj2)) - -function __slow_equal(__obj1, __obj2, - __tc1, __tc2, __case_temps) -{ - __tc1 = __typecode(__obj1) - __tc2 = __typecode(__obj2) - - __case (__tc1 __tc2) { - __of ("CC") - __cret (__equal(__car(__obj1), __car(__obj2)) && - __equal(__cdr(__obj1), __cdr(__obj2))) - __matching (/[UTSC][UTSC]/) - __cret (0); - } - - if (__tc1 == "T") - return __numberp(__obj2) ? 0 : (__obj1 == __box_str(__obj2)) - - if (__tc2 == "T") - return __numberp(__obj1) ? 0 : (__box_str(__obj1) == __obj2) - - if (__numberp(__obj1) && __numberp(__obj2)) - return __obj1 + 0 == __obj2 + 0 - - return 0 -} - -function __equalize(__obj, - __tc, __str) -{ - if (!__present(__obj)) - return "" - - __tc = __typecode(__obj) - - __case (__tc) { - __of("C") - __cret (__cons(__equalize(__car(__obj)), - __equalize(__cdr(__obj)))) - __of("T", "S", "U", "") - __cret (__obj) - } - - if (__numberp(__obj)) - return __obj + 0 - - return __box_str(__obj) -} - -function __pack(__stk, __item) -{ - return length(__item) ":" __item __stk -} - -function __unpack(__stk, __out, - __col) -{ - while (__stk != "") { - __col = match(__stk, /:/) - if (__col == 0) - break; - __push(substr(__stk, __col + 1, __stk), __out) - __stk = substr(__stk, __col + 1 + __stk); - } - - return __out -} - -#ifndef __CPPAWK_VARG_PRIV_H -#include "varg-priv.h" -#endif - -function __list(__rest, - __check) -{ - return __arglist("list", __rest, __check) -} -#define __list_first(item) __cons(item, __nil) -#define __list_next(list, item) __cons(item, list) -#define __li(...) __varexpand(__list_first, \ - __list_next, \ - __revarg(__VA_ARGS__)) - -#define __listar_first(item) item -#define __listar(...) __varexpand(__listar_first, \ - __list_next, \ - __revarg(__VA_ARGS__)) - -function __append2(__left, __right, - tmp) -{ - tmp = __reverse(__left) - while (!__endp(tmp)) - __right = __cons(__pop(tmp), __right) - return __right -} - -function __append(__rest, - __count, __out) -{ - __varg_count("append", __count, __count) - __out = __nil - __case (__count) { - __of (32) - __out = __r32 - __cbreak - __of (31) - __out = __r31 - __cbreak - __of (30) - __out = __r30 - __cbreak - __of (29) - __out = __r29 - __cbreak - __of (28) - __out = __r28 - __cbreak - __of (27) - __out = __r27 - __cbreak - __of (26) - __out = __r26 - __cbreak - __of (25) - __out = __r25 - __cbreak - __of (24) - __out = __r24 - __cbreak - __of (23) - __out = __r23 - __cbreak - __of (22) - __out = __r22 - __cbreak - __of (21) - __out = __r21 - __cbreak - __of (20) - __out = __r20 - __cbreak - __of (19) - __out = __r19 - __cbreak - __of (18) - __out = __r18 - __cbreak - __of (17) - __out = __r17 - __cbreak - __of (16) - __out = __r16 - __cbreak - __of (15) - __out = __r15 - __cbreak - __of (14) - __out = __r14 - __cbreak - __of (13) - __out = __r13 - __cbreak - __of (12) - __out = __r12 - __cbreak - __of (11) - __out = __r11 - __cbreak - __of (10) - __out = __r10 - __cbreak - __of (9) - __out = __r9 - __cbreak - __of (8) - __out = __r8 - __cbreak - __of (7) - __out = __r7 - __cbreak - __of (6) - __out = __r6 - __cbreak - __of (5) - __out = __r5 - __cbreak - __of (4) - __out = __r4 - __cbreak - __of (3) - __out = __r3 - __cbreak - __of (2) - __out = __r2 - __cbreak - __of (1) - __out = __r1 - __cbreak - } - __case (__count - 1) { - __of (31) - __out = __append2(__r31, __out) - __cfall - __of (30) - __out = __append2(__r30, __out) - __cfall - __of (29) - __out = __append2(__r29, __out) - __cfall - __of (28) - __out = __append2(__r28, __out) - __cfall - __of (27) - __out = __append2(__r27, __out) - __cfall - __of (26) - __out = __append2(__r26, __out) - __cfall - __of (25) - __out = __append2(__r25, __out) - __cfall - __of (24) - __out = __append2(__r24, __out) - __cfall - __of (23) - __out = __append2(__r23, __out) - __cfall - __of (22) - __out = __append2(__r22, __out) - __cfall - __of (21) - __out = __append2(__r21, __out) - __cfall - __of (20) - __out = __append2(__r20, __out) - __cfall - __of (19) - __out = __append2(__r19, __out) - __cfall - __of (18) - __out = __append2(__r18, __out) - __cfall - __of (17) - __out = __append2(__r17, __out) - __cfall - __of (16) - __out = __append2(__r16, __out) - __cfall - __of (15) - __out = __append2(__r15, __out) - __cfall - __of (14) - __out = __append2(__r14, __out) - __cfall - __of (13) - __out = __append2(__r13, __out) - __cfall - __of (12) - __out = __append2(__r12, __out) - __cfall - __of (11) - __out = __append2(__r11, __out) - __cfall - __of (10) - __out = __append2(__r10, __out) - __cfall - __of (9) - __out = __append2(__r9, __out) - __cfall - __of (8) - __out = __append2(__r8, __out) - __cfall - __of (7) - __out = __append2(__r7, __out) - __cfall - __of (6) - __out = __append2(__r6, __out) - __cfall - __of (5) - __out = __append2(__r5, __out) - __cfall - __of (4) - __out = __append2(__r4, __out) - __cfall - __of (3) - __out = __append2(__r3, __out) - __cfall - __of (2) - __out = __append2(__r2, __out) - __cfall - __of (1) - __out = __append2(__r1, __out) - __cfall - } - - return __out -} - -function __member(__item, __lst) -{ - while (!__endp(__lst)) { - if (__equal(__item, __car(__lst))) - return __lst; - __lst = __cdr(__lst) - } - - return __nil -} - -function __position(__item, __lst, - __pos) -{ - for (__pos = 0; !__endp(__lst); __pos++) { - if (__equal(__item, __car(__lst))) - return __pos; - __lst = __cdr(__lst) - } - - return __nil -} - -function __nth(__pos, __lst) -{ - for (; __pos > 0 && !__endp(__lst); __pos--) - __lst = __cdr(__lst) - return __pos == 0 ? __car(__lst) : __nil -} - -function __nthcdr(__pos, __lst) -{ - for (; __pos > 0 && !__endp(__lst); __pos--) - __lst = __cdr(__lst) - return __lst -} - -function __ldiff(__main, __tail, - __out, __iter) -{ - if (__null(__main)) - return __nil - - if (__null(__tail)) - return __main - - __out = __list_begin() - - __doconses (__iter, __main) { - if (__iter == __tail) - break - __out = __list_add(__out, __car(__iter)) - } - - if (__atom(__iter) && __iter != __tail) - return __list_end_atom(__out, __iter) - - return __list_end(__out) -} - -function __last(__lst, __n, - __circbuf, __i) -{ - if (!__present(__n)) - __n = 1 - else if (__n < 0) - __error("last: number argument %s must be non-negative", __n) - - if (__n == 0) { - __doconses (__iter, __lst) - ; // nothing - return __iter - } - - delete __circbuf - - __i = 0 - - __n++ - - __doconses (__iter, __lst) - __circbuf[__i++ % __n] = __iter - - __i = (__i + 1) % __n - - return (__i in __circbuf) ? __circbuf[__i] : __lst -} - -function __butlast(__lst, __n, - __circbuf, __i, __out) -{ - if (!__present(__n)) - __n = 1 - else if (__n < 0) - __error("butlast: number argument %s must be non-negative", __n) - - __out = __list_begin() - - if (__n == 0) { - __doconses (__iter, __lst) - __out = __list_add(__out, __car(__iter)) - return __list_end(__out) - } - - delete __circbuf - - __i = 0 - - __n++ - - __doconses (__iter, __lst) { - __circbuf[__i++ % __n] = __out - __out = __list_add(__out, __car(__iter)) - } - - __i = (__i + 1) % __n - - return (__i in __circbuf) ? __list_end(__circbuf[__i]) : __nil -} - -function __iota(__from, __to, __delta, - __out, __i, __val) -{ - __out = __list_begin(); - - if (__from < __to) { - if (!__present(__delta)) - __delta = 1 - - if (__delta <= 0) - return __nil; - - __i = 0 - __val = __from - - while (__val <= __to) { - __out = __list_add(__out, __val) - __i++ - __val = __from + (__i * __delta) - } - } else if (__from > __to) { - if (!__present(__delta)) - __delta = -1 - - if (__delta >= 0) - return __nil; - - __i = 0 - __val = __from - - while (__val >= __to) { - __out = __list_add(__out, __val) - __i++ - __val = __from + (__i * __delta) - } - } else { - return __list(__from) - } - - return __list_end(__out) -} - -function __uniq(__lst, - __out, __item, __seen) -{ - __out = __list_begin(); - - __dolist(__item, __lst) { - if (__item in __seen) - continue - __seen[__item] - __out = __list_add(__out, __item) - } - - return __list_end(__out) -} - -function __uniqual(__lst, - __out, __item, __itemeq, __seen) -{ - __out = __list_begin(); - - __dolist(__item, __lst) { - __itemq = __equalize(__item) - if (__itemq in __seen) - continue - __seen[__itemq] - __out = __list_add(__out, __item) - } - - return __list_end(__out) -} - - -#if __have_indirect_functions - -function __mapcar(__fun, __lst, - __temp, __item, out) -{ - __temp = __list_begin() - __dolist(__item, __lst) - __temp = __list_add(__temp, __call(__fun, __item)) - return __list_end(__temp) -} - -function __mappend(__fun, __lst, - __temp, __item, out) -{ - __temp = __nil - __dolist(__item, __lst) - __temp = __append2(__temp, __call(__fun, __item)) - return __temp -} - -#endif - -#endif diff --git a/cppawk-include/cons.h b/cppawk-include/cons.h deleted file mode 100644 index f120c0c..0000000 --- a/cppawk-include/cons.h +++ /dev/null @@ -1,92 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_CONS_H -#define __CPPAWK_CONS_H - -#ifndef __CPPAWK_CONS_PRIV_H -#include "cons-priv.h" -#endif - -#define nil __nil -#define prog(...) __prog(__VA_ARGS__) -#define progn(...) __progn(__VA_ARGS__) -#define or(...) __or(__VA_ARGS__) -#define and(...) __and(__VA_ARGS__) -#define push(item, list) __push(item, list) -#define pop(list) __pop(list) -#define dolist(item, list) __dolist(item, list) -#define dolisti(item, index, list) __dolisti(item, index, list) -#define doconses(iter, list) __doconses(iter, list) -#define list_begin() __list_begin() -#define list_add(stk, item) __list_add(stk, item) -#define list_end(stk) __list_end(stk) -#define list_end_atom(stk, atom) __list_end_atom(stk, atom) -#define bags(...) __bags(__VA_ARGS__) -#define bag(bag, expr) __bag(bag, expr) -#define consp __consp -#define atom __atom -#define null __null -#define endp __endp -#define false __false -#define true __true -#define numberp __numberp -#define stringp __stringp -#define symbolp __symbolp -#define box __box -#define unbox __unbox -#define box_str __box_str -#define box_sym __box_sym -#define cons __cons -#define car __car -#define cdr __cdr -#define sexp __sexp -#define reverse __reverse -#define values __values -#define keys __keys -#define fields __fields -#define set_fields __set_fields -#define equal __equal -#define equalize __equalize -#define list __list -#define li __li -#define listar __listar -#define append __append -#define member __member -#define position __position -#define nth __nth -#define nthcdr __nthcdr -#define ldiff __ldiff -#define last __last -#define butlast __butlast -#define iota __iota -#define uniq __uniq -#define uniqual __uniqual -#define mapcar __mapcar -#define mappend __mappend - -#endif diff --git a/cppawk-include/field.h b/cppawk-include/field.h deleted file mode 100644 index a18000d..0000000 --- a/cppawk-include/field.h +++ /dev/null @@ -1,88 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_FIELD_H -#define __CPPAWK_FIELD_H - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#ifndef __CPPAWK_NARG_PRIV_H -#include "narg-priv.h" -#endif - -function delf(__at, __count, - __i, __j) -{ - if (!__present(__count)) - __count = 1 - - if (0 < __count && 1 <= __at && __at <= NF) { - __i = __at - __j = __at + __count - - while (__j <= NF) - $(__i++) = $(__j++) - - NF = __i - 1; - } -} - -function __insf(__at, __count, - __i, __j) -{ - if (!__present(__count)) - __count = 1 - - if (NF < __at) - NF = __at - 1 - - if (0 < __count && 1 <= __at) { - __i = NF + __count - __j = NF - - NF = __i - - while (__j >= __at) - $(__i--) = $(__j--) - return 1 - } - - return 0 -} - -#define __insf_first(arg, n, at) $(at + n - 1) = arg -#define __insf_next(prev, arg, n, at) prev; $(at + n - 1) = arg - -#define insf(at, ...) { \ - if (__insf(at, __narg(__VA_ARGS__))) { \ - __variaexpand(__insf_first, __insf_next, at, __VA_ARGS__); \ - } \ -} - -#endif diff --git a/cppawk-include/fun-priv.h b/cppawk-include/fun-priv.h deleted file mode 100644 index 0f92a44..0000000 --- a/cppawk-include/fun-priv.h +++ /dev/null @@ -1,50 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_FUN_PRIV_H -#define __CPPAWK_FUN_PRIV_H - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#ifndef __CPPAWK_CONS_H -#include "cons-priv.h" -#endif - -#if !__have_indirect_functions -#warning " requires an Awk with function indirection like newer GNU Awk" -#endif - -#define __bind(fname, env) __cons(__xstr(fname), env) -#define __fun_(fname) __xstr(fname) -#define __call(fobj, ...) (__consp(fobj) \ - ? __progn(__g(f) = __car(fobj), \ - @__g(f)(__cdr(fobj), ## __VA_ARGS__)) \ - : @fobj(__VA_ARGS__)) - -#endif diff --git a/cppawk-include/fun.h b/cppawk-include/fun.h deleted file mode 100644 index 6600609..0000000 --- a/cppawk-include/fun.h +++ /dev/null @@ -1,39 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_FUN_H -#define __CPPAWK_FUN_H - -#ifndef __CPPAWK_FUN_PRIV_H -#include "fun-priv.h" -#endif - -#define bind(fname, env) __bind(fname, env) -#define fun(fname) __fun_(fname) -#define call(...) __call(__VA_ARGS__) - -#endif diff --git a/cppawk-include/iter-priv.h b/cppawk-include/iter-priv.h deleted file mode 100644 index 946c874..0000000 --- a/cppawk-include/iter-priv.h +++ /dev/null @@ -1,45 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_ITER_PRIV_H -#define __CPPAWK_ITER_PRIV_H - -#define __doarray(key, value, arr) \ - for (key in arr) \ - if ((value = arr[key]) || 1) - -#define __dostring(index, chr, str) \ - __g(s) = str; \ - __g(l) = length(__g(s)); \ - for (index = 1; index <= __g(l); i++) \ - if ((chr = substr(__g(s), index, 1)) || 1) - -#define __dofields(index, val) \ - for (index = 1; index <= NF; index++) \ - if ((val = $ index) || 1) - -#endif diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h deleted file mode 100644 index 53bb43f..0000000 --- a/cppawk-include/iter.h +++ /dev/null @@ -1,329 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_ITER_H -#define __CPPAWK_ITER_H - -#ifndef __CPPAWK_ITER_PRIV_H -#include "iter-priv.h" -#endif - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#ifndef __CPPAWK_NARG_PRIV_H -#include "narg-priv.h" -#endif - -#ifndef __CPPAWK_CONS_PRIV_H -#include "cons-priv.h" -#endif - -#define doarray(key, value, arr) __doarray(key, value, arr) -#define dostring(index, chr, str) __dostring(index, chr, str) -#define dofields(index, val) __dofields(index, val) - -#define loop(...) __loop_temp(__VA_ARGS__) \ - for (__loop_init(__VA_ARGS__); \ - (__loop_test(__VA_ARGS__) || \ - __loop_fini(__VA_ARGS__)) && \ - __loop_prep(__VA_ARGS__); \ - __loop_step(__VA_ARGS__)) - -#if __have_let -#define __loop_temp(...) __let(__varexpand(__temp_first, __temp_next, \ - __VA_ARGS__)) -#else -#define __loop_temp(...) -#endif - -#define __loop_init(...) __prog(__varexpand(__init_first, __init_next, \ - __VA_ARGS__)) -#define __loop_test(...) __nd(__varexpand(__test_first, __test_next, \ - __VA_ARGS__)) -#define __loop_prep(...) __prog(__varexpand(__prep_first, __prep_next, \ - __VA_ARGS__)) -#define __loop_fini(...) __prog(__varexpand(__fini_first, __fini_next, \ - __VA_ARGS__)) && 0 -#define __loop_step(...) __prog(__varexpand(__step_first, __step_next, \ - __VA_ARGS__)) - -#define __nd(...) __varexpand(__nd_first, __nd_next, __VA_ARGS__) -#define __nd_first(x) (x) -#define __nd_next(p, x) p && (x) - -#define loop_nest(...) __varexpand2(__cross_first, __cross_next, __VA_ARGS__) - -#define __cross_first(args) for (__init_ ## args; \ - ((__test_ ## args) || \ - (__fini_ ## args) && 0) && \ - __prep_ ## args; \ - __step_ ## args) -#define __cross_next(prev, args) prev __cross_first(args) - -#define __temp_first(args) __temp_ ## args -#define __temp_next(prev, args) prev __temp_ ## args - -#define __init_first(args) __init_ ## args -#define __init_next(prev, args) prev, __init_ ## args - -#define __test_first(args) __test_ ## args -#define __test_next(prev, args) prev, __test_ ## args - -#define __prep_first(args) __prep_ ## args -#define __prep_next(prev, args) prev, __prep_ ## args - -#define __fini_first(args) __fini_ ## args -#define __fini_next(prev, args) prev, __fini_ ## args - -#define __step_first(args) __step_ ## args -#define __step_next(prev, args) prev, __step_ ## args - -#define __str_s __g(ch) -#define __str_len __g(idx) -#define __temp_str(idx, ch, str) __str_s, __str_len, -#define __init_str(idx, ch, str) __str_s = (str), __str_len = length(__str_s), idx = 1 -#define __test_str(idx, ch, str) idx <= __str_len -#define __prep_str(idx, ch, str) ch = substr(__str_s, idx, 1) -#define __fini_str(idx, ch, str) 1 -#define __step_str(idx, ch, str) idx++ - -#define __temp_range(idx, from, to) -#define __init_range(idx, from, to) idx = (from) -#define __test_range(idx, from, to) idx <= (to) -#define __prep_range(idx, from, to) 1 -#define __fini_range(idx, from, to) 1 -#define __step_range(idx, from, to) idx++ - -#define __temp_range_step(idx, from, to, step) -#define __init_range_step(idx, from, to, step) idx = (from) -#define __test_range_step(idx, from, to, step) idx <= (to) -#define __prep_range_step(idx, from, to, step) 1 -#define __fini_range_step(idx, from, to, step) 1 -#define __step_range_step(idx, from, to, step) idx += (step) - -#define __temp_from(idx, from) -#define __init_from(idx, from) idx = (from) -#define __test_from(idx, from) 1 -#define __prep_from(idx, from) 1 -#define __fini_from(idx, from) 1 -#define __step_from(idx, from) idx++ - -#define __temp_from_step(idx, from, step) -#define __init_from_step(idx, from, step) idx = (from) -#define __test_from_step(idx, from, step) 1 -#define __prep_from_step(idx, from, step) 1 -#define __fini_from_step(idx, from, step) 1 -#define __step_from_step(idx, from, step) idx += (step) - -#define __temp_first_then(var, first, then) -#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 __temp_list(iter, var, list) -#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) -#define __fini_list(iter, var, list) 0 -#define __step_list(iter, var, list) iter = __cdr(iter) -#define __temp___list(iter, var, list) -#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) -#define __fini___list(iter, var, list) 0 -#define __step___list(iter, var, list) iter = __cdr(iter) - -#define __temp_fields(var) __g(var), -#define __init_fields(var) __g(var) = 1 -#define __test_fields(var) __g(var) <= NF -#define __prep_fields(var) var = $ __g(var) -#define __fini_fields(var) 1 -#define __step_fields(var) __g(var)++ -#define __temp___fields(var) __g(var), -#define __init___fields(var) __g(var) = 1 -#define __test___fields(var) __g(var) <= NF -#define __prep___fields(var) var = $ __g(var) -#define __fini___fields(var) 1 -#define __step___fields(var) __g(var)++ - - -#define __temp_keys(key, array) __g(key), -#define __init_keys(key, array) __g(key) = __keys(array) -#define __test_keys(key, array) !__endp(__g(key)) -#define __prep_keys(key, array) key = __car(__g(key)) -#define __fini_keys(key, array) 1 -#define __step_keys(key, array) __g(key) = __cdr(__g(key)) -#define __temp___keys(key, array) __g(key), -#define __init___keys(key, array) __g(key) = __keys(array) -#define __test___keys(key, array) !__endp(__g(key)) -#define __prep___keys(key, array) key = __car(__g(key)) -#define __fini___keys(key, array) 1 -#define __step___keys(key, array) __g(key) = __cdr(__g(key)) - -#define __temp_collect(var, expr) -#define __init_collect(var, expr) var = __list_begin() -#define __test_collect(var, expr) 1 -#define __prep_collect(var, expr) var = __list_add(var, expr) -#define __fini_collect(var, expr) var = __list_end(var) -#define __step_collect(var, expr) 1 - -#define __temp_collect_plus(var, expr) -#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 __temp_summing(var, expr) -#define __init_summing(var, expr) var = 0 -#define __test_summing(var, expr) 1 -#define __prep_summing(var, expr) var += (expr) -#define __fini_summing(var, expr) 1 -#define __step_summing(var, expr) 1 - -function __loop_max(a, b) -{ - return a > b ? a : b -} - -#define __temp_maximizing(var, expr) -#define __init_maximizing(var, expr) var = nil -#define __test_maximizing(var, expr) 1 -#define __prep_maximizing(var, expr) var = (__null(var) \ - ? expr \ - : __loop_max(var, expr)) -#define __fini_maximizing(var, expr) 1 -#define __step_maximizing(var, expr) 1 - -function __loop_min(a, b) -{ - return a > b ? b : a -} - -#define __temp_minimizing(var, expr) -#define __init_minimizing(var, expr) var = nil -#define __test_minimizing(var, expr) 1 -#define __prep_minimizing(var, expr) var = (__null(var) \ - ? expr \ - : __loop_min(var, expr)) -#define __fini_minimizing(var, expr) 1 -#define __step_minimizing(var, expr) 1 - -function __loop_argmax(a, arga, b, argb) -{ - return a > b ? arga : argb; -} - -#define __ami(v) __gx(v, _max) -#define __amx(v) __gx(v, _min) -#define __amo(v) __gx(v, _old) - -#define __temp_argmax(am, arg, expr) __amx(am), __amo(am), -#define __init_argmax(am, arg, expr) (__amx(am) = __nil) || (am = __nil) -#define __test_argmax(am, arg, expr) 1 -#define __prep_argmax(am, arg, expr) ((__amo(am) = __amx(am)) || 1) && \ - ((__amx(am) = \ - (__null(__amx(am)) \ - ? expr \ - : __loop_max(__amx(am), \ - expr))) || 1) && \ - ((__amo(am) != __amx(am)) ? am = arg : 1) -#define __fini_argmax(am, arg, expr) 1 -#define __step_argmax(am, arg, expr) 1 - -function __loop_argmin(a, arga, b, argb) -{ - return a < b ? arga : argb; -} - -#define __temp_argmin(am, arg, expr) __ami(am), __amo(am), -#define __init_argmin(am, arg, expr) (__ami(am) = __nil) || (am = __nil) -#define __test_argmin(am, arg, expr) 1 -#define __prep_argmin(am, arg, expr) ((__amo(am) = __ami(am)) || 1) && \ - ((__ami(am) = \ - (__null(__ami(am)) \ - ? expr \ - : __loop_min(__ami(am), \ - expr))) || 1) && \ - ((__amo(am) != __ami(am)) ? am = arg : 1) -#define __fini_argmin(am, arg, expr) 1 -#define __step_argmin(am, arg, expr) 1 - -#define __temp_counting(var, expr) -#define __init_counting(var, expr) var = 0 -#define __test_counting(var, expr) 1 -#define __prep_counting(var, expr) (expr) ? var++ : 1 -#define __fini_counting(var, expr) 1 -#define __step_counting(var, expr) 1 - -#define __temp_while(expr) -#define __init_while(expr) 1 -#define __test_while(expr) expr -#define __prep_while(expr) 1 -#define __fini_while(expr) 1 -#define __step_while(expr) 1 - -#define __temp_until(expr) -#define __init_until(expr) 1 -#define __test_until(expr) !(expr) -#define __prep_until(expr) 1 -#define __fini_until(expr) 1 -#define __step_until(expr) 1 - -#define __temp_parallel(...) -#define __init_parallel(...) __prog(__varexpand3(__init_first, __init_next, \ - __VA_ARGS__)) -#define __test_parallel(...) __nd(__varexpand3(__test_first, __test_next, \ - __VA_ARGS__)) -#define __prep_parallel(...) (__nd(__varexpand3(__prep_first, __prep_next, \ - __VA_ARGS__)) || 1) -#define __fini_parallel(...) (__nd(__varexpand3(__fini_first, __fini_next, \ - __VA_ARGS__)) && 0) -#define __step_parallel(...) __prog(__varexpand3(__step_first, __step_next, \ - __VA_ARGS__)) - -#define __temp_if(test, clause) -#define __init_if(test, clause) __init_ ## clause -#define __test_if(test, clause) !(test) || __test_ ## clause -#define __prep_if(test, clause) (test) && __prep_ ## clause -#define __fini_if(test, clause) __fini_ ## clause -#define __step_if(test, clause) (test) && __step_ ## clause - -#define __temp_records(file) __g(stream) -#define __init_records(file) __g(stream) = file -#define __test_records(file) (getline < __g(stream)) > 0 -#define __prep_records(file) 1 -#define __fini_records(file) __g(stream) != "-" ? close(__g(stream)) : 1 -#define __step_records(file) 1 - -#endif diff --git a/cppawk-include/narg-priv.h b/cppawk-include/narg-priv.h deleted file mode 100644 index bee5300..0000000 --- a/cppawk-include/narg-priv.h +++ /dev/null @@ -1,367 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_PRIV_H -#define __CPPAWK_NARG_PRIV_H - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#define __bad _[<"too many args"<] - -#define __narg_50(B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, \ - B14, B15, B16, N33, N32, N31, N30, N29, N28, N27, N26, N25, \ - N24, N23, N22, N21, N20, N19, N18, N17, N16, N15, N14, N13, \ - N12, N11, N10, N9, N8, N7, N6, N5, N4, N3, N2, N1, N, ...) N - -#define __xnarg_50(...) __narg_50(__VA_ARGS__) - -// The __bad entries create a 16 position red zone. We effectively have -// space for 48 arguments, but if there are 33-48 arguments, we do not -// return an integer count, but rather bad syntax. Beyond 48 arguments, __narg -// starts to misbehave: it starts reproducing its 49th argument as its -// expansion. Without the 16 position bad syntax red zone, there would be -// and abrupt change: the macro would be good up to 32 arguments, returning the -// 1-32 ragument count, but the 33rd argument were added, the macro would -// misbehave badly, returning the 33rd argument, causnig a potentially -// hard-to-find bug. -#define __narg(...) __xnarg_50(__dummy, ## __VA_ARGS__, __bad, __bad, __bad, \ - __bad, __bad, __bad, __bad, __bad, __bad, \ - __bad, __bad, __bad, __bad, __bad, __bad, \ - __bad, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, \ - 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, \ - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) - -#define __repn_1(mac1, mac2, a1) \ - mac1(a1) -#define __repn_2(mac1, mac2, a1, a2) \ - mac2(mac1(a1), a2) -#define __repn_3(mac1, mac2, a1, a2, a3) \ - mac2(mac2(mac1(a1), a2), a3) -#define __repn_4(mac1, mac2, a1, a2, a3, a4) \ - mac2(mac2(mac2(mac1(a1), a2), a3), a4) -#define __repn_5(mac1, mac2, a1, a2, a3, a4, a5) \ - mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5) -#define __repn_6(mac1, mac2, a1, a2, a3, a4, a5, a6) \ - mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6) -#define __repn_7(mac1, mac2, a1, a2, a3, a4, a5, a6, a7) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7) -#define __repn_8(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8) -#define __repn_9(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9) -#define __repn_10(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10) -#define __repn_11(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11) -#define __repn_12(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12) -#define __repn_13(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13) -#define __repn_14(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14) -#define __repn_15(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15) -#define __repn_16(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16) -#define __repn_17(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17) -#define __repn_18(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18) -#define __repn_19(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19) -#define __repn_20(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20) -#define __repn_21(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21) -#define __repn_22(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22) -#define __repn_23(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23) -#define __repn_24(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24) -#define __repn_25(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25) -#define __repn_26(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26) -#define __repn_27(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27) -#define __repn_28(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28) -#define __repn_29(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29) -#define __repn_30(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29), a30) -#define __repn_31(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30, a31) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29), a30), a31) -#define __repn_32(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30, a31, a32) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29), a30), a31), a32) - -#define __repi_1(mac1, mac2, a1) \ - mac1(a1, 1) -#define __repi_2(mac1, mac2, a1, a2) \ - mac2(mac1(a1, 1), a2, 2) -#define __repi_3(mac1, mac2, a1, a2, a3) \ - mac2(mac2(mac1(a1, 1), a2, 2), a3, 3) -#define __repi_4(mac1, mac2, a1, a2, a3, a4) \ - mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4) -#define __repi_5(mac1, mac2, a1, a2, a3, a4, a5) \ - mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5) -#define __repi_6(mac1, mac2, a1, a2, a3, a4, a5, a6) \ - mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6) -#define __repi_7(mac1, mac2, a1, a2, a3, a4, a5, a6, a7) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7) -#define __repi_8(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8) -#define __repi_9(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9) -#define __repi_10(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10) -#define __repi_11(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11) -#define __repi_12(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12) -#define __repi_13(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13) -#define __repi_14(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14) -#define __repi_15(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15) -#define __repi_16(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16) -#define __repi_17(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17) -#define __repi_18(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18) -#define __repi_19(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19) -#define __repi_20(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20) -#define __repi_21(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21) -#define __repi_22(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22) -#define __repi_23(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23) -#define __repi_24(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24) -#define __repi_25(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25) -#define __repi_26(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26) -#define __repi_27(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27) -#define __repi_28(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28) -#define __repi_29(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29) -#define __repi_30(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29), a30, 30) -#define __repi_31(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30, a31) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29), a30, 30), a31, 31) -#define __repi_32(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30, a31, a32) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29), a30, 30), a31, 31), a32, 32) - -#define __repia_1(mac1, mac2, a, a1) \ - mac1(a1, 1, a) -#define __repia_2(mac1, mac2, a, a1, a2) \ - mac2(mac1(a1, 1, a), a2, 2, a) -#define __repia_3(mac1, mac2, a, a1, a2, a3) \ - mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a) -#define __repia_4(mac1, mac2, a, a1, a2, a3, a4) \ - mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a) -#define __repia_5(mac1, mac2, a, a1, a2, a3, a4, a5) \ - mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a) -#define __repia_6(mac1, mac2, a, a1, a2, a3, a4, a5, a6) \ - mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a) -#define __repia_7(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a) -#define __repia_8(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a) -#define __repia_9(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a) -#define __repia_10(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a) -#define __repia_11(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a) -#define __repia_12(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a) -#define __repia_13(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a) -#define __repia_14(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a) -#define __repia_15(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a) -#define __repia_16(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a) -#define __repia_17(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a) -#define __repia_18(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a) -#define __repia_19(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a) -#define __repia_20(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a) -#define __repia_21(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a) -#define __repia_22(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a) -#define __repia_23(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a) -#define __repia_24(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a) -#define __repia_25(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a) -#define __repia_26(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a) -#define __repia_27(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a) -#define __repia_28(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a) -#define __repia_29(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a) -#define __repia_30(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a), a30, 30, a) -#define __repia_31(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30, a31) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a), a30, 30, a), a31, 31, a) -#define __repia_32(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ - a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ - a24, a25, a26, a27, a28, a29, a30, a31, a32) \ - mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a), a30, 30, a), a31, 31, a), a32, 32, a) - -#define __varexpand(mac1, mac2, ...) \ - __xcat(__repn_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) - -#define __varexpand2(mac1, mac2, ...) \ - __xcat(__repn_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) - -#define __varexpand3(mac1, mac2, ...) \ - __xcat(__repn_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) - -#define __rev_first(arg) arg -#define __rev_next(args, arg) arg, args -#define __revarg(...) __varexpand(__rev_first, __rev_next, __VA_ARGS__) - -#define __va_args(...) __VA_ARGS__ -#define __splice(args) __va_args args - -#define __variexpand(mac1, mac2, ...) \ - __xcat(__repi_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) - -#define __variaexpand(mac1, mac2, a, ...) \ - __xcat(__repia_, __narg(__VA_ARGS__)) (mac1, mac2, a, __VA_ARGS__) - -#endif diff --git a/cppawk-include/narg.h b/cppawk-include/narg.h deleted file mode 100644 index b757f41..0000000 --- a/cppawk-include/narg.h +++ /dev/null @@ -1,44 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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(first, rest, ...) __varexpand(first, rest, __VA_ARGS__) -#define variexpand(first, rest, ...) __variexpand(first, rest, __VA_ARGS__) -#define variaexpand(first, rest, \ - arg, ...) __variaexpand(first, rest, arg, \ - __VA_ARGS__) -#define revarg(...) __revarg(__VA_ARGS__) -#define splice(args) __splice(args) - -#endif diff --git a/cppawk-include/varg-priv.h b/cppawk-include/varg-priv.h deleted file mode 100644 index d71b500..0000000 --- a/cppawk-include/varg-priv.h +++ /dev/null @@ -1,392 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_VARG_PRIV_H -#define __CPPAWK_VARG_PRIV_H - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#ifndef __CPPAWK_CASE_PRIV_H -#include "case-priv.h" -#endif - -#define __rest \ - __r1, __r2, __r3, __r4, __r5, __r6, __r7, __r8, __r9, __r10, __r11, \ - __r12, __r13, __r14, __r15, __r16, __r17, __r18, __r19, __r20, __r21, \ - __r22, __r23, __r24, __r25, __r26, __r27, __r28, __r29, __r30, __r31, __r32 - -#define __varg_count(name, check, count) \ - if (__present(check)) \ - __error(name ": too many arguments"); \ - count = 0; \ - if (__present(__r16)) { \ - if (__present(__r24)) { \ - if (__present(__r28)) { \ - if (__present(__r30)) { \ - if (__present(__r31)) { \ - if (__present(__r32)) \ - count = 32; \ - else \ - count = 31; \ - } else { \ - count = 30; \ - } \ - } else { /* !__present(__r30) */ \ - if (__present(__r29)) \ - count = 29; \ - else \ - count = 28; \ - } \ - } else { /* !__present(__r28) */ \ - if (__present(__r26)) { \ - if (__present(__r27)) \ - count = 27; \ - else \ - count = 26; \ - } else { /* !__present(__r26) */ \ - if (__present(__r25)) \ - count = 25; \ - else \ - count = 24; \ - } \ - } \ - } else { /* !__present(__r24) */ \ - if (__present(__r20)) { \ - if (__present(__r22)) { \ - if (__present(__r23)) \ - count = 23; \ - else \ - count = 22; \ - } else { /* !__present(__r22) */ \ - if (__present(__r21)) \ - count = 21; \ - else \ - count = 20; \ - } \ - } else { /* !__present(__r20) */ \ - if (__present(__r18)) { \ - if (__present(__r19)) \ - count = 19; \ - else \ - count = 18; \ - } else { /* !__present(__r18) */ \ - if (__present(__r17)) \ - count = 17; \ - else \ - count = 16; \ - } \ - } \ - } \ - } else { /*!__present(__r16) */ \ - if (__present(__r8)) { \ - if (__present(__r12)) { \ - if (__present(__r14)) { \ - if (__present(__r15)) { \ - count = 15; \ - } else { \ - count = 14; \ - } \ - } else { /* !__present(__r14) */ \ - if (__present(__r13)) \ - count = 13; \ - else \ - count = 12; \ - } \ - } else { /* !__present(__r12) */ \ - if (__present(__r10)) { \ - if (__present(__r11)) \ - count = 11; \ - else \ - count = 10; \ - } else { /* !__present(__r10) */ \ - if (__present(__r9)) \ - count = 9; \ - else \ - count = 8; \ - } \ - } \ - } else { /* !__present(__r8) */ \ - if (__present(__r4)) { \ - if (__present(__r6)) { \ - if (__present(__r7)) \ - count = 7; \ - else \ - count = 6; \ - } else { /* !__present(__r6) */ \ - if (__present(__r5)) \ - count = 5; \ - else \ - count = 4; \ - } \ - } else { /* !__present(__r4) */ \ - if (__present(__r2)) { \ - if (__present(__r3)) \ - count = 3; \ - else \ - count = 2; \ - } else { /* !__present(__r2) */ \ - if (__present(__r1)) \ - count = 1; \ - } \ - } \ - } \ - } - -#define __varg_list(name, check, count, out) \ - __varg_count(name, check, count); \ - out = __nil; \ - __case (count) { \ - __of (32) \ - out = __cons(__r32, out); \ - __cfall; \ - __of (31) \ - out = __cons(__r31, out); \ - __cfall; \ - __of (30) \ - out = __cons(__r30, out); \ - __cfall; \ - __of (29) \ - out = __cons(__r29, out); \ - __cfall; \ - __of (28) \ - out = __cons(__r28, out); \ - __cfall; \ - __of (27) \ - out = __cons(__r27, out); \ - __cfall; \ - __of (26) \ - out = __cons(__r26, out); \ - __cfall; \ - __of (25) \ - out = __cons(__r25, out); \ - __cfall; \ - __of (24) \ - out = __cons(__r24, out); \ - __cfall; \ - __of (23) \ - out = __cons(__r23, out); \ - __cfall; \ - __of (22) \ - out = __cons(__r22, out); \ - __cfall; \ - __of (21) \ - out = __cons(__r21, out); \ - __cfall; \ - __of (20) \ - out = __cons(__r20, out); \ - __cfall; \ - __of (19) \ - out = __cons(__r19, out); \ - __cfall; \ - __of (18) \ - out = __cons(__r18, out); \ - __cfall; \ - __of (17) \ - out = __cons(__r17, out); \ - __cfall; \ - __of (16) \ - out = __cons(__r16, out); \ - __cfall; \ - __of (15) \ - out = __cons(__r15, out); \ - __cfall; \ - __of (14) \ - out = __cons(__r14, out); \ - __cfall; \ - __of (13) \ - out = __cons(__r13, out); \ - __cfall; \ - __of (12) \ - out = __cons(__r12, out); \ - __cfall; \ - __of (11) \ - out = __cons(__r11, out); \ - __cfall; \ - __of (10) \ - out = __cons(__r10, out); \ - __cfall; \ - __of (9) \ - out = __cons(__r9, out); \ - __cfall; \ - __of (8) \ - out = __cons(__r8, out); \ - __cfall; \ - __of (7) \ - out = __cons(__r7, out); \ - __cfall; \ - __of (6) \ - out = __cons(__r6, out); \ - __cfall; \ - __of (5) \ - out = __cons(__r5, out); \ - __cfall; \ - __of (4) \ - out = __cons(__r4, out); \ - __cfall; \ - __of (3) \ - out = __cons(__r3, out); \ - __cfall; \ - __of (2) \ - out = __cons(__r2, out); \ - __cfall; \ - __of (1) \ - out = __cons(__r1, out); \ - __cfall; \ - } - -#define __varg_array(name, check, count, out) \ - __varg_count(name, check, count); \ - delete out; \ - __case (count) { \ - __of (32) \ - out[32] = __r32; \ - __cfall; \ - __of (31) \ - out[31] = __r31; \ - __cfall; \ - __of (30) \ - out[30] = __r30; \ - __cfall; \ - __of (29) \ - out[29] = __r29; \ - __cfall; \ - __of (28) \ - out[28] = __r28; \ - __cfall; \ - __of (27) \ - out[27] = __r27; \ - __cfall; \ - __of (26) \ - out[26] = __r26; \ - __cfall; \ - __of (25) \ - out[25] = __r25; \ - __cfall; \ - __of (24) \ - out[24] = __r24; \ - __cfall; \ - __of (23) \ - out[23] = __r23; \ - __cfall; \ - __of (22) \ - out[22] = __r22; \ - __cfall; \ - __of (21) \ - out[21] = __r21; \ - __cfall; \ - __of (20) \ - out[20] = __r20; \ - __cfall; \ - __of (19) \ - out[19] = __r19; \ - __cfall; \ - __of (18) \ - out[18] = __r18; \ - __cfall; \ - __of (17) \ - out[17] = __r17; \ - __cfall; \ - __of (16) \ - out[16] = __r16; \ - __cfall; \ - __of (15) \ - out[15] = __r15; \ - __cfall; \ - __of (14) \ - out[14] = __r14; \ - __cfall; \ - __of (13) \ - out[13] = __r13; \ - __cfall; \ - __of (12) \ - out[12] = __r12; \ - __cfall; \ - __of (11) \ - out[11] = __r11; \ - __cfall; \ - __of (10) \ - out[10] = __r10; \ - __cfall; \ - __of (9) \ - out[9] = __r9; \ - __cfall; \ - __of (8) \ - out[8] = __r8; \ - __cfall; \ - __of (7) \ - out[7] = __r7; \ - __cfall; \ - __of (6) \ - out[6] = __r6; \ - __cfall; \ - __of (5) \ - out[5] = __r5; \ - __cfall; \ - __of (4) \ - out[4] = __r4; \ - __cfall; \ - __of (3) \ - out[3] = __r3; \ - __cfall; \ - __of (2) \ - out[2] = __r2; \ - __cfall; \ - __of (1) \ - out[1] = __r1; \ - __cfall; \ - } - -#ifndef __CPPAWK_CONS_PRIV_H -#include "cons-priv.h" -#endif - -function __argcount(__name, __rest, - __narg, // check argument; doubles as local count - __case_temps) -{ - __varg_count(__name, __narg, __narg) - return __narg; -} - -function __arglist(__name, __rest, - __narg, // check argument; doubles as local count - __out, __case_temps) -{ - __varg_list(__name, __narg, __narg, __out) - return __out; -} - -function __argarray(__name, __to_array, __rest, - __narg, // check argument; doubles as local count - __case_temps) -{ - __varg_array(__name, __narg, __narg, __to_array) -} - -#endif diff --git a/cppawk-include/varg.h b/cppawk-include/varg.h deleted file mode 100644 index c0ff036..0000000 --- a/cppawk-include/varg.h +++ /dev/null @@ -1,46 +0,0 @@ -// cppawk: C preprocessor wrapper around awk -// Copyright 2022 Kaz Kylheku -// -// 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_VARG_H -#define __CPPAWK_VARG_H - -#ifndef __CPPAWK_BASE_H -#include "base.h" -#endif - -#ifndef __CPPAWK_VARG_PRIV_H -#include "varg-priv.h" -#endif - -#define restargs __rest -#define arg(n) __r ## n -#define present(arg) __present(arg) -#define argcount __argcount -#define arglist __arglist -#define argarray __argarray - -#endif diff --git a/runtests b/runtests index 339dcd2..f060349 100755 --- a/runtests +++ b/runtests @@ -4,40 +4,40 @@ trap 'rm -f output script.sh' EXIT INT TERM suite=$1 if [ -z "$suite" ] ; then - cppawk=./cppawk ./testsuite.awk testcases - cppawk="./cppawk --nobash" ./testsuite.awk testcases + cppawk=./bin/cppawk ./testsuite.awk testcases + cppawk="./bin/cppawk --nobash" ./testsuite.awk testcases fi if [ -z "$suite" -o "$suite" = "case" ] ; then - cppawk=./cppawk ./testsuite.awk testcases-case - cppawk="./cppawk --awk=mawk" ./testsuite.awk testcases-case + cppawk=./bin/cppawk ./testsuite.awk testcases-case + cppawk="./bin/cppawk --awk=mawk" ./testsuite.awk testcases-case fi if [ -z "$suite" -o "$suite" = "narg" ] ; then - cppawk=./cppawk ./testsuite.awk testcases-narg + cppawk=./bin/cppawk ./testsuite.awk testcases-narg fi if [ -z "$suite" -o "$suite" = "iter" ] ; then - cppawk=./cppawk ./testsuite.awk testcases-iter - cppawk="./cppawk --awk=mawk" ./testsuite.awk testcases-iter + cppawk=./bin/cppawk ./testsuite.awk testcases-iter + cppawk="./bin/cppawk --awk=mawk" ./testsuite.awk testcases-iter fi if [ -z "$suite" -o "$suite" = "varg" ] ; then - cppawk=./cppawk ./testsuite.awk testcases-varg - cppawk="./cppawk --awk=mawk" ./testsuite.awk testcases-varg + cppawk=./bin/cppawk ./testsuite.awk testcases-varg + cppawk="./bin/cppawk --awk=mawk" ./testsuite.awk testcases-varg fi if [ -z "$suite" -o "$suite" = "cons" ] ; then - cppawk=./cppawk ./testsuite.awk testcases-cons - cppawk="./cppawk --awk=mawk" ./testsuite.awk -v skip=37,38 testcases-cons + cppawk=./bin/cppawk ./testsuite.awk testcases-cons + cppawk="./bin/cppawk --awk=mawk" ./testsuite.awk -v skip=37,38 testcases-cons fi if [ -z "$suite" -o "$suite" = "field" ] ; then - cppawk=./cppawk ./testsuite.awk testcases-field - cppawk="./cppawk --awk=mawk" ./testsuite.awk testcases-field + cppawk=./bin/cppawk ./testsuite.awk testcases-field + cppawk="./bin/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 + cppawk=./bin/cppawk ./testsuite.awk testcases-array + cppawk="./bin/cppawk --awk=mawk" ./testsuite.awk -v skip=5,6 testcases-array fi diff --git a/share/cppawk/include/array.h b/share/cppawk/include/array.h new file mode 100644 index 0000000..f3b7a22 --- /dev/null +++ b/share/cppawk/include/array.h @@ -0,0 +1,98 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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/share/cppawk/include/base.h b/share/cppawk/include/base.h new file mode 100644 index 0000000..4012d95 --- /dev/null +++ b/share/cppawk/include/base.h @@ -0,0 +1,60 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_BASE_H +#define __CPPAWK_BASE_H + +#if __gawk__ && !defined __gawk_ver +#define __gawk_ver 040000 +#endif + +#define __cat(a, b) a ## b +#define __xcat(a, b) __cat(a, b) +#define __str(x) # x +#define __xstr(x) __str(x) +#define __g(name) __xcat(__, __xcat(name, __LINE__)) +#define __gx(name, ext) __xcat(__, __xcat(name, __xcat(ext, __LINE__))) + +#define __error(...) { printf(__VA_ARGS__); print; exit 1 } + +#define __present(arg) ((arg) != "" || (arg) != 0) + +#if __egawk__ +#define __let(...) @let (__VA_ARGS__) +#define __have_let 1 +#else +#define __let(...) +#endif + +#if __gawk__ +#define __have_switch 1 +#if __gawk_ver >= 040000 || __egawk__ +#define __have_indirect_functions 1 +#endif +#endif + +#endif diff --git a/share/cppawk/include/case-priv.h b/share/cppawk/include/case-priv.h new file mode 100644 index 0000000..825ed1b --- /dev/null +++ b/share/cppawk/include/case-priv.h @@ -0,0 +1,93 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_CASE_PRIV_H +#define __CPPAWK_CASE_PRIV_H + +#ifndef __CPPAWK_NARG_PRIV +#include "narg-priv.h" +#endif + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#if __have_switch + +#define __ca_first(x) case x: +#define __ca_next(p, x) p case x: + +#define __mx_first(x) __of(x) +#define __mx_next(p, x) p case x: + +#define __case_temps __ign +#define __case(expr) switch (expr) +#define __of(...) __varexpand(__ca_first, __ca_next, __VA_ARGS__) {{{ +#define __matching(...) __varexpand(__ca_first, __ca_next, __VA_ARGS__) {{{ +#define __mixed(x, y) __varexpand(__ca_first, __ca_next, __splice(x)) \ + __varexpand(__ca_first, __ca_next, __splice(y)) {{{ +#define __cbreak break; }}} +#define __cfall }}} +#define __cret(val) return val; }}} +#define __otherwise default: {{{ + +#else + +#define __clause(expr) if (__pass || (expr) && (__pass = 1)) +#define __of_first(x) (__val == (x)) +#define __of_next(p, x) p || (__val == (x)) +#define __mtch_first(x) (__val ~ (x)) +#define __mtch_next(p, \ + x) p || (__val ~ (x)) + +#if !__have_let +#define __case_temps __val, __once, __pass +#else +#define __case_temps __ign +#endif + +#define __case(expr) __let (__val, __once, __pass) \ + for ((__once = 1) && (__pass = 0) || (__val = expr); \ + __once; \ + __once = 0) +#define __of(...) __clause(__varexpand(__of_first, __of_next, \ + __VA_ARGS__)) {{{ +#define __matching(...) __clause(__varexpand(__mtch_first, mtch_next, \ + __VA_ARGS__)) {{{ +#define __mixed(x, y) __clause(__varexpand(__of_first, __of_next, \ + __splice(x)) || \ + __varexpand(__mtch_first, __mtch_next, \ + __splice(y))) {{{ +#define __cbreak break; }}} +#define __creturn(val) return val; }}} +#define __cfall }}} +#define __cret(val) return val; }}} +#define __otherwise if (__pass = 1) {{{ + +#endif + +#endif diff --git a/share/cppawk/include/case.h b/share/cppawk/include/case.h new file mode 100644 index 0000000..d5ed331 --- /dev/null +++ b/share/cppawk/include/case.h @@ -0,0 +1,46 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_CASE_H +#define __CPPAWK_CASE_H + +#ifndef __CPPAWK_CASE_PRIV_H +#include "case-priv.h" +#endif + +#define case_temps __case_temps +#define case(expr) __case(expr) +#define of(...) __of(__VA_ARGS__) +#define matching(...) __matching(__VA_ARGS__) +#define mixed(...) __mixed(__VA_ARGS__) +#define cbreak __cbreak +#define cfall __cfall +#define cret(val) __cret(val) +#define then __do +#define otherwise __otherwise + +#endif diff --git a/share/cppawk/include/cons-priv.h b/share/cppawk/include/cons-priv.h new file mode 100644 index 0000000..172f20f --- /dev/null +++ b/share/cppawk/include/cons-priv.h @@ -0,0 +1,906 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_CONS_PRIV_H +#define __CPPAWK_CONS_PRIV_H + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#ifndef __CPPAWK_ITER_PRIV_H +#include "iter-priv.h" +#endif + +#ifndef __CPPAWK_CASE_PRIV_H +#include "case-priv.h" +#endif + +#ifndef __CPPAWK_NARG_PRIV_H +#include "narg-priv.h" +#endif + +#if __have_indirect_functions +#ifndef __CPPAWK_FUN_PRIV_H +#include "fun-priv.h" +#endif +#endif + +#define __nil "" + +#define __prog_first(expr) ((expr) || 1) +#define __prog_next(prev, \ + expr) prev && ((expr) || 1) +#define __prog(...) (__varexpand(__prog_first, __prog_next, \ + __VA_ARGS__)) + +#define __progn_first(expr) (expr) +#define __progn_next(prev, \ + next) ((prev || 1) ? (next) : 0) +#define __progn(...) __varexpand(__progn_first, __progn_next, \ + __VA_ARGS__) + +#define __or_first(expr) (expr) +#define __or_next(prev, \ + next) ((__g(or) = prev) ? __g(or) : (next)) +#define __or(...) __varexpand(__or_first, __or_next, \ + __VA_ARGS__) + +#define __and_first(expr) (expr) +#define __and_next(prev, \ + next) ((__g(and) = prev) ? next : __g(and)) +#define __and(...) __varexpand(__and_first, __and_next, \ + __VA_ARGS__) + + +#define __push(item, list) (list = __cons(item, list)) + +#define __pop(list) (__progn(__g(ol) = (list), \ + list = __cdr(__g(ol)), \ + __car(__g(ol)))) + +#define __dolist(item, list) \ + for (__g(i) = list; \ + !__endp(__g(i)) && ((item = __car(__g(i))) || 1); \ + __g(i) = __cdr(__g(i))) + +#define __dolisti(item, index, list) \ + for (__prog(__g(i) = list, index = 0); \ + !__endp(__g(i)) && ((item = __car(__g(i))) || 1); \ + __prog(__g(i) = __cdr(__g(i)), index++)) + +#define __doconses(iter, list) \ + for (iter = list; __consp(iter); iter = __cdr(iter)) + +#define __list_begin() "" +#define __list_add(stk, item) __pack(stk, item) +#define __list_end(stk) __unpack(stk, __nil) +#define __list_end_atom(stk, atom) __unpack(stk, atom) + +#define __bag_init_first(x) (x = __list_begin()) +#define __bag_init_next(p, x) (p || 1) && __bag_init_first(x) + +#define __bag_done_first(x) (x = __list_end(x)) +#define __bag_done_next(p, x) (p || 1) && __bag_done_first(x) + +#define __bags(...) for ((__g(once) = 1) && \ + __varexpand(__bag_init_first, \ + __bag_init_next, \ + __VA_ARGS__); \ + __g(once) || \ + __varexpand(__bag_done_first, \ + __bag_done_next, \ + __VA_ARGS__) && 0; \ + __g(once) = 0) +#define __bag(bag, expr) bag = __list_add(bag, expr) + +#define __typecode(obj) (substr(obj, 1, 1)) + +function __consp(__obj) +{ + return __typecode(__obj) == "C" +} +#define __consp(obj) (__typecode(obj) == "C") + +function __atom(__obj) +{ + return __typecode(__obj) != "C" +} +#define __atom(obj) (__typecode(obj) != "C") + +function __null(__obj) +{ + return __obj == __nil && __obj != 0 +} + +function __endp(__obj) +{ + if (__obj == __nil && __obj != 0) + return 1 + if (__consp(__obj)) + return 0 + __error("endp: a proper list ends with nil, not %s", __obj) +} + +function __bs_esc(raw) +{ + gsub(/[\\\042]/, "\\\\&", raw) + return raw +} + +function __numberp(__obj) +{ + return __obj != "" && (__obj == 0 || __obj + 0 != 0) +} +#define __numberp(obj) (obj != "" && ((obj) == 0 || (obj) + 0 != 0)) + +function __stringp(__obj) +{ + return __typecode(__obj) == "T" +} +#define __stringp(obj) (__typecode(obj) == "T") + +function __symbolp(__obj) +{ + return __obj != 0 && __typecode(__obj) ~ /^S?$/ +} + +function __box(__raw, + __check, + __case_temps) +{ + if (!__present(__raw)) + return "U"; + + if (__present(__check)) + __error("box; excess argument %s", __check) + + if (__numberp(__raw)) + return __raw; + + return "T" __raw; +} + +function __unbox(__obj, + __check, + __case_temps) +{ + if (!__present(__obj)) + __error("unbox: missing or undefined argument") + + if (__present(__check)) + __error("unbox; excess argument %s", __check) + + __case (__typecode(__obj)) { + __of ("T", "S") + __cret (substr(__obj, 2)) + __of ("C") + __error("unbox: %s looks like a cons", __obj) + __cbreak + __of ("U") + __cret(__check) + __of ("") + __cret("nil") + __otherwise + if (!__numberp(__obj)) + __error("unbox: %s isn't symbol, number or boxed string", __obj) + __cret (__obj) + } +} + +function __box_str(__str) +{ + return "T" __str +} +#define __box_str(str) ("T" (str)) + +function __box_sym(__name) +{ + return __name == "nil" ? __nil : "S" __name +} + +function __cons(__a, __d) +{ + return "C" length(__a) "," length(__d) ":" __a __d +} + +function __car(__cell, + __col, __com, len) +{ + if (__consp(__cell)) { + __col = match(__cell, /:/) + __com = match(__cell, /,/) + if (__col == 0 || __com == 0 || __col <= __com) + __error("car: %s has a malformed cons header", __cell) + len = substr(__cell, 2, __com - 2 + 1) + return substr(__cell, __col + 1, len) + } else if (__null(__cell)) { + return __nil + } else { + __error("car: %s isn't a cons", __cell) + } +} + +function __cdr(__cell, + __col, __com, __alen, __dlen) +{ + if (__consp(__cell)) { + __col = match(__cell, /:/) + __com = match(__cell, /,/) + if (__col == 0 || __com == 0 || __col <= __com) + __error("cdr: %s has a malformed cons header", __cell) + __alen = substr(__cell, 2, __com - 2 + 1) + __dlen = substr(__cell, __com + 1, __col - __com) + return substr(__cell, __col + 1 + __alen, __dlen) + } else if (__null(__cell)) { + return __nil + } else { + __error("cdr: %s isn't a cons", __cell) + } +} + +function __sexp(__obj, + __d, __x, __y, __case_temps) +{ + if (!__present(__obj)) + __error("sexp: missing or undefined argument") + + __case (__typecode(__obj)) { + __of ("C") + __d = __cdr(__obj) + __x = __sexp(__car(__obj)) + if (__null(__d)) { + return "(" __x ")" + } else { + __y = __sexp(__d) + if (__typecode(__d) == "C") + return "(" __x " " substr(__y, 2) + else + return "(" __x " . " __y ")" + } + __cbreak + __of ("T") + __cret ("\"" __bs_esc(substr(__obj, 2)) "\"") + __of ("S") + __cret (__bs_esc(substr(__obj, 2))) + __of ("U") + __cret ("#U") + } + + if (__numberp(__obj)) { + return __obj + } else if (__null(__obj)) { + return "nil" + } else { + return "\"" __bs_esc(__obj) "\"" + } +} + +function __reverse(__lst, + __tmp) +{ + __tmp = __nil + + while (!__endp(__lst)) { + __push(__car(__lst), __tmp); + __lst = __cdr(__lst); + } + + return __tmp; +} + +function __values(__arr, + __tmp, __key, __value) +{ + __tmp = __list_begin() + + __doarray (__key, __value, __arr) + __tmp = __list_add(__tmp,__value) + + return __list_end(__tmp) +} + +function __keys(__array, + __key, __tmp) +{ + __tmp = __list_begin() + + for (__key in __array) + __tmp = __list_add(__tmp, __key) + + return __list_end(__tmp) +} + + +function __fields(__start, __count, + __tmp, __end, __val) +{ + if (!__present(__start)) + __start = 1 + + if (!__present(__count)) + __count = NF - __start + 1 + + if (__count < 1) + return __nil + + __end = __start + __count - 1 + + if (__end > NF) + __end = NF + + if (__start < 1) + __start = 1 + + if (__start > __end) + return __nil + + __tmp = __list_begin() + + for (; __start <= __end; __start++) + __tmp = __list_add(__tmp, $(__start)) + + return __list_end(__tmp) +} + +function __set_fields(__lst, __start, + __tmp, __item, __n) +{ + if (!__present(__start)) + __start = 1 + + __dolisti (__item, __n, __lst) + $(__n + __start) = __item + + NF = __n + __start - 1 + + return __n +} + +function __equal(__obj1, __obj2) +{ + if (__obj1 == __obj2) + return 1; + return __slow_equal(__obj1, __obj2) +} +#define __equal(obj1, obj2) ((obj1) == (obj2) ? 1 : __slow_equal(obj1, obj2)) + +function __slow_equal(__obj1, __obj2, + __tc1, __tc2, __case_temps) +{ + __tc1 = __typecode(__obj1) + __tc2 = __typecode(__obj2) + + __case (__tc1 __tc2) { + __of ("CC") + __cret (__equal(__car(__obj1), __car(__obj2)) && + __equal(__cdr(__obj1), __cdr(__obj2))) + __matching (/[UTSC][UTSC]/) + __cret (0); + } + + if (__tc1 == "T") + return __numberp(__obj2) ? 0 : (__obj1 == __box_str(__obj2)) + + if (__tc2 == "T") + return __numberp(__obj1) ? 0 : (__box_str(__obj1) == __obj2) + + if (__numberp(__obj1) && __numberp(__obj2)) + return __obj1 + 0 == __obj2 + 0 + + return 0 +} + +function __equalize(__obj, + __tc, __str) +{ + if (!__present(__obj)) + return "" + + __tc = __typecode(__obj) + + __case (__tc) { + __of("C") + __cret (__cons(__equalize(__car(__obj)), + __equalize(__cdr(__obj)))) + __of("T", "S", "U", "") + __cret (__obj) + } + + if (__numberp(__obj)) + return __obj + 0 + + return __box_str(__obj) +} + +function __pack(__stk, __item) +{ + return length(__item) ":" __item __stk +} + +function __unpack(__stk, __out, + __col) +{ + while (__stk != "") { + __col = match(__stk, /:/) + if (__col == 0) + break; + __push(substr(__stk, __col + 1, __stk), __out) + __stk = substr(__stk, __col + 1 + __stk); + } + + return __out +} + +#ifndef __CPPAWK_VARG_PRIV_H +#include "varg-priv.h" +#endif + +function __list(__rest, + __check) +{ + return __arglist("list", __rest, __check) +} +#define __list_first(item) __cons(item, __nil) +#define __list_next(list, item) __cons(item, list) +#define __li(...) __varexpand(__list_first, \ + __list_next, \ + __revarg(__VA_ARGS__)) + +#define __listar_first(item) item +#define __listar(...) __varexpand(__listar_first, \ + __list_next, \ + __revarg(__VA_ARGS__)) + +function __append2(__left, __right, + tmp) +{ + tmp = __reverse(__left) + while (!__endp(tmp)) + __right = __cons(__pop(tmp), __right) + return __right +} + +function __append(__rest, + __count, __out) +{ + __varg_count("append", __count, __count) + __out = __nil + __case (__count) { + __of (32) + __out = __r32 + __cbreak + __of (31) + __out = __r31 + __cbreak + __of (30) + __out = __r30 + __cbreak + __of (29) + __out = __r29 + __cbreak + __of (28) + __out = __r28 + __cbreak + __of (27) + __out = __r27 + __cbreak + __of (26) + __out = __r26 + __cbreak + __of (25) + __out = __r25 + __cbreak + __of (24) + __out = __r24 + __cbreak + __of (23) + __out = __r23 + __cbreak + __of (22) + __out = __r22 + __cbreak + __of (21) + __out = __r21 + __cbreak + __of (20) + __out = __r20 + __cbreak + __of (19) + __out = __r19 + __cbreak + __of (18) + __out = __r18 + __cbreak + __of (17) + __out = __r17 + __cbreak + __of (16) + __out = __r16 + __cbreak + __of (15) + __out = __r15 + __cbreak + __of (14) + __out = __r14 + __cbreak + __of (13) + __out = __r13 + __cbreak + __of (12) + __out = __r12 + __cbreak + __of (11) + __out = __r11 + __cbreak + __of (10) + __out = __r10 + __cbreak + __of (9) + __out = __r9 + __cbreak + __of (8) + __out = __r8 + __cbreak + __of (7) + __out = __r7 + __cbreak + __of (6) + __out = __r6 + __cbreak + __of (5) + __out = __r5 + __cbreak + __of (4) + __out = __r4 + __cbreak + __of (3) + __out = __r3 + __cbreak + __of (2) + __out = __r2 + __cbreak + __of (1) + __out = __r1 + __cbreak + } + __case (__count - 1) { + __of (31) + __out = __append2(__r31, __out) + __cfall + __of (30) + __out = __append2(__r30, __out) + __cfall + __of (29) + __out = __append2(__r29, __out) + __cfall + __of (28) + __out = __append2(__r28, __out) + __cfall + __of (27) + __out = __append2(__r27, __out) + __cfall + __of (26) + __out = __append2(__r26, __out) + __cfall + __of (25) + __out = __append2(__r25, __out) + __cfall + __of (24) + __out = __append2(__r24, __out) + __cfall + __of (23) + __out = __append2(__r23, __out) + __cfall + __of (22) + __out = __append2(__r22, __out) + __cfall + __of (21) + __out = __append2(__r21, __out) + __cfall + __of (20) + __out = __append2(__r20, __out) + __cfall + __of (19) + __out = __append2(__r19, __out) + __cfall + __of (18) + __out = __append2(__r18, __out) + __cfall + __of (17) + __out = __append2(__r17, __out) + __cfall + __of (16) + __out = __append2(__r16, __out) + __cfall + __of (15) + __out = __append2(__r15, __out) + __cfall + __of (14) + __out = __append2(__r14, __out) + __cfall + __of (13) + __out = __append2(__r13, __out) + __cfall + __of (12) + __out = __append2(__r12, __out) + __cfall + __of (11) + __out = __append2(__r11, __out) + __cfall + __of (10) + __out = __append2(__r10, __out) + __cfall + __of (9) + __out = __append2(__r9, __out) + __cfall + __of (8) + __out = __append2(__r8, __out) + __cfall + __of (7) + __out = __append2(__r7, __out) + __cfall + __of (6) + __out = __append2(__r6, __out) + __cfall + __of (5) + __out = __append2(__r5, __out) + __cfall + __of (4) + __out = __append2(__r4, __out) + __cfall + __of (3) + __out = __append2(__r3, __out) + __cfall + __of (2) + __out = __append2(__r2, __out) + __cfall + __of (1) + __out = __append2(__r1, __out) + __cfall + } + + return __out +} + +function __member(__item, __lst) +{ + while (!__endp(__lst)) { + if (__equal(__item, __car(__lst))) + return __lst; + __lst = __cdr(__lst) + } + + return __nil +} + +function __position(__item, __lst, + __pos) +{ + for (__pos = 0; !__endp(__lst); __pos++) { + if (__equal(__item, __car(__lst))) + return __pos; + __lst = __cdr(__lst) + } + + return __nil +} + +function __nth(__pos, __lst) +{ + for (; __pos > 0 && !__endp(__lst); __pos--) + __lst = __cdr(__lst) + return __pos == 0 ? __car(__lst) : __nil +} + +function __nthcdr(__pos, __lst) +{ + for (; __pos > 0 && !__endp(__lst); __pos--) + __lst = __cdr(__lst) + return __lst +} + +function __ldiff(__main, __tail, + __out, __iter) +{ + if (__null(__main)) + return __nil + + if (__null(__tail)) + return __main + + __out = __list_begin() + + __doconses (__iter, __main) { + if (__iter == __tail) + break + __out = __list_add(__out, __car(__iter)) + } + + if (__atom(__iter) && __iter != __tail) + return __list_end_atom(__out, __iter) + + return __list_end(__out) +} + +function __last(__lst, __n, + __circbuf, __i) +{ + if (!__present(__n)) + __n = 1 + else if (__n < 0) + __error("last: number argument %s must be non-negative", __n) + + if (__n == 0) { + __doconses (__iter, __lst) + ; // nothing + return __iter + } + + delete __circbuf + + __i = 0 + + __n++ + + __doconses (__iter, __lst) + __circbuf[__i++ % __n] = __iter + + __i = (__i + 1) % __n + + return (__i in __circbuf) ? __circbuf[__i] : __lst +} + +function __butlast(__lst, __n, + __circbuf, __i, __out) +{ + if (!__present(__n)) + __n = 1 + else if (__n < 0) + __error("butlast: number argument %s must be non-negative", __n) + + __out = __list_begin() + + if (__n == 0) { + __doconses (__iter, __lst) + __out = __list_add(__out, __car(__iter)) + return __list_end(__out) + } + + delete __circbuf + + __i = 0 + + __n++ + + __doconses (__iter, __lst) { + __circbuf[__i++ % __n] = __out + __out = __list_add(__out, __car(__iter)) + } + + __i = (__i + 1) % __n + + return (__i in __circbuf) ? __list_end(__circbuf[__i]) : __nil +} + +function __iota(__from, __to, __delta, + __out, __i, __val) +{ + __out = __list_begin(); + + if (__from < __to) { + if (!__present(__delta)) + __delta = 1 + + if (__delta <= 0) + return __nil; + + __i = 0 + __val = __from + + while (__val <= __to) { + __out = __list_add(__out, __val) + __i++ + __val = __from + (__i * __delta) + } + } else if (__from > __to) { + if (!__present(__delta)) + __delta = -1 + + if (__delta >= 0) + return __nil; + + __i = 0 + __val = __from + + while (__val >= __to) { + __out = __list_add(__out, __val) + __i++ + __val = __from + (__i * __delta) + } + } else { + return __list(__from) + } + + return __list_end(__out) +} + +function __uniq(__lst, + __out, __item, __seen) +{ + __out = __list_begin(); + + __dolist(__item, __lst) { + if (__item in __seen) + continue + __seen[__item] + __out = __list_add(__out, __item) + } + + return __list_end(__out) +} + +function __uniqual(__lst, + __out, __item, __itemeq, __seen) +{ + __out = __list_begin(); + + __dolist(__item, __lst) { + __itemq = __equalize(__item) + if (__itemq in __seen) + continue + __seen[__itemq] + __out = __list_add(__out, __item) + } + + return __list_end(__out) +} + + +#if __have_indirect_functions + +function __mapcar(__fun, __lst, + __temp, __item, out) +{ + __temp = __list_begin() + __dolist(__item, __lst) + __temp = __list_add(__temp, __call(__fun, __item)) + return __list_end(__temp) +} + +function __mappend(__fun, __lst, + __temp, __item, out) +{ + __temp = __nil + __dolist(__item, __lst) + __temp = __append2(__temp, __call(__fun, __item)) + return __temp +} + +#endif + +#endif diff --git a/share/cppawk/include/cons.h b/share/cppawk/include/cons.h new file mode 100644 index 0000000..f120c0c --- /dev/null +++ b/share/cppawk/include/cons.h @@ -0,0 +1,92 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_CONS_H +#define __CPPAWK_CONS_H + +#ifndef __CPPAWK_CONS_PRIV_H +#include "cons-priv.h" +#endif + +#define nil __nil +#define prog(...) __prog(__VA_ARGS__) +#define progn(...) __progn(__VA_ARGS__) +#define or(...) __or(__VA_ARGS__) +#define and(...) __and(__VA_ARGS__) +#define push(item, list) __push(item, list) +#define pop(list) __pop(list) +#define dolist(item, list) __dolist(item, list) +#define dolisti(item, index, list) __dolisti(item, index, list) +#define doconses(iter, list) __doconses(iter, list) +#define list_begin() __list_begin() +#define list_add(stk, item) __list_add(stk, item) +#define list_end(stk) __list_end(stk) +#define list_end_atom(stk, atom) __list_end_atom(stk, atom) +#define bags(...) __bags(__VA_ARGS__) +#define bag(bag, expr) __bag(bag, expr) +#define consp __consp +#define atom __atom +#define null __null +#define endp __endp +#define false __false +#define true __true +#define numberp __numberp +#define stringp __stringp +#define symbolp __symbolp +#define box __box +#define unbox __unbox +#define box_str __box_str +#define box_sym __box_sym +#define cons __cons +#define car __car +#define cdr __cdr +#define sexp __sexp +#define reverse __reverse +#define values __values +#define keys __keys +#define fields __fields +#define set_fields __set_fields +#define equal __equal +#define equalize __equalize +#define list __list +#define li __li +#define listar __listar +#define append __append +#define member __member +#define position __position +#define nth __nth +#define nthcdr __nthcdr +#define ldiff __ldiff +#define last __last +#define butlast __butlast +#define iota __iota +#define uniq __uniq +#define uniqual __uniqual +#define mapcar __mapcar +#define mappend __mappend + +#endif diff --git a/share/cppawk/include/field.h b/share/cppawk/include/field.h new file mode 100644 index 0000000..a18000d --- /dev/null +++ b/share/cppawk/include/field.h @@ -0,0 +1,88 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_FIELD_H +#define __CPPAWK_FIELD_H + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#ifndef __CPPAWK_NARG_PRIV_H +#include "narg-priv.h" +#endif + +function delf(__at, __count, + __i, __j) +{ + if (!__present(__count)) + __count = 1 + + if (0 < __count && 1 <= __at && __at <= NF) { + __i = __at + __j = __at + __count + + while (__j <= NF) + $(__i++) = $(__j++) + + NF = __i - 1; + } +} + +function __insf(__at, __count, + __i, __j) +{ + if (!__present(__count)) + __count = 1 + + if (NF < __at) + NF = __at - 1 + + if (0 < __count && 1 <= __at) { + __i = NF + __count + __j = NF + + NF = __i + + while (__j >= __at) + $(__i--) = $(__j--) + return 1 + } + + return 0 +} + +#define __insf_first(arg, n, at) $(at + n - 1) = arg +#define __insf_next(prev, arg, n, at) prev; $(at + n - 1) = arg + +#define insf(at, ...) { \ + if (__insf(at, __narg(__VA_ARGS__))) { \ + __variaexpand(__insf_first, __insf_next, at, __VA_ARGS__); \ + } \ +} + +#endif diff --git a/share/cppawk/include/fun-priv.h b/share/cppawk/include/fun-priv.h new file mode 100644 index 0000000..0f92a44 --- /dev/null +++ b/share/cppawk/include/fun-priv.h @@ -0,0 +1,50 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_FUN_PRIV_H +#define __CPPAWK_FUN_PRIV_H + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#ifndef __CPPAWK_CONS_H +#include "cons-priv.h" +#endif + +#if !__have_indirect_functions +#warning " requires an Awk with function indirection like newer GNU Awk" +#endif + +#define __bind(fname, env) __cons(__xstr(fname), env) +#define __fun_(fname) __xstr(fname) +#define __call(fobj, ...) (__consp(fobj) \ + ? __progn(__g(f) = __car(fobj), \ + @__g(f)(__cdr(fobj), ## __VA_ARGS__)) \ + : @fobj(__VA_ARGS__)) + +#endif diff --git a/share/cppawk/include/fun.h b/share/cppawk/include/fun.h new file mode 100644 index 0000000..6600609 --- /dev/null +++ b/share/cppawk/include/fun.h @@ -0,0 +1,39 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_FUN_H +#define __CPPAWK_FUN_H + +#ifndef __CPPAWK_FUN_PRIV_H +#include "fun-priv.h" +#endif + +#define bind(fname, env) __bind(fname, env) +#define fun(fname) __fun_(fname) +#define call(...) __call(__VA_ARGS__) + +#endif diff --git a/share/cppawk/include/iter-priv.h b/share/cppawk/include/iter-priv.h new file mode 100644 index 0000000..946c874 --- /dev/null +++ b/share/cppawk/include/iter-priv.h @@ -0,0 +1,45 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_ITER_PRIV_H +#define __CPPAWK_ITER_PRIV_H + +#define __doarray(key, value, arr) \ + for (key in arr) \ + if ((value = arr[key]) || 1) + +#define __dostring(index, chr, str) \ + __g(s) = str; \ + __g(l) = length(__g(s)); \ + for (index = 1; index <= __g(l); i++) \ + if ((chr = substr(__g(s), index, 1)) || 1) + +#define __dofields(index, val) \ + for (index = 1; index <= NF; index++) \ + if ((val = $ index) || 1) + +#endif diff --git a/share/cppawk/include/iter.h b/share/cppawk/include/iter.h new file mode 100644 index 0000000..53bb43f --- /dev/null +++ b/share/cppawk/include/iter.h @@ -0,0 +1,329 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_ITER_H +#define __CPPAWK_ITER_H + +#ifndef __CPPAWK_ITER_PRIV_H +#include "iter-priv.h" +#endif + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#ifndef __CPPAWK_NARG_PRIV_H +#include "narg-priv.h" +#endif + +#ifndef __CPPAWK_CONS_PRIV_H +#include "cons-priv.h" +#endif + +#define doarray(key, value, arr) __doarray(key, value, arr) +#define dostring(index, chr, str) __dostring(index, chr, str) +#define dofields(index, val) __dofields(index, val) + +#define loop(...) __loop_temp(__VA_ARGS__) \ + for (__loop_init(__VA_ARGS__); \ + (__loop_test(__VA_ARGS__) || \ + __loop_fini(__VA_ARGS__)) && \ + __loop_prep(__VA_ARGS__); \ + __loop_step(__VA_ARGS__)) + +#if __have_let +#define __loop_temp(...) __let(__varexpand(__temp_first, __temp_next, \ + __VA_ARGS__)) +#else +#define __loop_temp(...) +#endif + +#define __loop_init(...) __prog(__varexpand(__init_first, __init_next, \ + __VA_ARGS__)) +#define __loop_test(...) __nd(__varexpand(__test_first, __test_next, \ + __VA_ARGS__)) +#define __loop_prep(...) __prog(__varexpand(__prep_first, __prep_next, \ + __VA_ARGS__)) +#define __loop_fini(...) __prog(__varexpand(__fini_first, __fini_next, \ + __VA_ARGS__)) && 0 +#define __loop_step(...) __prog(__varexpand(__step_first, __step_next, \ + __VA_ARGS__)) + +#define __nd(...) __varexpand(__nd_first, __nd_next, __VA_ARGS__) +#define __nd_first(x) (x) +#define __nd_next(p, x) p && (x) + +#define loop_nest(...) __varexpand2(__cross_first, __cross_next, __VA_ARGS__) + +#define __cross_first(args) for (__init_ ## args; \ + ((__test_ ## args) || \ + (__fini_ ## args) && 0) && \ + __prep_ ## args; \ + __step_ ## args) +#define __cross_next(prev, args) prev __cross_first(args) + +#define __temp_first(args) __temp_ ## args +#define __temp_next(prev, args) prev __temp_ ## args + +#define __init_first(args) __init_ ## args +#define __init_next(prev, args) prev, __init_ ## args + +#define __test_first(args) __test_ ## args +#define __test_next(prev, args) prev, __test_ ## args + +#define __prep_first(args) __prep_ ## args +#define __prep_next(prev, args) prev, __prep_ ## args + +#define __fini_first(args) __fini_ ## args +#define __fini_next(prev, args) prev, __fini_ ## args + +#define __step_first(args) __step_ ## args +#define __step_next(prev, args) prev, __step_ ## args + +#define __str_s __g(ch) +#define __str_len __g(idx) +#define __temp_str(idx, ch, str) __str_s, __str_len, +#define __init_str(idx, ch, str) __str_s = (str), __str_len = length(__str_s), idx = 1 +#define __test_str(idx, ch, str) idx <= __str_len +#define __prep_str(idx, ch, str) ch = substr(__str_s, idx, 1) +#define __fini_str(idx, ch, str) 1 +#define __step_str(idx, ch, str) idx++ + +#define __temp_range(idx, from, to) +#define __init_range(idx, from, to) idx = (from) +#define __test_range(idx, from, to) idx <= (to) +#define __prep_range(idx, from, to) 1 +#define __fini_range(idx, from, to) 1 +#define __step_range(idx, from, to) idx++ + +#define __temp_range_step(idx, from, to, step) +#define __init_range_step(idx, from, to, step) idx = (from) +#define __test_range_step(idx, from, to, step) idx <= (to) +#define __prep_range_step(idx, from, to, step) 1 +#define __fini_range_step(idx, from, to, step) 1 +#define __step_range_step(idx, from, to, step) idx += (step) + +#define __temp_from(idx, from) +#define __init_from(idx, from) idx = (from) +#define __test_from(idx, from) 1 +#define __prep_from(idx, from) 1 +#define __fini_from(idx, from) 1 +#define __step_from(idx, from) idx++ + +#define __temp_from_step(idx, from, step) +#define __init_from_step(idx, from, step) idx = (from) +#define __test_from_step(idx, from, step) 1 +#define __prep_from_step(idx, from, step) 1 +#define __fini_from_step(idx, from, step) 1 +#define __step_from_step(idx, from, step) idx += (step) + +#define __temp_first_then(var, first, then) +#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 __temp_list(iter, var, list) +#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) +#define __fini_list(iter, var, list) 0 +#define __step_list(iter, var, list) iter = __cdr(iter) +#define __temp___list(iter, var, list) +#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) +#define __fini___list(iter, var, list) 0 +#define __step___list(iter, var, list) iter = __cdr(iter) + +#define __temp_fields(var) __g(var), +#define __init_fields(var) __g(var) = 1 +#define __test_fields(var) __g(var) <= NF +#define __prep_fields(var) var = $ __g(var) +#define __fini_fields(var) 1 +#define __step_fields(var) __g(var)++ +#define __temp___fields(var) __g(var), +#define __init___fields(var) __g(var) = 1 +#define __test___fields(var) __g(var) <= NF +#define __prep___fields(var) var = $ __g(var) +#define __fini___fields(var) 1 +#define __step___fields(var) __g(var)++ + + +#define __temp_keys(key, array) __g(key), +#define __init_keys(key, array) __g(key) = __keys(array) +#define __test_keys(key, array) !__endp(__g(key)) +#define __prep_keys(key, array) key = __car(__g(key)) +#define __fini_keys(key, array) 1 +#define __step_keys(key, array) __g(key) = __cdr(__g(key)) +#define __temp___keys(key, array) __g(key), +#define __init___keys(key, array) __g(key) = __keys(array) +#define __test___keys(key, array) !__endp(__g(key)) +#define __prep___keys(key, array) key = __car(__g(key)) +#define __fini___keys(key, array) 1 +#define __step___keys(key, array) __g(key) = __cdr(__g(key)) + +#define __temp_collect(var, expr) +#define __init_collect(var, expr) var = __list_begin() +#define __test_collect(var, expr) 1 +#define __prep_collect(var, expr) var = __list_add(var, expr) +#define __fini_collect(var, expr) var = __list_end(var) +#define __step_collect(var, expr) 1 + +#define __temp_collect_plus(var, expr) +#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 __temp_summing(var, expr) +#define __init_summing(var, expr) var = 0 +#define __test_summing(var, expr) 1 +#define __prep_summing(var, expr) var += (expr) +#define __fini_summing(var, expr) 1 +#define __step_summing(var, expr) 1 + +function __loop_max(a, b) +{ + return a > b ? a : b +} + +#define __temp_maximizing(var, expr) +#define __init_maximizing(var, expr) var = nil +#define __test_maximizing(var, expr) 1 +#define __prep_maximizing(var, expr) var = (__null(var) \ + ? expr \ + : __loop_max(var, expr)) +#define __fini_maximizing(var, expr) 1 +#define __step_maximizing(var, expr) 1 + +function __loop_min(a, b) +{ + return a > b ? b : a +} + +#define __temp_minimizing(var, expr) +#define __init_minimizing(var, expr) var = nil +#define __test_minimizing(var, expr) 1 +#define __prep_minimizing(var, expr) var = (__null(var) \ + ? expr \ + : __loop_min(var, expr)) +#define __fini_minimizing(var, expr) 1 +#define __step_minimizing(var, expr) 1 + +function __loop_argmax(a, arga, b, argb) +{ + return a > b ? arga : argb; +} + +#define __ami(v) __gx(v, _max) +#define __amx(v) __gx(v, _min) +#define __amo(v) __gx(v, _old) + +#define __temp_argmax(am, arg, expr) __amx(am), __amo(am), +#define __init_argmax(am, arg, expr) (__amx(am) = __nil) || (am = __nil) +#define __test_argmax(am, arg, expr) 1 +#define __prep_argmax(am, arg, expr) ((__amo(am) = __amx(am)) || 1) && \ + ((__amx(am) = \ + (__null(__amx(am)) \ + ? expr \ + : __loop_max(__amx(am), \ + expr))) || 1) && \ + ((__amo(am) != __amx(am)) ? am = arg : 1) +#define __fini_argmax(am, arg, expr) 1 +#define __step_argmax(am, arg, expr) 1 + +function __loop_argmin(a, arga, b, argb) +{ + return a < b ? arga : argb; +} + +#define __temp_argmin(am, arg, expr) __ami(am), __amo(am), +#define __init_argmin(am, arg, expr) (__ami(am) = __nil) || (am = __nil) +#define __test_argmin(am, arg, expr) 1 +#define __prep_argmin(am, arg, expr) ((__amo(am) = __ami(am)) || 1) && \ + ((__ami(am) = \ + (__null(__ami(am)) \ + ? expr \ + : __loop_min(__ami(am), \ + expr))) || 1) && \ + ((__amo(am) != __ami(am)) ? am = arg : 1) +#define __fini_argmin(am, arg, expr) 1 +#define __step_argmin(am, arg, expr) 1 + +#define __temp_counting(var, expr) +#define __init_counting(var, expr) var = 0 +#define __test_counting(var, expr) 1 +#define __prep_counting(var, expr) (expr) ? var++ : 1 +#define __fini_counting(var, expr) 1 +#define __step_counting(var, expr) 1 + +#define __temp_while(expr) +#define __init_while(expr) 1 +#define __test_while(expr) expr +#define __prep_while(expr) 1 +#define __fini_while(expr) 1 +#define __step_while(expr) 1 + +#define __temp_until(expr) +#define __init_until(expr) 1 +#define __test_until(expr) !(expr) +#define __prep_until(expr) 1 +#define __fini_until(expr) 1 +#define __step_until(expr) 1 + +#define __temp_parallel(...) +#define __init_parallel(...) __prog(__varexpand3(__init_first, __init_next, \ + __VA_ARGS__)) +#define __test_parallel(...) __nd(__varexpand3(__test_first, __test_next, \ + __VA_ARGS__)) +#define __prep_parallel(...) (__nd(__varexpand3(__prep_first, __prep_next, \ + __VA_ARGS__)) || 1) +#define __fini_parallel(...) (__nd(__varexpand3(__fini_first, __fini_next, \ + __VA_ARGS__)) && 0) +#define __step_parallel(...) __prog(__varexpand3(__step_first, __step_next, \ + __VA_ARGS__)) + +#define __temp_if(test, clause) +#define __init_if(test, clause) __init_ ## clause +#define __test_if(test, clause) !(test) || __test_ ## clause +#define __prep_if(test, clause) (test) && __prep_ ## clause +#define __fini_if(test, clause) __fini_ ## clause +#define __step_if(test, clause) (test) && __step_ ## clause + +#define __temp_records(file) __g(stream) +#define __init_records(file) __g(stream) = file +#define __test_records(file) (getline < __g(stream)) > 0 +#define __prep_records(file) 1 +#define __fini_records(file) __g(stream) != "-" ? close(__g(stream)) : 1 +#define __step_records(file) 1 + +#endif diff --git a/share/cppawk/include/narg-priv.h b/share/cppawk/include/narg-priv.h new file mode 100644 index 0000000..bee5300 --- /dev/null +++ b/share/cppawk/include/narg-priv.h @@ -0,0 +1,367 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_PRIV_H +#define __CPPAWK_NARG_PRIV_H + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#define __bad _[<"too many args"<] + +#define __narg_50(B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, \ + B14, B15, B16, N33, N32, N31, N30, N29, N28, N27, N26, N25, \ + N24, N23, N22, N21, N20, N19, N18, N17, N16, N15, N14, N13, \ + N12, N11, N10, N9, N8, N7, N6, N5, N4, N3, N2, N1, N, ...) N + +#define __xnarg_50(...) __narg_50(__VA_ARGS__) + +// The __bad entries create a 16 position red zone. We effectively have +// space for 48 arguments, but if there are 33-48 arguments, we do not +// return an integer count, but rather bad syntax. Beyond 48 arguments, __narg +// starts to misbehave: it starts reproducing its 49th argument as its +// expansion. Without the 16 position bad syntax red zone, there would be +// and abrupt change: the macro would be good up to 32 arguments, returning the +// 1-32 ragument count, but the 33rd argument were added, the macro would +// misbehave badly, returning the 33rd argument, causnig a potentially +// hard-to-find bug. +#define __narg(...) __xnarg_50(__dummy, ## __VA_ARGS__, __bad, __bad, __bad, \ + __bad, __bad, __bad, __bad, __bad, __bad, \ + __bad, __bad, __bad, __bad, __bad, __bad, \ + __bad, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, \ + 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, \ + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) + +#define __repn_1(mac1, mac2, a1) \ + mac1(a1) +#define __repn_2(mac1, mac2, a1, a2) \ + mac2(mac1(a1), a2) +#define __repn_3(mac1, mac2, a1, a2, a3) \ + mac2(mac2(mac1(a1), a2), a3) +#define __repn_4(mac1, mac2, a1, a2, a3, a4) \ + mac2(mac2(mac2(mac1(a1), a2), a3), a4) +#define __repn_5(mac1, mac2, a1, a2, a3, a4, a5) \ + mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5) +#define __repn_6(mac1, mac2, a1, a2, a3, a4, a5, a6) \ + mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6) +#define __repn_7(mac1, mac2, a1, a2, a3, a4, a5, a6, a7) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7) +#define __repn_8(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8) +#define __repn_9(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9) +#define __repn_10(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10) +#define __repn_11(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11) +#define __repn_12(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12) +#define __repn_13(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13) +#define __repn_14(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14) +#define __repn_15(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15) +#define __repn_16(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16) +#define __repn_17(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17) +#define __repn_18(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18) +#define __repn_19(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19) +#define __repn_20(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20) +#define __repn_21(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21) +#define __repn_22(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22) +#define __repn_23(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23) +#define __repn_24(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24) +#define __repn_25(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25) +#define __repn_26(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26) +#define __repn_27(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27) +#define __repn_28(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28) +#define __repn_29(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29) +#define __repn_30(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29), a30) +#define __repn_31(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30, a31) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29), a30), a31) +#define __repn_32(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30, a31, a32) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1), a2), a3), a4), a5), a6), a7), a8), a9), a10), a11), a12), a13), a14), a15), a16), a17), a18), a19), a20), a21), a22), a23), a24), a25), a26), a27), a28), a29), a30), a31), a32) + +#define __repi_1(mac1, mac2, a1) \ + mac1(a1, 1) +#define __repi_2(mac1, mac2, a1, a2) \ + mac2(mac1(a1, 1), a2, 2) +#define __repi_3(mac1, mac2, a1, a2, a3) \ + mac2(mac2(mac1(a1, 1), a2, 2), a3, 3) +#define __repi_4(mac1, mac2, a1, a2, a3, a4) \ + mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4) +#define __repi_5(mac1, mac2, a1, a2, a3, a4, a5) \ + mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5) +#define __repi_6(mac1, mac2, a1, a2, a3, a4, a5, a6) \ + mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6) +#define __repi_7(mac1, mac2, a1, a2, a3, a4, a5, a6, a7) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7) +#define __repi_8(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8) +#define __repi_9(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9) +#define __repi_10(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10) +#define __repi_11(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11) +#define __repi_12(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12) +#define __repi_13(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13) +#define __repi_14(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14) +#define __repi_15(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15) +#define __repi_16(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16) +#define __repi_17(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17) +#define __repi_18(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18) +#define __repi_19(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19) +#define __repi_20(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20) +#define __repi_21(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21) +#define __repi_22(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22) +#define __repi_23(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23) +#define __repi_24(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24) +#define __repi_25(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25) +#define __repi_26(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26) +#define __repi_27(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27) +#define __repi_28(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28) +#define __repi_29(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29) +#define __repi_30(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29), a30, 30) +#define __repi_31(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30, a31) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29), a30, 30), a31, 31) +#define __repi_32(mac1, mac2, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30, a31, a32) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1), a2, 2), a3, 3), a4, 4), a5, 5), a6, 6), a7, 7), a8, 8), a9, 9), a10, 10), a11, 11), a12, 12), a13, 13), a14, 14), a15, 15), a16, 16), a17, 17), a18, 18), a19, 19), a20, 20), a21, 21), a22, 22), a23, 23), a24, 24), a25, 25), a26, 26), a27, 27), a28, 28), a29, 29), a30, 30), a31, 31), a32, 32) + +#define __repia_1(mac1, mac2, a, a1) \ + mac1(a1, 1, a) +#define __repia_2(mac1, mac2, a, a1, a2) \ + mac2(mac1(a1, 1, a), a2, 2, a) +#define __repia_3(mac1, mac2, a, a1, a2, a3) \ + mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a) +#define __repia_4(mac1, mac2, a, a1, a2, a3, a4) \ + mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a) +#define __repia_5(mac1, mac2, a, a1, a2, a3, a4, a5) \ + mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a) +#define __repia_6(mac1, mac2, a, a1, a2, a3, a4, a5, a6) \ + mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a) +#define __repia_7(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a) +#define __repia_8(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a) +#define __repia_9(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a) +#define __repia_10(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a) +#define __repia_11(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a) +#define __repia_12(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a) +#define __repia_13(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a) +#define __repia_14(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a) +#define __repia_15(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a) +#define __repia_16(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a) +#define __repia_17(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a) +#define __repia_18(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a) +#define __repia_19(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a) +#define __repia_20(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a) +#define __repia_21(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a) +#define __repia_22(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a) +#define __repia_23(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a) +#define __repia_24(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a) +#define __repia_25(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a) +#define __repia_26(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a) +#define __repia_27(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a) +#define __repia_28(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a) +#define __repia_29(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a) +#define __repia_30(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a), a30, 30, a) +#define __repia_31(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30, a31) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a), a30, 30, a), a31, 31, a) +#define __repia_32(mac1, mac2, a, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, \ + a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, \ + a24, a25, a26, a27, a28, a29, a30, a31, a32) \ + mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac2(mac1(a1, 1, a), a2, 2, a), a3, 3, a), a4, 4, a), a5, 5, a), a6, 6, a), a7, 7, a), a8, 8, a), a9, 9, a), a10, 10, a), a11, 11, a), a12, 12, a), a13, 13, a), a14, 14, a), a15, 15, a), a16, 16, a), a17, 17, a), a18, 18, a), a19, 19, a), a20, 20, a), a21, 21, a), a22, 22, a), a23, 23, a), a24, 24, a), a25, 25, a), a26, 26, a), a27, 27, a), a28, 28, a), a29, 29, a), a30, 30, a), a31, 31, a), a32, 32, a) + +#define __varexpand(mac1, mac2, ...) \ + __xcat(__repn_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) + +#define __varexpand2(mac1, mac2, ...) \ + __xcat(__repn_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) + +#define __varexpand3(mac1, mac2, ...) \ + __xcat(__repn_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) + +#define __rev_first(arg) arg +#define __rev_next(args, arg) arg, args +#define __revarg(...) __varexpand(__rev_first, __rev_next, __VA_ARGS__) + +#define __va_args(...) __VA_ARGS__ +#define __splice(args) __va_args args + +#define __variexpand(mac1, mac2, ...) \ + __xcat(__repi_, __narg(__VA_ARGS__)) (mac1, mac2, __VA_ARGS__) + +#define __variaexpand(mac1, mac2, a, ...) \ + __xcat(__repia_, __narg(__VA_ARGS__)) (mac1, mac2, a, __VA_ARGS__) + +#endif diff --git a/share/cppawk/include/narg.h b/share/cppawk/include/narg.h new file mode 100644 index 0000000..b757f41 --- /dev/null +++ b/share/cppawk/include/narg.h @@ -0,0 +1,44 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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(first, rest, ...) __varexpand(first, rest, __VA_ARGS__) +#define variexpand(first, rest, ...) __variexpand(first, rest, __VA_ARGS__) +#define variaexpand(first, rest, \ + arg, ...) __variaexpand(first, rest, arg, \ + __VA_ARGS__) +#define revarg(...) __revarg(__VA_ARGS__) +#define splice(args) __splice(args) + +#endif diff --git a/share/cppawk/include/varg-priv.h b/share/cppawk/include/varg-priv.h new file mode 100644 index 0000000..d71b500 --- /dev/null +++ b/share/cppawk/include/varg-priv.h @@ -0,0 +1,392 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_VARG_PRIV_H +#define __CPPAWK_VARG_PRIV_H + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#ifndef __CPPAWK_CASE_PRIV_H +#include "case-priv.h" +#endif + +#define __rest \ + __r1, __r2, __r3, __r4, __r5, __r6, __r7, __r8, __r9, __r10, __r11, \ + __r12, __r13, __r14, __r15, __r16, __r17, __r18, __r19, __r20, __r21, \ + __r22, __r23, __r24, __r25, __r26, __r27, __r28, __r29, __r30, __r31, __r32 + +#define __varg_count(name, check, count) \ + if (__present(check)) \ + __error(name ": too many arguments"); \ + count = 0; \ + if (__present(__r16)) { \ + if (__present(__r24)) { \ + if (__present(__r28)) { \ + if (__present(__r30)) { \ + if (__present(__r31)) { \ + if (__present(__r32)) \ + count = 32; \ + else \ + count = 31; \ + } else { \ + count = 30; \ + } \ + } else { /* !__present(__r30) */ \ + if (__present(__r29)) \ + count = 29; \ + else \ + count = 28; \ + } \ + } else { /* !__present(__r28) */ \ + if (__present(__r26)) { \ + if (__present(__r27)) \ + count = 27; \ + else \ + count = 26; \ + } else { /* !__present(__r26) */ \ + if (__present(__r25)) \ + count = 25; \ + else \ + count = 24; \ + } \ + } \ + } else { /* !__present(__r24) */ \ + if (__present(__r20)) { \ + if (__present(__r22)) { \ + if (__present(__r23)) \ + count = 23; \ + else \ + count = 22; \ + } else { /* !__present(__r22) */ \ + if (__present(__r21)) \ + count = 21; \ + else \ + count = 20; \ + } \ + } else { /* !__present(__r20) */ \ + if (__present(__r18)) { \ + if (__present(__r19)) \ + count = 19; \ + else \ + count = 18; \ + } else { /* !__present(__r18) */ \ + if (__present(__r17)) \ + count = 17; \ + else \ + count = 16; \ + } \ + } \ + } \ + } else { /*!__present(__r16) */ \ + if (__present(__r8)) { \ + if (__present(__r12)) { \ + if (__present(__r14)) { \ + if (__present(__r15)) { \ + count = 15; \ + } else { \ + count = 14; \ + } \ + } else { /* !__present(__r14) */ \ + if (__present(__r13)) \ + count = 13; \ + else \ + count = 12; \ + } \ + } else { /* !__present(__r12) */ \ + if (__present(__r10)) { \ + if (__present(__r11)) \ + count = 11; \ + else \ + count = 10; \ + } else { /* !__present(__r10) */ \ + if (__present(__r9)) \ + count = 9; \ + else \ + count = 8; \ + } \ + } \ + } else { /* !__present(__r8) */ \ + if (__present(__r4)) { \ + if (__present(__r6)) { \ + if (__present(__r7)) \ + count = 7; \ + else \ + count = 6; \ + } else { /* !__present(__r6) */ \ + if (__present(__r5)) \ + count = 5; \ + else \ + count = 4; \ + } \ + } else { /* !__present(__r4) */ \ + if (__present(__r2)) { \ + if (__present(__r3)) \ + count = 3; \ + else \ + count = 2; \ + } else { /* !__present(__r2) */ \ + if (__present(__r1)) \ + count = 1; \ + } \ + } \ + } \ + } + +#define __varg_list(name, check, count, out) \ + __varg_count(name, check, count); \ + out = __nil; \ + __case (count) { \ + __of (32) \ + out = __cons(__r32, out); \ + __cfall; \ + __of (31) \ + out = __cons(__r31, out); \ + __cfall; \ + __of (30) \ + out = __cons(__r30, out); \ + __cfall; \ + __of (29) \ + out = __cons(__r29, out); \ + __cfall; \ + __of (28) \ + out = __cons(__r28, out); \ + __cfall; \ + __of (27) \ + out = __cons(__r27, out); \ + __cfall; \ + __of (26) \ + out = __cons(__r26, out); \ + __cfall; \ + __of (25) \ + out = __cons(__r25, out); \ + __cfall; \ + __of (24) \ + out = __cons(__r24, out); \ + __cfall; \ + __of (23) \ + out = __cons(__r23, out); \ + __cfall; \ + __of (22) \ + out = __cons(__r22, out); \ + __cfall; \ + __of (21) \ + out = __cons(__r21, out); \ + __cfall; \ + __of (20) \ + out = __cons(__r20, out); \ + __cfall; \ + __of (19) \ + out = __cons(__r19, out); \ + __cfall; \ + __of (18) \ + out = __cons(__r18, out); \ + __cfall; \ + __of (17) \ + out = __cons(__r17, out); \ + __cfall; \ + __of (16) \ + out = __cons(__r16, out); \ + __cfall; \ + __of (15) \ + out = __cons(__r15, out); \ + __cfall; \ + __of (14) \ + out = __cons(__r14, out); \ + __cfall; \ + __of (13) \ + out = __cons(__r13, out); \ + __cfall; \ + __of (12) \ + out = __cons(__r12, out); \ + __cfall; \ + __of (11) \ + out = __cons(__r11, out); \ + __cfall; \ + __of (10) \ + out = __cons(__r10, out); \ + __cfall; \ + __of (9) \ + out = __cons(__r9, out); \ + __cfall; \ + __of (8) \ + out = __cons(__r8, out); \ + __cfall; \ + __of (7) \ + out = __cons(__r7, out); \ + __cfall; \ + __of (6) \ + out = __cons(__r6, out); \ + __cfall; \ + __of (5) \ + out = __cons(__r5, out); \ + __cfall; \ + __of (4) \ + out = __cons(__r4, out); \ + __cfall; \ + __of (3) \ + out = __cons(__r3, out); \ + __cfall; \ + __of (2) \ + out = __cons(__r2, out); \ + __cfall; \ + __of (1) \ + out = __cons(__r1, out); \ + __cfall; \ + } + +#define __varg_array(name, check, count, out) \ + __varg_count(name, check, count); \ + delete out; \ + __case (count) { \ + __of (32) \ + out[32] = __r32; \ + __cfall; \ + __of (31) \ + out[31] = __r31; \ + __cfall; \ + __of (30) \ + out[30] = __r30; \ + __cfall; \ + __of (29) \ + out[29] = __r29; \ + __cfall; \ + __of (28) \ + out[28] = __r28; \ + __cfall; \ + __of (27) \ + out[27] = __r27; \ + __cfall; \ + __of (26) \ + out[26] = __r26; \ + __cfall; \ + __of (25) \ + out[25] = __r25; \ + __cfall; \ + __of (24) \ + out[24] = __r24; \ + __cfall; \ + __of (23) \ + out[23] = __r23; \ + __cfall; \ + __of (22) \ + out[22] = __r22; \ + __cfall; \ + __of (21) \ + out[21] = __r21; \ + __cfall; \ + __of (20) \ + out[20] = __r20; \ + __cfall; \ + __of (19) \ + out[19] = __r19; \ + __cfall; \ + __of (18) \ + out[18] = __r18; \ + __cfall; \ + __of (17) \ + out[17] = __r17; \ + __cfall; \ + __of (16) \ + out[16] = __r16; \ + __cfall; \ + __of (15) \ + out[15] = __r15; \ + __cfall; \ + __of (14) \ + out[14] = __r14; \ + __cfall; \ + __of (13) \ + out[13] = __r13; \ + __cfall; \ + __of (12) \ + out[12] = __r12; \ + __cfall; \ + __of (11) \ + out[11] = __r11; \ + __cfall; \ + __of (10) \ + out[10] = __r10; \ + __cfall; \ + __of (9) \ + out[9] = __r9; \ + __cfall; \ + __of (8) \ + out[8] = __r8; \ + __cfall; \ + __of (7) \ + out[7] = __r7; \ + __cfall; \ + __of (6) \ + out[6] = __r6; \ + __cfall; \ + __of (5) \ + out[5] = __r5; \ + __cfall; \ + __of (4) \ + out[4] = __r4; \ + __cfall; \ + __of (3) \ + out[3] = __r3; \ + __cfall; \ + __of (2) \ + out[2] = __r2; \ + __cfall; \ + __of (1) \ + out[1] = __r1; \ + __cfall; \ + } + +#ifndef __CPPAWK_CONS_PRIV_H +#include "cons-priv.h" +#endif + +function __argcount(__name, __rest, + __narg, // check argument; doubles as local count + __case_temps) +{ + __varg_count(__name, __narg, __narg) + return __narg; +} + +function __arglist(__name, __rest, + __narg, // check argument; doubles as local count + __out, __case_temps) +{ + __varg_list(__name, __narg, __narg, __out) + return __out; +} + +function __argarray(__name, __to_array, __rest, + __narg, // check argument; doubles as local count + __case_temps) +{ + __varg_array(__name, __narg, __narg, __to_array) +} + +#endif diff --git a/share/cppawk/include/varg.h b/share/cppawk/include/varg.h new file mode 100644 index 0000000..c0ff036 --- /dev/null +++ b/share/cppawk/include/varg.h @@ -0,0 +1,46 @@ +// cppawk: C preprocessor wrapper around awk +// Copyright 2022 Kaz Kylheku +// +// 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_VARG_H +#define __CPPAWK_VARG_H + +#ifndef __CPPAWK_BASE_H +#include "base.h" +#endif + +#ifndef __CPPAWK_VARG_PRIV_H +#include "varg-priv.h" +#endif + +#define restargs __rest +#define arg(n) __r ## n +#define present(arg) __present(arg) +#define argcount __argcount +#define arglist __arglist +#define argarray __argarray + +#endif -- cgit v1.2.3