aboutsummaryrefslogtreecommitdiffstats
path: root/cppawk-include
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-04-23 17:57:11 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-04-23 17:57:11 -0700
commit3528b08fa71d43b9541a6c56fb79bc9f95d97dd6 (patch)
tree58cf36d6607d5ebe29a441937ad153456bcb3484 /cppawk-include
parent57f4e4ed68140a9f20cb59c45c79214cfa552970 (diff)
downloadcppawk-3528b08fa71d43b9541a6c56fb79bc9f95d97dd6.tar.gz
cppawk-3528b08fa71d43b9541a6c56fb79bc9f95d97dd6.tar.bz2
cppawk-3528b08fa71d43b9541a6c56fb79bc9f95d97dd6.zip
iter: argmax, argmin: argument need not be variable!
Diffstat (limited to 'cppawk-include')
-rw-r--r--cppawk-include/base.h1
-rw-r--r--cppawk-include/iter.h48
2 files changed, 25 insertions, 24 deletions
diff --git a/cppawk-include/base.h b/cppawk-include/base.h
index 751da86..4012d95 100644
--- a/cppawk-include/base.h
+++ b/cppawk-include/base.h
@@ -37,6 +37,7 @@
#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 }
diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h
index 1ac3ac2..f73fbea 100644
--- a/cppawk-include/iter.h
+++ b/cppawk-include/iter.h
@@ -244,40 +244,40 @@ function __loop_argmax(a, arga, b, argb)
return a > b ? arga : argb;
}
-#define __am_max __g(amx)
-#define __am_min __g(ami)
-#define __am_old __g(arg)
-
-#define __temp_argmax(amx, arg, expr) __am_max, __am_old,
-#define __init_argmax(amx, arg, expr) (__am_max = __nil) || (amx = __nil)
-#define __test_argmax(amx, arg, expr) 1
-#define __prep_argmax(amx, arg, expr) ((__am_old = __am_max) || 1) && \
- ((__am_max = \
- (__null(__am_max) \
+#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(__am_max, \
+ : __loop_max(__amx(am), \
expr))) || 1) && \
- ((__am_old != __am_max) ? amx = arg : 1)
-#define __fini_argmax(amx, arg, expr) 1
-#define __step_argmax(amx, arg, 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(ami, arg, expr) __am_min, __am_old,
-#define __init_argmin(ami, arg, expr) (__am_min = __nil) || (ami = __nil)
-#define __test_argmin(ami, arg, expr) 1
-#define __prep_argmin(ami, arg, expr) ((__am_old = __am_min) || 1) && \
- ((__am_min = \
- (__null(__am_min) \
+#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(__am_min, \
+ : __loop_min(__ami(am), \
expr))) || 1) && \
- ((__am_old != __am_min) ? ami = arg : 1)
-#define __fini_argmin(ami, arg, expr) 1
-#define __step_argmin(ami, arg, 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_while(expr)
#define __init_while(expr) 1