diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-11-15 20:17:59 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-11-15 20:17:59 -0800 |
commit | 89b51ce4482c0d10abe2947fb02876784119e091 (patch) | |
tree | 8d2f3d3b682104b51c82c9a66346afdf833d3770 /lib.c | |
parent | 5110262829dd1324e4a1a7ba4e2f0a733f63b728 (diff) | |
download | txr-89b51ce4482c0d10abe2947fb02876784119e091.tar.gz txr-89b51ce4482c0d10abe2947fb02876784119e091.tar.bz2 txr-89b51ce4482c0d10abe2947fb02876784119e091.zip |
find-max: bugfix for zero length vectors.
* lib.c (find_max): Fix a regression introduced
in recent work: only execute the loop when the vector isn't
empty.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 25 |
1 files changed, 15 insertions, 10 deletions
@@ -8567,21 +8567,26 @@ val find_max(val seq, val testfun, val keyfun) case SEQ_VECLIKE: { val vec = si.obj; - val maxelt = ref(vec, zero); - val maxkey = funcall1(keyfun, maxelt); val len = length(vec); - val i; - for (i = one; lt(i, len); i = succ(i)) { - val elt = ref(vec, i); - val key = funcall1(keyfun, elt); - if (funcall2(testfun, key, maxkey)) { - maxkey = key; - maxelt = elt; + if (len != zero) { + val maxelt = ref(vec, zero); + val maxkey = funcall1(keyfun, maxelt); + val i; + + for (i = one; lt(i, len); i = succ(i)) { + val elt = ref(vec, i); + val key = funcall1(keyfun, elt); + if (funcall2(testfun, key, maxkey)) { + maxkey = key; + maxelt = elt; + } } + + return maxelt; } - return maxelt; + return nil; } case SEQ_NOTSEQ: default: |