]> git.draconx.ca Git - cdecl99.git/commitdiff
Start on a facility to translate error codes into strings.
authorNick Bowler <nbowler@draconx.ca>
Thu, 29 Sep 2011 03:23:12 +0000 (23:23 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sun, 23 Oct 2011 00:20:58 +0000 (20:20 -0400)
This will be needed to port the remaining error messages over.

Makefile.am
src/.gitignore
src/error.c
src/error.h
src/errors.lst [new file with mode: 0644]
src/strtab.sed [new file with mode: 0644]

index f387ee348d3cbbe204294f2d1688cfa130dbdde2..638b071b897a06a13ba5096fc7cd137b66538376 100644 (file)
@@ -20,10 +20,11 @@ AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src \
 MAINTAINERCLEANFILES = src/scan.c src/scan.h src/scan.stamp \
        src/parse.c src/parse.h src/parse.stamp
 
-CLEANFILES = src/typenames.h src/validtypes.h
+CLEANFILES = src/typenames.h src/validtypes.h src/errtab.h
 
 EXTRA_DIST = m4/gnulib-cache.m4 src/types.lst src/typenames.sed \
-       src/validtypes.sed src/parse.stamp src/scan.stamp \
+       src/validtypes.sed src/errors.lst src/strtab.sed \
+       src/parse.stamp src/scan.stamp \
        COPYING.WTFPL2
 
 dist_man_MANS = doc/man/cdecl99.1 doc/man/libcdecl.3
@@ -47,10 +48,14 @@ cdecl99_SOURCES = src/cdecl99.c
 cdecl99_LDADD = libcdecl.la libgnu.la $(LTLIBINTL) $(LTLIBREADLINE)
 $(cdecl99_OBJECTS): $(gnulib_headers)
 
+# Sources that may contain translatable strings.
+POTSOURCES = $(SOURCES) src/errtab.h
+
 src/parse.lo: src/scan.h
 src/scan.lo: src/parse.h
 src/parse-decl.lo: src/scan.h src/parse.h
 src/typemap.lo: src/validtypes.h src/typenames.h
+src/error.lo: src/errtab.h
 
 src/validtypes.h: $(srcdir)/src/types.lst $(srcdir)/src/validtypes.sed
        $(AM_V_GEN)sed -f $(srcdir)/src/validtypes.sed \
@@ -62,6 +67,11 @@ src/typenames.h: $(srcdir)/src/types.lst $(srcdir)/src/typenames.sed
                < $(srcdir)/src/types.lst > $@.tmp
        $(AM_V_at)mv -f $@.tmp $@
 
+src/errtab.h: $(srcdir)/src/errors.lst $(srcdir)/src/strtab.sed
+       $(AM_V_GEN)sed -nf $(srcdir)/src/strtab.sed \
+               < $(srcdir)/src/errors.lst > $@.tmp
+       $(AM_V_at)mv -f $@.tmp $@
+
 # Supporting rules for gettext.
 ALL_MOFILES = $(POFILES:.po=.mo)
 EXTRA_DIST += po/$(PACKAGE).pot po/LINGUAS $(POFILES) $(ALL_MOFILES)
@@ -72,9 +82,9 @@ XGETTEXT_OPTS = -D $(builddir) -D $(srcdir) --from-code=utf-8 \
        --msgid-bugs-address=$(PACKAGE_BUGREPORT) \
        --keyword=_ --keyword=N_
 
-po/$(PACKAGE).pot: $(SOURCES)
+po/$(PACKAGE).pot: $(POTSOURCES)
        $(AM_V_at)$(MKDIR_P) $(@D)
-       $(AM_V_GEN)$(XGETTEXT) $(XGETTEXT_OPTS) -o $@ $(SOURCES)
+       $(AM_V_GEN)$(XGETTEXT) $(XGETTEXT_OPTS) -o $@ $(POTSOURCES)
 
 .po.mo:
        $(AM_V_at)$(MKDIR_P) $(@D)
index 794bd1668fd9fa609aa7b5a50151babe5d481806..8d792bc198d1575316c7f402f0926c84bc64d8ff 100644 (file)
@@ -4,3 +4,4 @@ scan.stamp
 scan.[ch]
 validtypes.h
 typenames.h
+errtab.h
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);
        }
 }
index 2404ab636dfcc11752cecde3b0b7b46d84bafcf1..f7cace945864ef493f44fa6a5248046632452965 100644 (file)
@@ -2,6 +2,7 @@
 #define CDECL_ERROR_H_
 
 struct cdecl_error;
+const char *cdecl__strerror(unsigned code);
 void cdecl__set_error(const struct cdecl_error *err);
 
 #endif
diff --git a/src/errors.lst b/src/errors.lst
new file mode 100644 (file)
index 0000000..f88e92e
--- /dev/null
@@ -0,0 +1,2 @@
+CDECL_ENOMEM   "failed to allocate memory"
+CDECL_ENOPARSE "syntax error"
diff --git a/src/strtab.sed b/src/strtab.sed
new file mode 100644 (file)
index 0000000..a24c6b2
--- /dev/null
@@ -0,0 +1,44 @@
+1i\
+/*\
+ * Copyright © 2011 Nick Bowler.\
+ *\
+ * License WTFPL2: Do What The Fuck You Want To Public License, version 2.\
+ * This is free software: you are free to do what the fuck you want to.\
+ * There is NO WARRANTY, to the extent permitted by law.\
+ */
+1i\
+/*\
+ * This file is automatically generated by strtab.sed.\
+ */
+:clear
+t clear
+s/\([[:upper:]_][[:upper:]_]*\)[[:space:]]*\(".*"\)/\1@#@#@\2/
+t string
+p
+b
+:string
+H
+${
+       g
+       i\
+static const struct strtab {\
+       char _[1];
+       s/\n\([^\n]*\)@#@#@\([^\n]*\)/  char \1[sizeof \2];\
+/g
+       s/\n$//
+       p
+       g
+       i\
+} strtab = {
+       s/\n\([^\n]*\)@#@#@\([^\n]*\)/  .\1 = N_(\2),\
+/g
+       s/$/};/
+       p
+       g
+       i\
+static const size_t offtab[] = {
+       s/\n\([^\n]*\)@#@#@\([^\n]*\)/  [\1] = offsetof(struct strtab, \1),\
+/g
+       s/$/};/
+       p
+}