//----------------------------------------------------------------------------// // GNU GPL OS/K // // // // Authors: spectral` // // NeoX // // // // Desc: sprintf()-related functions // //----------------------------------------------------------------------------// #include // // Format str according to fmt using ellipsed arguments // // BE CAREFUL when using this // you need to know for sure an overflow won't happen // int sprintf(char *str, const char *fmt, ...) { int ret; va_list ap; va_start(ap); ret = vsnprintf(str, SIZE_T_MAX, fmt, ap); va_end(ap); return ret; } int vsprintf(char *str, const char *fmt, va_list ap) { return vsnprintf(str, SIZE_T_MAX, fmt, ap); } // // (v)sprintf() but with a size limit: no more than n bytes are written in str // Always null-terminate str // int snprintf(char *str, size_t n, const char *fmt, ...) { int ret; va_list ap; va_start(ap); ret = vsnprintf(str, n, fmt, ap) va_end(ap); return ret; } int vsnprintf(char *str, size_t n, const char *fmt, va_list ap) { int ret = 0; // // Go throught the format string // while (*fmt) { if (*fmt != '%') { // // Even if we don't have any more room we still increase ret // if (ret++ < n) { *str++ = *fmt++; } continue; } switch (*fmt) { case 'd': default: break; } } return ret; }