Buenas, he hecho una implementación de printf, sin usar vsnprintf (por que no puedo).
Funciona bien, pero si trato de formatear un número hexadecimal y aveces cadenas, se descontrola todo, por lo que pienso que se me está colando un terminador nulo '\0' .
Ejemplo:
kputs("r8: %x r9: %x r10: %x", r->r8, r->r9, r->r10);
Salida:
r8: b8000└
Sólo me imprime r8 y de ahí el valor en hexadecimal, pero los demás los ignora y no imprime r9 ni r0.
Nótese el carácter "└" el cual no es esperado.
int kputs(const char *fmt, ...) {
/* Hacer nada si la cadena esta vacia. */
if (!fmt)
return 0;
char buffer[1024] = {0};
va_list args;
size_t cout;
unsigned int* charc;
for (cout
= 0; cout
< strlen(fmt
); ++cout
) { switch (fmt[cout]) {
case '%':
switch (fmt[cout + 1]) {
case 'c':
charc
= va_arg(args
, unsigned int); putch(charc);
++cout;
break;
case 's':
charc
= (int*) (va_arg(args
, unsigned int)); strcpy(buffer
, (const char*) charc
); print_string(buffer);
++cout;
break;
case 'i':
print_string(buffer);
++cout;
break;
case 'X':
case 'x':
itoa((unsigned)charc
, buffer
, 16); print_string(buffer);
++cout;
case '%':
putch("%");
++cout;
default:
return 1;
}
break;
default:
putch(fmt[cout]);
break;
}
}
return cout;
}
Las funciones itoa no creo que sean el problema, por que mi implementación no tiene problemas para imprimir enteros. (excepto que se desborda con un número muy grande, eso se arregla fácil)