From: Nick Bowler Date: Thu, 29 Sep 2011 03:23:12 +0000 (-0400) Subject: Start on a facility to translate error codes into strings. X-Git-Tag: v1~90 X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/commitdiff_plain/b712f2d42fe47b7845026b2a3a1ea22569023dd6 Start on a facility to translate error codes into strings. This will be needed to port the remaining error messages over. --- diff --git a/Makefile.am b/Makefile.am index f387ee3..638b071 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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) diff --git a/src/.gitignore b/src/.gitignore index 794bd16..8d792bc 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -4,3 +4,4 @@ scan.stamp scan.[ch] validtypes.h typenames.h +errtab.h diff --git a/src/error.c b/src/error.c index e18ec80..30a481e 100644 --- a/src/error.c +++ b/src/error.c @@ -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); } } diff --git a/src/error.h b/src/error.h index 2404ab6..f7cace9 100644 --- a/src/error.h +++ b/src/error.h @@ -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 index 0000000..f88e92e --- /dev/null +++ b/src/errors.lst @@ -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 index 0000000..a24c6b2 --- /dev/null +++ b/src/strtab.sed @@ -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 +}