36 #define FLOAT_PRECISION 9
38 static char *long_to_string_with_divisor(
char *p,
62 }
while ((ll /= radix) != 0);
64 i = (int)(p + MAX_FILLER - q);
72 static char *ch_ltoa(
char *p,
long num,
unsigned radix) {
74 return long_to_string_with_divisor(p, num, radix, 0);
77 #if CHPRINTF_USE_FLOAT
78 static const long pow10[FLOAT_PRECISION] = {
79 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000
82 static char *ftoa(
char *p,
double num,
unsigned long precision) {
85 if ((precision == 0) || (precision > FLOAT_PRECISION)) {
86 precision = FLOAT_PRECISION;
88 precision = pow10[precision - 1];
91 p = long_to_string_with_divisor(p, l, 10, 0);
93 l = (long)((num - l) * precision);
95 return long_to_string_with_divisor(p, l, 10, precision / 10);
126 char *p, *s, c, filler;
127 int i, precision, width;
129 bool is_long, left_align, do_sign;
131 #if CHPRINTF_USE_FLOAT
133 char tmpbuf[2*MAX_FILLER + 1];
135 char tmpbuf[MAX_FILLER + 1];
176 width = va_arg(ap,
int);
187 if (c >=
'0' && c <=
'9') {
189 width = width * 10 + c;
205 precision = va_arg(ap,
int);
209 while (c >=
'0' && c <=
'9') {
211 precision = precision * 10 + c;
221 if (c ==
'l' || c ==
'L') {
229 is_long = (c >=
'A') && (c <=
'Z');
236 *p++ = va_arg(ap,
int);
240 if ((s = va_arg(ap,
char *)) == 0) {
243 if (precision == 0) {
246 for (p = s; *p && (--precision >= 0); p++)
254 l = va_arg(ap,
long);
267 p = ch_ltoa(p, l, 10);
269 #if CHPRINTF_USE_FLOAT
271 f = (float) va_arg(ap,
double);
281 p = ftoa(p, f, precision);
289 goto unsigned_common;
293 goto unsigned_common;
299 l = va_arg(ap,
unsigned long);
302 l = va_arg(ap,
unsigned int);
304 p = ch_ltoa(p, l, c);
311 if ((width -= i) < 0) {
314 if (left_align ==
false) {
318 if ((*s ==
'-' || *s ==
'+') && filler ==
'0') {
326 }
while (++width != 0);
371 formatted_bytes =
chvprintf(chp, fmt, ap);
374 return formatted_bytes;
404 int chsnprintf(
char *str,
size_t size,
const char *fmt, ...) {
445 int chvsnprintf(
char *str,
size_t size,
const char *fmt, va_list ap) {
452 size_wo_nul = size - 1;