#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include "wrappi.h"
-
#include "internal.h"
wrap_h *
{
free (w);
}
+
+static void
+set_error_buf (struct wrap_internal_h *w,
+ char *buf, int errnum, const char *func)
+{
+ free (w->error);
+ w->error = buf;
+ w->errnum = errnum;
+
+ /* 'func' is always statically allocated, since it comes from
+ * C99 __func__, so this is safe.
+ */
+ if (STRPREFIX (func, "impl_"))
+ func += 5;
+ else if (STRPREFIX (func, "wrap_"))
+ func += 5;
+ w->error_func = func;
+
+ /* XXX This will be conditional on the user setting an error handler. */
+ fprintf (stderr, "wrappi: %s: %s\n", func, buf);
+}
+
+void
+wrap_int_set_error (struct wrap_internal_h *w,
+ const char *func,
+ const char *fs, ...)
+{
+ va_list args;
+ char *msg;
+ int err;
+
+ va_start (args, fs);
+ err = vasprintf (&msg, fs, args);
+ va_end (args);
+
+ if (err < 0) return;
+
+ set_error_buf (w, msg, 0, func);
+}
+
+void
+wrap_int_set_error_errno (struct wrap_internal_h *w,
+ int errnum,
+ const char *func,
+ const char *fs, ...)
+{
+ va_list args;
+ char *msg;
+ int err;
+
+ va_start (args, fs);
+ err = vasprintf (&msg, fs, args);
+ va_end (args);
+
+ if (err < 0) return;
+
+ set_error_buf (w, msg, errnum, func);
+}