diff options
-rw-r--r-- | miscutils/bc.c | 17 | ||||
-rwxr-xr-x | testsuite/bc.tests | 5 | ||||
-rwxr-xr-x | testsuite/dc.tests | 5 |
3 files changed, 23 insertions, 4 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index 84bbe7b14..91564099e 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -6259,13 +6259,20 @@ static unsigned long xc_program_len(BcNum *n) | |||
6259 | { | 6259 | { |
6260 | size_t len = n->len; | 6260 | size_t len = n->len; |
6261 | 6261 | ||
6262 | if (n->rdx != len) return len; | 6262 | if (n->rdx != len) |
6263 | // length(100): rdx 0 len 3, return 3 | ||
6264 | // length(0.01-0.01): rdx 2 len 0, return 2 | ||
6265 | // dc: 0.01 0.01 - Zp: rdx 2 len 0, return 1 | ||
6266 | return len != 0 ? len : (IS_BC ? n->rdx : 1); | ||
6267 | |||
6268 | // length(0): return 1 | ||
6269 | // length(0.000nnn): count nnn | ||
6263 | for (;;) { | 6270 | for (;;) { |
6264 | if (len == 0) break; | 6271 | if (len == 0) break; |
6265 | len--; | 6272 | len--; |
6266 | if (n->num[len] != 0) break; | 6273 | if (n->num[len] != 0) break; |
6267 | } | 6274 | } |
6268 | return len; | 6275 | return len + 1; |
6269 | } | 6276 | } |
6270 | 6277 | ||
6271 | static BC_STATUS zxc_program_builtin(char inst) | 6278 | static BC_STATUS zxc_program_builtin(char inst) |
@@ -6293,12 +6300,12 @@ static BC_STATUS zxc_program_builtin(char inst) | |||
6293 | if (inst == XC_INST_SQRT) | 6300 | if (inst == XC_INST_SQRT) |
6294 | s = zbc_num_sqrt(num, &res.d.n, G.prog.scale); | 6301 | s = zbc_num_sqrt(num, &res.d.n, G.prog.scale); |
6295 | #if ENABLE_BC | 6302 | #if ENABLE_BC |
6296 | else if (len != 0 && opnd->t == XC_RESULT_ARRAY) { | 6303 | else if (len && opnd->t == XC_RESULT_ARRAY) { |
6297 | bc_num_ulong2num(&res.d.n, (unsigned long) ((BcVec *) num)->len); | 6304 | bc_num_ulong2num(&res.d.n, (unsigned long) ((BcVec *) num)->len); |
6298 | } | 6305 | } |
6299 | #endif | 6306 | #endif |
6300 | #if ENABLE_DC | 6307 | #if ENABLE_DC |
6301 | else if (len != 0 && !BC_PROG_NUM(opnd, num)) { | 6308 | else if (len && !BC_PROG_NUM(opnd, num)) { |
6302 | char **str; | 6309 | char **str; |
6303 | size_t idx = opnd->t == XC_RESULT_STR ? opnd->d.id.idx : num->rdx; | 6310 | size_t idx = opnd->t == XC_RESULT_STR ? opnd->d.id.idx : num->rdx; |
6304 | 6311 | ||
@@ -6307,6 +6314,8 @@ static BC_STATUS zxc_program_builtin(char inst) | |||
6307 | } | 6314 | } |
6308 | #endif | 6315 | #endif |
6309 | else { | 6316 | else { |
6317 | //TODO: length(.00) and scale(.00) should return 2, they return 1 and 0 now | ||
6318 | //(don't forget to check that dc Z and X commands do not break) | ||
6310 | bc_num_ulong2num(&res.d.n, len ? xc_program_len(num) : xc_program_scale(num)); | 6319 | bc_num_ulong2num(&res.d.n, len ? xc_program_len(num) : xc_program_scale(num)); |
6311 | } | 6320 | } |
6312 | 6321 | ||
diff --git a/testsuite/bc.tests b/testsuite/bc.tests index 179d5d2a2..1c748727a 100755 --- a/testsuite/bc.tests +++ b/testsuite/bc.tests | |||
@@ -182,6 +182,11 @@ testing "bc print 1,2,3" \ | |||
182 | "123" \ | 182 | "123" \ |
183 | "" "print 1,2,3" | 183 | "" "print 1,2,3" |
184 | 184 | ||
185 | testing "bc length" \ | ||
186 | "bc" \ | ||
187 | "1\n3\n1\n3\n3\n" \ | ||
188 | "" "length(0); length(100); length(0.01); length(0.00120); length(0.012-0.012);" | ||
189 | |||
185 | testing "bc { print 1 }" \ | 190 | testing "bc { print 1 }" \ |
186 | "bc" \ | 191 | "bc" \ |
187 | "1" \ | 192 | "1" \ |
diff --git a/testsuite/dc.tests b/testsuite/dc.tests index 361bc8459..ad0099354 100755 --- a/testsuite/dc.tests +++ b/testsuite/dc.tests | |||
@@ -114,6 +114,11 @@ testing "dc newline can be a register" \ | |||
114 | "2\n9\n" \ | 114 | "2\n9\n" \ |
115 | "" "[2p]s\n[3p]l\nx\n9p" | 115 | "" "[2p]s\n[3p]l\nx\n9p" |
116 | 116 | ||
117 | testing "dc Z (length) for numbers" \ | ||
118 | "dc" \ | ||
119 | "1\n1\n3\n1\n3\n1\n" \ | ||
120 | "" "0Zp\n0.000Zp\n100Zp\n0.01Zp\n0.00120Zp\n0.0012 0.0012 - Zp\n" | ||
121 | |||
117 | for f in dc_*.dc; do | 122 | for f in dc_*.dc; do |
118 | r="`basename "$f" .dc`_results.txt" | 123 | r="`basename "$f" .dc`_results.txt" |
119 | test -f "$r" || continue | 124 | test -f "$r" || continue |