Using vsnprintf is overkill here. We only need to handle a single %s
conversion, which can be done by direct call to snprintf.
As this is the only caller of vsnprintf, dropping it means we can drop
the vsnprintf gnulib module. Also, at least with gcc, using va_start
and such is fairly expensive. The direct-snprintf version is quite
a bit more compact.
exec 3>lib/symfiles.tmp 4<lib/symfiles.tmp
rm -f lib/symfiles.tmp
exec 3>lib/symfiles.tmp 4<lib/symfiles.tmp
rm -f lib/symfiles.tmp
- shared_modules='lock tls snprintf vsnprintf'
+ shared_modules='lock tls snprintf'
set x --extract-recursive-dependencies $shared_modules; shift
(set -x; $GNULIB/gnulib-tool "$@" >&3 ) || die "gnulib-tool failed"
shared_modules=`LC_ALL=C sort -u <&4`
set x --extract-recursive-dependencies $shared_modules; shift
(set -x; $GNULIB/gnulib-tool "$@" >&3 ) || die "gnulib-tool failed"
shared_modules=`LC_ALL=C sort -u <&4`
# mbswidth \
# readline \
# snprintf \
# mbswidth \
# readline \
# snprintf \
# Specification in the form of a few gnulib-tool.m4 macro invocations:
gl_LOCAL_DIR([])
# Specification in the form of a few gnulib-tool.m4 macro invocations:
gl_LOCAL_DIR([])
])
gl_AVOID([gperf std-gnu11])
gl_SOURCE_BASE([lib])
])
gl_AVOID([gperf std-gnu11])
gl_SOURCE_BASE([lib])
-void cdecl__err(unsigned code, const char *fmt, ...);
+void cdecl__err(unsigned code, const char *fmt, const char *arg);
void cdecl__errmsg(unsigned msg);
struct cdecl_declspec *cdecl__normalize_specs(struct cdecl_declspec *specs);
void cdecl__errmsg(unsigned msg);
struct cdecl_declspec *cdecl__normalize_specs(struct cdecl_declspec *specs);
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include "cdecl.h"
#include "cdecl-internal.h"
#include "cdecl.h"
#include "cdecl-internal.h"
- * 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;
{
struct err_state *state;
int rc, try = 0;
state = get_err_state();
if (!state)
return;
retry:
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);
if (rc > 0 && rc >= state->nstr) {
assert(try++ == 0 && rc < SIZE_MAX / 4);
state = alloc_err_state(state, (size_t)(rc+1u) * 3 / 2);
memset(work2, 'X', len - 1);
tap_diag("cdecl__err w/ %lu-byte string", (unsigned long)len);
memset(work2, 'X', len - 1);
tap_diag("cdecl__err w/ %lu-byte string", (unsigned long)len);
- cdecl__err(1234, work1);
+ cdecl__err(1234, work1, "");
memset(work1, 0, len);
err = cdecl_get_error();
memset(work1, 0, len);
err = cdecl_get_error();