+struct vsnprintf_aux
+ {
+ char *p;
+ int length;
+ int max_length;
+ };
+
+static void
+vsnprintf_helper (char ch, void *aux_)
+{
+ struct vsnprintf_aux *aux = aux_;
+
+ if (aux->length++ < aux->max_length)
+ *aux->p++ = ch;
+}
+
+int
+vsnprintf (char *buffer, size_t buf_size,
+ const char *format, va_list args)
+{
+ struct vsnprintf_aux aux;
+ aux.p = buffer;
+ aux.length = 0;
+ aux.max_length = buf_size > 0 ? buf_size - 1 : 0;
+
+ vprintf_core (format, args, vsnprintf_helper, &aux);
+
+ if (buf_size > 0)
+ *aux.p = '\0';
+
+ return aux.length;
+}
+
+int
+snprintf (char *buffer, size_t buf_size,
+ const char *format, ...)
+{
+ va_list args;
+
+ va_start (args, format);
+ vsnprintf (buffer, buf_size, format, args);
+ va_end (args);
+}
+\f