libc: support precision for %d?
This commit is contained in:
parent
888323bcea
commit
1bbf9fba5d
|
@ -2,9 +2,10 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <va_list.h>
|
#include <va_list.h>
|
||||||
|
|
||||||
static void print_dec(unsigned int value, unsigned int width, char * buf, int * ptr, int fill_zero, int align_right) {
|
static void print_dec(unsigned int value, unsigned int width, char * buf, int * ptr, int fill_zero, int align_right, int precision) {
|
||||||
unsigned int n_width = 1;
|
unsigned int n_width = 1;
|
||||||
unsigned int i = 9;
|
unsigned int i = 9;
|
||||||
|
if (precision == -1) precision = 1;
|
||||||
|
|
||||||
if (value < 10UL) {
|
if (value < 10UL) {
|
||||||
n_width = 1;
|
n_width = 1;
|
||||||
|
@ -28,6 +29,8 @@ static void print_dec(unsigned int value, unsigned int width, char * buf, int *
|
||||||
n_width = 10;
|
n_width = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (n_width < (unsigned int)precision) n_width = precision;
|
||||||
|
|
||||||
int printed = 0;
|
int printed = 0;
|
||||||
if (align_right) {
|
if (align_right) {
|
||||||
while (n_width + printed < width) {
|
while (n_width + printed < width) {
|
||||||
|
@ -248,7 +251,7 @@ int xvasprintf(char * buf, const char * fmt, va_list args) {
|
||||||
*b++ = '+';
|
*b++ = '+';
|
||||||
buf++;
|
buf++;
|
||||||
}
|
}
|
||||||
print_dec(val, arg_width, buf, &i, fill_zero, align);
|
print_dec(val, arg_width, buf, &i, fill_zero, align, precision);
|
||||||
}
|
}
|
||||||
b = buf + i;
|
b = buf + i;
|
||||||
break;
|
break;
|
||||||
|
@ -261,7 +264,7 @@ int xvasprintf(char * buf, const char * fmt, va_list args) {
|
||||||
} else {
|
} else {
|
||||||
val = (unsigned long)va_arg(args, unsigned long);
|
val = (unsigned long)va_arg(args, unsigned long);
|
||||||
}
|
}
|
||||||
print_dec(val, arg_width, buf, &i, fill_zero, align);
|
print_dec(val, arg_width, buf, &i, fill_zero, align, precision);
|
||||||
}
|
}
|
||||||
b = buf + i;
|
b = buf + i;
|
||||||
break;
|
break;
|
||||||
|
@ -275,7 +278,7 @@ int xvasprintf(char * buf, const char * fmt, va_list args) {
|
||||||
buf++;
|
buf++;
|
||||||
val = -val;
|
val = -val;
|
||||||
}
|
}
|
||||||
print_dec((long)val, arg_width, buf, &i, fill_zero, align);
|
print_dec((long)val, arg_width, buf, &i, fill_zero, align, 1);
|
||||||
b = buf + i;
|
b = buf + i;
|
||||||
i = b - buf;
|
i = b - buf;
|
||||||
*b++ = '.';
|
*b++ = '.';
|
||||||
|
@ -283,7 +286,7 @@ int xvasprintf(char * buf, const char * fmt, va_list args) {
|
||||||
for (int j = 0; j < ((precision > -1 && precision < 8) ? precision : 8); ++j) {
|
for (int j = 0; j < ((precision > -1 && precision < 8) ? precision : 8); ++j) {
|
||||||
if ((int)(val * 100000.0) % 100000 == 0 && j != 0) break;
|
if ((int)(val * 100000.0) % 100000 == 0 && j != 0) break;
|
||||||
val *= 10.0;
|
val *= 10.0;
|
||||||
print_dec((int)(val) % 10, 0, buf, &i, 0, 0);
|
print_dec((int)(val) % 10, 0, buf, &i, 0, 0, 1);
|
||||||
}
|
}
|
||||||
b = buf + i;
|
b = buf + i;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue