#include #include enum TYPE { TYPE_INT = 1, TYPE_UINT = 2, TYPE_HEX = 3, TYPE_STRING = 4 }; int vsprintf(char *str, char *fmt, va_list ap) { char *s; char *start = str; uint8_t type; while(*fmt) { if(*fmt != '%') { *str++ = *fmt++; continue; } fmt++; while(1) { switch(*fmt) { case 's': if(type) goto done; type = TYPE_STRING; break; default: goto done; break; } fmt++; } done: switch(type) { case TYPE_STRING: s = va_arg(ap, char*); while(*s) *str++ = *s++; break; } } *str = 0; return (str - start); }