aboutsummaryrefslogtreecommitdiffstats
path: root/cppawk-include
diff options
context:
space:
mode:
Diffstat (limited to 'cppawk-include')
-rw-r--r--cppawk-include/cons-priv.h44
1 files changed, 32 insertions, 12 deletions
diff --git a/cppawk-include/cons-priv.h b/cppawk-include/cons-priv.h
index 55790d1..97d410d 100644
--- a/cppawk-include/cons-priv.h
+++ b/cppawk-include/cons-priv.h
@@ -786,23 +786,43 @@ function __butlast(__lst, __n,
return (__i in __circbuf) ? __list_end(__circbuf[__i]) : __nil
}
-function __iota(__from, __to, __step,
- __i, __out)
+function __iota(__from, __to, __delta,
+ __out, __i, __val)
{
__out = __list_begin();
if (__from < __to) {
- if (!__present(__step))
- __step = 1
- if (__step > 0)
- for (__i = __from; __i <= __to; __i += __step)
- __out = __list_add(__out, __i)
+ 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 {
- if (!__present(__step))
- __step = -1
- if (__step < 0)
- for (__i = __from; __i >= __to; __i += __step)
- __out = __list_add(__out, __i)
+ return __list(__from)
}
return __list_end(__out)