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
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 \
< $(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)
--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)
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)
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);
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);
}
}
--- /dev/null
+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
+}