aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--miscutils/bc.c17
-rwxr-xr-xtestsuite/bc.tests5
-rwxr-xr-xtestsuite/dc.tests5
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
6271static BC_STATUS zxc_program_builtin(char inst) 6278static 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
185testing "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
185testing "bc { print 1 }" \ 190testing "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
117testing "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
117for f in dc_*.dc; do 122for 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