#include #include enum TYPE { TYPE_INT = 1, TYPE_UINT = 2, TYPE_HEX = 3, TYPE_STRING = 4 }; static void hex(char **str, int x) { int n; char *s = "0x"; while(*s) *(*str)++ = *s++; n = sizeof(x) << 1; while(n--) { *(*str)++ = ((unsigned int) x >> 28) + 0x30; x = x << 4; } } int vsprintf(char *str, char *fmt, va_list ap) { int x; char *s; char *start = str; uint8_t type; while(*fmt) { if(*fmt != '%') { *str++ = *fmt++; continue; } type = 0; fmt++; while(1) { switch(*fmt) { case 's': if(type) goto done; type = TYPE_STRING; break; case 'x': if(type) goto done; type = TYPE_HEX; break; default: goto done; break; } fmt++; } done: switch(type) { case TYPE_STRING: s = va_arg(ap, char*); while(*s) *str++ = *s++; break; case TYPE_HEX: x = va_arg(ap, int); hex(&str, x); break; } } *str = 0; return (str - start); }