made BCD code compacter
This commit is contained in:
@ -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;
|
||||||
|
Reference in New Issue
Block a user