made BCD code compacter

This commit is contained in:
2018-06-18 17:48:01 +02:00
parent 9481b95b30
commit c1144cf277

View File

@ -40,43 +40,27 @@ bool BCDConverter::
printLong(const StreamFormat& fmt, StreamBuffer& output, long value) printLong(const StreamFormat& fmt, StreamBuffer& output, long value)
{ {
unsigned char bcd; unsigned char bcd;
bool neg = false; long i, d, s;
ssize_t i;
unsigned long prec = fmt.prec < 0 ? 2 * sizeof(value) : fmt.prec; // number of nibbles unsigned long prec = fmt.prec < 0 ? 2 * sizeof(value) : fmt.prec; // number of nibbles
unsigned long width = (prec + (fmt.flags & sign_flag ? 2 : 1)) / 2; unsigned long width = (prec + (fmt.flags & sign_flag ? 2 : 1)) / 2;
unsigned long val = value; unsigned long val = value;
if (fmt.width > width) width = fmt.width;
if (fmt.flags & sign_flag && value < 0 && prec > 0)
{
neg = true;
val = -value;
}
output.append('\0', width); output.append('\0', width);
if (fmt.width > width) width = fmt.width;
if (fmt.flags & sign_flag && value < 0)
val = -value;
if (fmt.flags & alt_flag) if (fmt.flags & alt_flag)
{ {
// least significant byte first (little endian) i = -(long)width;
i = -width; d = 1;
while (width && prec) s = -1;
{
width--;
bcd = val%10;
if (--prec)
{
--prec;
val /= 10;
bcd |= (val%10)<<4;
val /= 10;
}
output[i++] = bcd;
}
if (neg) output[-1] |= 0xf0;
} }
else else
{ {
// most significant byte first (big endian) i = -1;
if (neg) output[-(long)width] = 0xf0; d = -1;
i = 0; s = -(long)width;
}
while (width && prec) while (width && prec)
{ {
width--; width--;
@ -88,8 +72,11 @@ printLong(const StreamFormat& fmt, StreamBuffer& output, long value)
bcd |= (val%10)<<4; bcd |= (val%10)<<4;
val /= 10; val /= 10;
} }
output[--i] |= bcd; output[i] = bcd;
i += d;
} }
if (fmt.flags & sign_flag && value < 0) {
output[s] |= 0xf0;
} }
return true; return true;
} }
@ -108,7 +95,8 @@ scanLong(const StreamFormat& fmt, const char* input, long& value)
int shift = 1; int shift = 1;
while (width--) while (width--)
{ {
bcd1 = bcd10 = input[consumed++]; bcd1 = input[consumed++];
bcd10 = bcd1>>4;
bcd1 &= 0x0F; bcd1 &= 0x0F;
bcd10 >>= 4; bcd10 >>= 4;
if (bcd1 > 9 || shift * bcd1 < bcd1) break; if (bcd1 > 9 || shift * bcd1 < bcd1) break;
@ -131,9 +119,9 @@ scanLong(const StreamFormat& fmt, const char* input, long& value)
while (width--) while (width--)
{ {
long temp; long temp;
bcd1 = bcd10 = input[consumed]; bcd1 = input[consumed];
bcd10 = bcd1>>4;
bcd1 &= 0x0F; bcd1 &= 0x0F;
bcd10 >>= 4;
if (consumed == 0 && fmt.flags & sign_flag && bcd10) if (consumed == 0 && fmt.flags & sign_flag && bcd10)
{ {
sign = -1; sign = -1;