summaryrefslogtreecommitdiff
path: root/strings/decimal.c
diff options
context:
space:
mode:
Diffstat (limited to 'strings/decimal.c')
-rw-r--r--strings/decimal.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/strings/decimal.c b/strings/decimal.c
index 1e62333ee66..787d00dcb46 100644
--- a/strings/decimal.c
+++ b/strings/decimal.c
@@ -1549,15 +1549,19 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
}
else
{
- while (unlikely(*buf1 == 0) && buf1 >= to->buf)
- buf1--;
- if (buf1 < to->buf)
+ for (;;)
{
- decimal_make_zero(to);
- return E_DEC_OK;
+ if (likely(*buf1))
+ break;
+ if (buf1-- == to->buf)
+ {
+ decimal_make_zero(to);
+ return E_DEC_OK;
+ }
}
}
- if (scale<0) scale=0;
+ if (scale<0)
+ scale=0;
done:
to->frac=scale;
@@ -1727,11 +1731,14 @@ static int do_sub(decimal_t *from1, decimal_t *from2, decimal_t *to)
while (buf1 <=end1 && buf2 <= end2 && *buf1 == *buf2)
buf1++, buf2++;
if (buf1 <= end1)
+ {
if (buf2 <= end2)
carry= *buf2 > *buf1;
else
carry= 0;
+ }
else
+ {
if (buf2 <= end2)
carry=1;
else /* short-circuit everything: from1 == from2 */
@@ -1741,6 +1748,7 @@ static int do_sub(decimal_t *from1, decimal_t *from2, decimal_t *to)
decimal_make_zero(to);
return E_DEC_OK;
}
+ }
}
if (to == 0) /* decimal_cmp() */
@@ -1937,10 +1945,18 @@ int decimal_mul(decimal_t *from1, decimal_t *from2, decimal_t *to)
{
dec1 *buf= to->buf;
dec1 *end= to->buf + intg0 + frac0;
- for (; (buf<end) && !*buf; buf++);
- if (buf == end)
- /* So we got decimal zero */
- decimal_make_zero(to);
+ DBUG_ASSERT(buf != end);
+ for (;;)
+ {
+ if (*buf)
+ break;
+ if (++buf == end)
+ {
+ /* We got decimal zero */
+ decimal_make_zero(to);
+ break;
+ }
+ }
}
return error;
}