#include <config.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <assert.h>
-#include <stdarg.h>
#include "cdecl.h"
#include "cdecl-internal.h"
#include "errmsg.h"
-gl_once_define(static, tls_initialized);
+gl_once_define(static, tls_initialized)
static gl_tls_key_t tls_key;
struct err_state {
}
/*
- * Sets the library error to code, with a printf-style error string.
+ * Sets the library error to code; fmt is a printf-style string that may use
+ * up to one %s directive, to refer to arg.
*/
-void cdecl__err(unsigned code, const char *fmt, ...)
+void cdecl__err(unsigned code, const char *fmt, const char *arg)
{
struct err_state *state;
int rc, try = 0;
- va_list ap;
state = get_err_state();
if (!state)
return;
retry:
- va_start(ap, fmt);
- rc = vsnprintf(state->str, state->nstr, fmt, ap);
- va_end(ap);
-
+ rc = snprintf(state->str, state->nstr, fmt, arg);
if (rc > 0 && rc >= state->nstr) {
assert(try++ == 0 && rc < SIZE_MAX / 4);
state = alloc_err_state(state, (size_t)(rc+1u) * 3 / 2);