in shakti/bsp/libs/printf.c [75:222]
void _printf_(const char *fmt, va_list ap)
{
register const char* p;
const char* last_fmt;
register int ch;
unsigned long long num;
int base, lflag, i;
float float_num = 0;
char float_arr[30] = {'\0'};
int backtothebeginning;
for (;;) {
for (;(ch = *(unsigned char *) fmt) != '%'; fmt++) {
if (ch == '\0')
return;
putchar(ch);
}
fmt++;
// Process a %-escape sequence
last_fmt = fmt;
lflag = 0;
backtothebeginning = 0;
for (;;) {
switch (ch = *(unsigned char *) fmt++) {
// long flag (doubled for long long)
case 'l':
lflag++;
backtothebeginning = 1;
break;
// character
case 'c':
putchar(va_arg(ap, int));
break;
// string
case 's':
if ((p = va_arg(ap, char *)) == NULL)
p = "(null)";
for (; (ch = *p) != '\0' ;) {
putchar(ch);
p++;
}
break;
// (signed) decimal
case 'd':
base = 10;
if (lflag >= 2)
num = va_arg(ap, long long);
else if (lflag ==1)
num = va_arg(ap, long);
else
num = va_arg(ap, int);
if ((long long) num < 0) {
putchar('-');
num = -(long long) num;
}
itoa( num, base);
break;
case 'f':
float_num = va_arg(ap, double);
ftoa(float_num, float_arr, 6);
for( i = 0; float_arr[i] != '\0'; i++)
{
putchar(float_arr[i]);
if(i > 29) break;
}
break;
// unsigned decimal
case 'u':
base = 10;
if (lflag >= 2)
num = va_arg(ap, unsigned long long);
else if (lflag)
num = va_arg(ap, unsigned long);
else
num = va_arg(ap, unsigned int);
itoa( num, base);
break;
// (unsigned) octal
case 'o':
// should do something with padding so it's always 3 octits
base = 8;
if (lflag >= 2)
num = va_arg(ap, unsigned long long);
else if (lflag)
num = va_arg(ap, unsigned long);
else
num = va_arg(ap, unsigned int);
itoa( num, base);
break;
case 'x':
base = 16;
if (lflag >= 2)
num = va_arg(ap, unsigned long long);
else if (lflag)
num = va_arg(ap, unsigned long);
else
num = va_arg(ap, unsigned int);
itoa( num, base);
break;
// escaped '%' character
case '%':
putchar(ch);
break;
// unrecognized escape sequence - just print it literally
default:
putchar('%');
fmt = last_fmt;
break;
}
if (backtothebeginning)
{
backtothebeginning = 0;
continue;
}
else
break;
}
}
}