]> git.draconx.ca Git - cdecl99.git/blobdiff - src/error.c
Start on a facility to translate error codes into strings.
[cdecl99.git] / src / error.c
index e18ec80091e03539986e687a54dc2ab827975055..30a481e49a1bb6ed88a77691a634eaa5862ec32b 100644 (file)
@@ -21,10 +21,20 @@ struct err_state {
 static struct err_state err_no_mem = {
        .err = {
                .code = CDECL_ENOMEM,
-               .str  = "failed to allocate memory",
+               .str  = NULL,
        },
 };
 
+const char *cdecl__strerror(unsigned code)
+{
+#      include "errtab.h"
+
+       assert(code < sizeof offtab / sizeof offtab[0]);
+       assert(offtab[code] != 0);
+
+       return gettext((char *)&strtab + offtab[code]);
+}
+
 static void free_err(void *err)
 {
        if (err == &err_no_mem)
@@ -36,7 +46,7 @@ static void free_err(void *err)
 static void initialize(void)
 {
        cdecl__init_i18n();
-       err_no_mem.err.str = gettext(err_no_mem.err.str);
+       err_no_mem.err.str = cdecl__strerror(CDECL_ENOMEM);
 
        gl_tls_key_init(tls_key, free_err);
 
@@ -98,6 +108,6 @@ void cdecl__set_error(const struct cdecl_error *err)
                memcpy(state->str, err->str, need_len);
                state->err.str = state->str;
        } else {
-               state->err.str = "unknown error";
+               state->err.str = cdecl__strerror(state->err.code);
        }
 }