/*---------------------------------------------------------------------------*/ #include #include #include /*---------------------------------------------------------------------------*/ struct FmtBuffer { char *pos; size_t left; }; /*---------------------------------------------------------------------------*/ static StrFormatResult buffer_str(void *user_data, const char *data, unsigned int len) { struct FmtBuffer *buffer = (struct FmtBuffer *)user_data; if(len >= buffer->left) { len = buffer->left; len--; } memcpy(buffer->pos, data, len); buffer->pos += len; buffer->left -= len; return STRFORMAT_OK; } /*---------------------------------------------------------------------------*/ int snprintf(char *str, size_t size, const char *format, ...) { int res; va_list ap; va_start(ap, format); res = vsnprintf(str, size, format, ap); va_end(ap); return res; } /*---------------------------------------------------------------------------*/ int vsnprintf(char *str, size_t size, const char *format, va_list ap) { struct FmtBuffer buffer; StrFormatContext ctxt; int res; ctxt.write_str = buffer_str; ctxt.user_data = &buffer; buffer.pos = str; buffer.left = size; res = format_str_v(&ctxt, format, ap); *buffer.pos = '\0'; return res; } /*---------------------------------------------------------------------------*/