diff options
author | griffin <briang42@easystreet.net> | 2022-08-17 22:32:34 (GMT) |
---|---|---|
committer | griffin <briang42@easystreet.net> | 2022-08-17 22:32:34 (GMT) |
commit | 9a179b641897fc4e631dfe3dbd737d864f5df96d (patch) | |
tree | 0e9ec57e38309fbb4d78bc0736c6ebffa7593797 | |
parent | 2439b064ea3e521e50f6c7bd43ef0a69d183bff9 (diff) | |
download | tcl-9a179b641897fc4e631dfe3dbd737d864f5df96d.zip tcl-9a179b641897fc4e631dfe3dbd737d864f5df96d.tar.gz tcl-9a179b641897fc4e631dfe3dbd737d864f5df96d.tar.bz2 |
Bug fixes
-rw-r--r-- | doc/lseq.n | 4 | ||||
-rw-r--r-- | generic/tclCmdIL.c | 33 | ||||
-rw-r--r-- | generic/tclListObj.c | 5 | ||||
-rw-r--r-- | tests/lseq.test | 34 |
4 files changed, 43 insertions, 33 deletions
@@ -34,12 +34,12 @@ and use the numeric result, or error as with any invalid argument value. .\" lseq 3 - \(-> 0 1 + \(-> 0 1 2 lseq 3 0 \(-> 3 2 1 0 - lseq 10 .. 1 by 2 + lseq 10 .. 1 by -2 \(-> 10 8 6 4 2 set l [lseq 0 -5] diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 669f34b..332c77b 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -4222,11 +4222,7 @@ Tcl_LseqObjCmd( start = values[0]; end = values[1]; step = (start <= end) ? 1 : -1; - if (start <= end) { - elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list - } else { - elementCount = step ? (start-end-step)/(-step) : 0; // 0 step -> empty list - } + elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list if (elementCount < 0) elementCount = 0; break; @@ -4235,11 +4231,7 @@ Tcl_LseqObjCmd( start = values[0]; end = values[1]; step = values[2]; - if (start <= end) { - elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list - } else { - elementCount = step ? (start-end-step)/(-step) : 0; // 0 step -> empty list - } + elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list if (elementCount < 0) elementCount = 0; break; @@ -4261,7 +4253,6 @@ Tcl_LseqObjCmd( elementCount = values[0]; step = values[2]; end = start + (step * elementCount); - elementCount = step ? (start-end+step)/step : 0; // 0 step -> empty list break; case RANGE_COUNT: start = values[0]; @@ -4285,6 +4276,7 @@ Tcl_LseqObjCmd( start = values[0]; end = values[2]; step = values[3]; + elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list break; case RANGE_COUNT: start = values[0]; @@ -4321,14 +4313,7 @@ Tcl_LseqObjCmd( goto done; break; } - if (step == 0) { - // 0 step -> empty list - elementCount = 0; - } else if (start <= end) { - elementCount = (end-start+step)/step; - } else { - elementCount = (start-end-step)/(-step); - } + elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list break; /* range n 'to' n 'by' n */ @@ -4351,17 +4336,11 @@ Tcl_LseqObjCmd( case RANGE_TO: start = values[0]; end = values[2]; - if ((step == 0) || - (start < end && step < 0) || - (start > end && step > 0)) { - elementCount = 0; - } else { - elementCount = (end-start+step)/step; - } + elementCount = step ? (end-start+step)/step : 0; // 0 step -> empty list break; case RANGE_COUNT: start = values[0]; - elementCount = (values[2] >= 0 ? values[2] : 0); + elementCount = values[2] >= 0 ? values[2] : 0; if (step != 0) { end = start + (step * elementCount); } else { diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 37d941d..6b5ab7e 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -2347,9 +2347,12 @@ TclNewArithSeriesObj(Tcl_WideInt start, Tcl_WideInt end, Tcl_WideInt step, Tcl_W Tcl_Obj *arithSeriesPtr; ArithSeries *arithSeriesRepPtr; - if (length == -1) return NULL; /* Invalid range error */ TclNewObj(arithSeriesPtr); + if (length <= 0) { + return arithSeriesPtr; + } + arithSeriesRepPtr = (ArithSeries*) ckalloc(sizeof (ArithSeries)); arithSeriesRepPtr->start = start; arithSeriesRepPtr->end = end; diff --git a/tests/lseq.test b/tests/lseq.test index 082111b..04f9c77 100644 --- a/tests/lseq.test +++ b/tests/lseq.test @@ -113,6 +113,18 @@ test lseq-1.19 {too many arguments extra numeric value} -body { lseq 12 to 24 by 2 7 } -returnCodes 1 -result {wrong # args: should be "lseq n ??op? n ??by? n??"} +test lseq-1.20 {bug: wrong length computed} { + lseq 1 to 10 -1 +} {} + +test lseq-1.21 {n n by n} { + lseq 66 84 by 3 +} {66 69 72 75 78 81 84} + +test lseq-1.22 {n n by -n} { + lseq 84 66 by -3 +} {84 81 78 75 72 69 66} + # # Short-hand use cases # @@ -182,6 +194,17 @@ test lseq-2.17 {large numbers} arithSeriesDouble { lseq 1e6 2e6 1e5 } {1000000.0 1100000.0 1200000.0 1300000.0 1400000.0 1500000.0 1600000.0 1700000.0 1800000.0 1900000.0 2000000.0} +# Covered: {10 1 2 } {1 10 2} {1 10 -2} {1 1 1} {1 1 1} {-5 17 3} +# Missing: {- - +} {- - -} {- + -} {+ - -} {- - +} {+ + -} +test lseq-2.18 {signs} { + list [lseq -10 -1 2] \ + [lseq -10 -1 -1] \ + [lseq -10 1 -3] \ + [lseq 10 -1 -4] \ + [lseq -10 -1 3] \ + [lseq 10 1 -5] + +} {{-10 -8 -6 -4 -2} {} {} {10 6 2} {-10 -7 -4 -1} {10 5}} test lseq-3.1 {experiement} { set ans {} @@ -216,8 +239,9 @@ test lseq-3.4 {error case} -body { } -returnCodes 1 -result {bad operation "or": must be .., to, count, or by} test lseq-3.5 {simple count and step arguments} { - lseq 25 by 6 -} {0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 144 150} + set s [lseq 25 by 6] + list $s length=[llength $s] +} {{0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114 120 126 132 138 144} length=25} test lseq-3.6 {error case} -body { lseq 1 7 or 3 @@ -335,7 +359,7 @@ test lseq-3.22 {edge case} { test lseq-3.23 {edge case} { llength [lseq 1 1 1] } {1} - + test lseq-3.24 {edge case} { llength [lseq 1 to 1 1] } {1} @@ -366,6 +390,10 @@ test lseq-3.28 {lreverse bug in ArithSeries} {} { list $r $rr [string equal $r [lreverse $rr]] } {{-5 -2 1 4 7 10 13 16} {16 13 10 7 4 1 -2 -5} 1} +test lseq-3.29 {edge case: negative count} { + lseq -15 +} {} + test lseq-4.1 {end expressions} { set start 7 lseq $start $start+11 |