More enums.
[wrappi.git] / lib / wrappi.c
index ff223b3..0e45890 100644 (file)
@@ -20,9 +20,9 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdarg.h>
 
 #include "wrappi.h"
-
 #include "internal.h"
 
 wrap_h *
@@ -40,3 +40,61 @@ wrap_close (wrap_h *w)
 {
   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);
+}