diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-10-14 15:16:20 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-10-14 15:16:20 +0000 |
commit | b46830f8b2eed0cc9abf1e89f6771b498c88e798 (patch) | |
tree | 91de5eaf6d914b8695e1381a95078769ed7a3abb | |
parent | 6494060312de389feb65ad32bb411fcc64e821b7 (diff) |
- fix locale dependencies and make default locale generation less verbose.
The verbosity can be set to the previous level by passing V=2 to make.
-rw-r--r-- | Makefile.in | 5 | ||||
-rw-r--r-- | Makerules | 14 | ||||
-rw-r--r-- | extra/Configs/Config.in | 2 | ||||
-rw-r--r-- | extra/locale/Makefile.in | 118 | ||||
-rw-r--r-- | extra/locale/gen_collate.c | 234 | ||||
-rw-r--r-- | extra/locale/gen_locale.c | 224 | ||||
-rw-r--r-- | extra/locale/gen_wctype.c | 94 |
7 files changed, 402 insertions, 289 deletions
diff --git a/Makefile.in b/Makefile.in index e698c6466..5b666b891 100644 --- a/Makefile.in +++ b/Makefile.in @@ -20,10 +20,6 @@ sub_headers := headers ifeq ($(HAVE_DOT_CONFIG),y) all: pregen libs - -# To be able to build the libs rule, we must first have the generated headers. -# This is needed when locale support is enabled, but also ensures that the -# build process is parallel safe. libs: pregen # In this section, we need .config @@ -61,7 +57,6 @@ ifeq ($(HAVE_DOT_CONFIG),y) # on spot to save us from alot of hazzle. include/bits/uClibc_config.h: extra/config/conf .config $(top_srcdir)extra/scripts/conf-header.sh | include/bits @$(disp_gen) - @#superfluous: $(Q)$(INSTALL) -d $(dir $@) $(Q)@$< -s $(top_srcdir)extra/Configs/Config.in $(Q)$(top_srcdir)extra/scripts/conf-header.sh .config > $@ $(Q)$(MAKE) headers-y @@ -91,6 +91,7 @@ pur_disp_ln = echo " "LN $@ pur_disp_mkdir = echo " "MKDIR $@ pur_disp_gen = echo " "GEN $@ pur_disp_unifdef = echo " "UNIFDEF $@ +pur_disp_rm = echo " "CLEAN $($@) sil_disp_compile.c = true sil_disp_compile.i = true @@ -109,6 +110,7 @@ sil_disp_ln = true sil_disp_mkdir = true sil_disp_gen = true sil_disp_unifdef = true +sil_disp_rm = true ver_disp_compile.c = echo $(cmd_compile.c) ver_disp_compile.i = echo $(cmd_compile.i) @@ -127,6 +129,7 @@ ver_disp_ln = ver_disp_mkdir = ver_disp_gen = ver_disp_unifdef = echo $(cmd_unifdef) +ver_disp_rm = echo $(cmd_rm) disp_compile.c = $($(DISP)_disp_compile.c) disp_compile.i = $($(DISP)_disp_compile.i) @@ -145,6 +148,7 @@ disp_ln = $($(DISP)_disp_ln) disp_mkdir = $($(DISP)_disp_mkdir) disp_gen = $($(DISP)_disp_gen) disp_unifdef = $($(DISP)_disp_unifdef) +disp_rm = $($(DISP)_disp_rm) any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) @@ -196,6 +200,12 @@ define do_ln $(Q)$(LN) -fs endef + +#define RM +# @$(disp_rm) +# $(RM_COMMAND) +#endef + compile.c = @$(call maybe_exec,compile.c) compile.i = $(call maybe_exec,compile.i) compile.s = $(call maybe_exec,compile.s) @@ -205,8 +215,8 @@ compile-m = @$(disp_compile-m) ; $(cmd_compile-m) ; $(cmd_t_strip) do_strip = @$(disp_strip) ; $(cmd_strip) do_t_strip= @$(disp_t_strip) ; $(cmd_t_strip) do_unifdef= @$(disp_unifdef) ; $(cmd_unifdef) -hcompile.u= @$(call maybe_exec,hcompile.u) -hcompile.o= @$(call maybe_exec,hcompile.o) +hcompile.u= @$(disp_hcompile.u); $(cmd_hcompile.u) +hcompile.o= @$(disp_hcompile.o); $(cmd_hcompile.o) define do_ar @$(disp_ar) ; $(cmd_ar) diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index b54c5ab43..8ea6eeb01 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -730,7 +730,7 @@ config UCLIBC_LINUX_SPECIFIC default y help fstatfs(), inotify_*(), ioperm(), iopl(), madvise(), modify_ldt(), - personality(), ppoll(), setresuid() + personality(), ppoll(), setresuid(), signalfd() config UCLIBC_HAS_GNU_ERROR bool "Support GNU extensions for error-reporting" diff --git a/extra/locale/Makefile.in b/extra/locale/Makefile.in index 27a11612b..54f7a4557 100644 --- a/extra/locale/Makefile.in +++ b/extra/locale/Makefile.in @@ -19,24 +19,24 @@ BUILD_CFLAGS-locale-common := \ -DUCLIBC_CTYPE_HEADER='"include/bits/uClibc_ctype.h"' BUILD_CFLAGS-gen_wc8bit := $(BUILD_CFLAGS-locale-common) -DCTYPE_PACKED=1 - BUILD_CFLAGS-gen_wctype := $(BUILD_CFLAGS-locale-common) - BUILD_CFLAGS-gen_ldc := ifeq ($(UCLIBC_HAS_WCHAR),y) BUILD_CFLAGS-gen_wc8bit += -DDO_WIDE_CHAR=1 BUILD_CFLAGS-gen_ldc += -D__WCHAR_ENABLED=1 endif - BUILD_CFLAGS-gen_locale := -D_GNU_SOURCE -I$(locale_OUT) BUILD_CFLAGS-gen_collate := -D_GNU_SOURCE -DEPH-locale := $(top_builddir)include/bits/sysnum.h -DEPH-gen_locale := $(addprefix $(locale_OUT)/,c8tables.h) $(DEPH-locale) +locale_headers-$(UCLIBC_HAS_LOCALE) := $(top_builddir)include/bits/uClibc_locale_data.h + +#DEPH-locale := $(top_builddir)include/bits/sysnum.h +DEPH-locale := $(top_builddir)include/bits/uClibc_config.h +DEPH-gen_collate := $(DEPH-locale) DEPH-gen_ldc := $(addprefix $(locale_OUT)/,c8tables.h wctables.h locale_tables.h locale_collate.h) $(DEPH-locale) +DEPH-gen_locale := $(addprefix $(locale_OUT)/,c8tables.h) $(DEPH-locale) DEPH-gen_wc8bit := $(top_builddir)/include/bits/uClibc_ctype.h $(DEPH-locale) DEPH-gen_wctype := $(top_builddir)/include/bits/uClibc_ctype.h $(DEPH-locale) -DEPH-gen_collate := $(DEPH-locale) locale_HOBJ := gen_collate gen_ldc gen_locale gen_wc8bit gen_wctype locale_HOBJ := $(addprefix $(locale_OUT)/,$(locale_HOBJ)) @@ -46,13 +46,14 @@ locale_OBJ := $(locale_OUT)/locale_data.o CFLAGS-locale_data.c := -D__WCHAR_ENABLED -I$(locale_OUT) -I$(locale_DIR) -headers-$(UCLIBC_HAS_LOCALE) += $(top_builddir)include/bits/uClibc_locale_data.h +#headers-$(UCLIBC_HAS_LOCALE) += $(locale_headers-y) +headers: $(locale_headers-y) libc-$(UCLIBC_HAS_LOCALE) += $(locale_OBJ) libc-nomulti-$(UCLIBC_HAS_LOCALE) += $(locale_OBJ) -locale_headers: $(top_builddir)include/bits/uClibc_locale_data.h +locale_headers: headers $(top_builddir)include/bits/uClibc_locale_data.h # make sure that the host system has locales (this check is ok for uClibc/glibc) # we do not know though which locales were really enabled for libc at build time @@ -64,7 +65,7 @@ $(locale_OUT)/codesets.txt: echo " "; \ echo "You do not have a codesets.txt file. Please create this "; \ echo "file in the $(locale_OUT) directory by running something like: "; \ - echo " cd $(locale_DIR) && find charmaps -name \"*.pairs\" > \\"; \ + echo " cd $(locale_DIR)/ && find charmaps -name \"*.pairs\" > \\"; \ echo " $@"; \ echo "and then edit that file to disable/enable the codesets you wish to support. "; \ echo " "; \ @@ -89,70 +90,88 @@ $(locale_OUT)/locales.txt: else $(locale_OUT)/codesets.txt: + @$(disp_gen) ifeq ($(UCLIBC_BUILD_MINIMAL_LOCALE),y) - echo "charmaps/ASCII.pairs" > $@ ; \ - echo "charmaps/ISO-8859-1.pairs" >> $@ + $(Q)echo "charmaps/ASCII.pairs" > $@ ; \ + $(Q)echo "charmaps/ISO-8859-1.pairs" >> $@ else - (cd $(locale_DIR)/ && find charmaps/ -name '*.pairs' | sort ) > $@ + $(Q)(cd $(locale_DIR)/ && find charmaps/ -name '*.pairs' | sort ) > $@ endif # the lines beginning w/ '#-' are mandatory # at least one conversion is needed (euro/cyrillic) $(locale_OUT)/locales.txt: $(locale_DIR)/LOCALES + @$(disp_gen) ifeq ($(UCLIBC_BUILD_MINIMAL_LOCALE),y) - echo "@euro e" > $@ ; \ - echo "#-" >> $@ ; \ - echo "UTF-8 yes" >> $@ ; \ - echo "8-BIT yes" >> $@ ; \ - echo "#-" >> $@ ; \ - echo "en_US.UTF-8 UTF-8" >> $@ ; \ - echo "en_US ISO-8859-1" >> $@ + $(Q)echo "@euro e" > $@ ; \ + $(Q)echo "#-" >> $@ ; \ + $(Q)echo "UTF-8 yes" >> $@ ; \ + $(Q)echo "8-BIT yes" >> $@ ; \ + $(Q)echo "#-" >> $@ ; \ + $(Q)echo "en_US.UTF-8 UTF-8" >> $@ ; \ + $(Q)echo "en_US ISO-8859-1" >> $@ else - cp $< $@ + $(Q)cat $< > $@ endif endif -# FIXME: Perhaps this would work with secondary expansion like approximately -#$(locale_HOBJ): $(locale_OUT)/% : $(locale_DIR)/%.c | $$(DEPH-%) -# $(hcompile.u) - -$(locale_OUT)/gen_collate : $(locale_DIR)/gen_collate.c | $(DEPH-gen_collate) +$(locale_DIR)/gen_collate.c: $(DEPH-gen_collate) +$(locale_OUT)/gen_collate : $(locale_DIR)/gen_collate.c $(hcompile.u) - -$(locale_OUT)/gen_ldc : $(locale_DIR)/gen_ldc.c | $(DEPH-gen_ldc) +$(locale_DIR)/gen_ldc.c: $(DEPH-gen_ldc) +$(locale_OUT)/gen_ldc : $(locale_DIR)/gen_ldc.c $(hcompile.u) - -$(locale_OUT)/gen_locale : $(locale_DIR)/gen_locale.c | $(DEPH-gen_locale) +$(locale_DIR)/gen_locale.c: $(DEPH-gen_locale) +$(locale_OUT)/gen_locale : $(locale_DIR)/gen_locale.c $(hcompile.u) - -$(locale_OUT)/gen_wc8bit : $(locale_DIR)/gen_wc8bit.c | $(DEPH-gen_wc8bit) +$(locale_DIR)/gen_wc8bit.c: $(DEPH-gen_wc8bit) +$(locale_OUT)/gen_wc8bit : $(locale_DIR)/gen_wc8bit.c $(hcompile.u) - -$(locale_OUT)/gen_wctype : $(locale_DIR)/gen_wctype.c | $(DEPH-gen_wctype) +$(locale_DIR)/gen_wctype.c: $(DEPH-gen_wctype) +$(locale_OUT)/gen_wctype : $(locale_DIR)/gen_wctype.c $(hcompile.u) +ifneq ($(V),) +ifeq ($(V),1) +FLAG-locale-verbose := -v +endif +ifeq ($(V),2) +FLAG-locale-verbose := -v -v +endif +endif + # code needs to be modified to support top_builddir in almost all apps that write directly to a file # grep fopen *.c $(locale_OUT)/c8tables.h: $(locale_OUT)/gen_wc8bit $(locale_OUT)/codesets.txt - (cd $(<D) && ./$(<F) `cat $(word 2,$(^F))`) + @$(disp_gen) + $(Q)(cd $(<D) && ./$(<F) `cat $(word 2,$(^F))`) # Warning! Beware tr_TR toupper/tolower exceptions! $(locale_OUT)/wctables.h: $(locale_OUT)/gen_wctype - (cd $(<D) ; ./$(<F) en_US || ./$(<F) en_US.UTF-8 \ - || ./$(<F) en_US.iso8859-1 \ - || ./$(<F) en_GB || ./$(<F) en_GB.UTF-8) + @$(disp_gen) + $(Q)(cd $(<D) || exit 1 ; \ + ./$(<F) $(FLAG-locale-verbose) en_US || \ + ./$(<F) $(FLAG-locale-verbose) en_US.UTF-8 || \ + ./$(<F) $(FLAG-locale-verbose) en_US.iso8859-1 || \ + ./$(<F) $(FLAG-locale-verbose) en_GB || \ + ./$(<F) $(FLAG-locale-verbose) en_GB.UTF-8 \ + ) $(locale_OUT)/locale_tables.h: $(locale_OUT)/gen_locale $(locale_OUT)/locales.txt - $< $(word 2,$^) $@ + @$(disp_gen) + $(Q)$< $(FLAG-locale-verbose) -o $@ $(word 2,$^) $(locale_OUT)/lt_defines.h: $(locale_OUT)/locale_tables.h $(locale_OUT)/locale_collate.h - grep "^#define" $< > $@ - grep "^#define __lc" $(word 2,$^) >> $@ + @$(disp_gen) + $(Q)grep "^#define" $< > $@ + $(Q)grep "^#define __lc" $(word 2,$^) >> $@ $(locale_OUT)/locale_collate.h: $(locale_OUT)/gen_collate $(locale_OUT)/locale_tables.h - grep COL_IDX_ $(word 2,$^) | $(SED) -e "s/^.*COL_IDX_\([^, ]*\).*$$/\1/" | \ - sort | uniq | (cd $(<D) && xargs ./$(<F)) + @$(disp_gen) + $(Q)grep COL_IDX_ $(word 2,$^) | \ + $(SED) -e "s/^.*COL_IDX_\([^, ]*\).*$$/\1/" | sort | uniq | \ + xargs $< $(locale_DIR)/collation $(FLAG-locale-verbose) -o $@ $(locale_OUT)/$(LOCALE_DATA_FILENAME): ifeq ($(UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA),y) @@ -167,23 +186,28 @@ $(locale_SRC): $(locale_OUT)/$(LOCALE_DATA_FILENAME) # we use the one in locale_DIR #$(RM) $(locale_OUT)/locale_mmap.h -# for arch specific versions we have to at least overwrite lt_defines.h/locale_data.c/uClibc_locale_data.h +# for arch specific versions we have to at least overwrite +# lt_defines.h/locale_data.c/uClibc_locale_data.h $(locale_OUT)/uClibc_locale_data.h: $(locale_SRC) else $(locale_SRC): $(locale_OUT)/gen_ldc $(locale_OUT)/lt_defines.h - $< $@ + @$(disp_gen) + $(Q)$< $@ $(locale_OUT)/uClibc_locale_data.h: $(locale_OUT)/lt_defines.h $(locale_OUT)/c8tables.h $(locale_OUT)/wctables.h $(locale_DIR)/locale_mmap.h | $(locale_SRC) - grep -v "define __LC" $< > $@ - cat $(wordlist 2,4,$^) >> $@ + @$(disp_gen) + $(Q)grep -v "define __LC" $< > $@ + $(Q)cat $(wordlist 2,4,$^) >> $@ endif $(top_builddir)include/bits/uClibc_locale_data.h: $(locale_OUT)/uClibc_locale_data.h | $(top_builddir)include/bits/uClibc_config.h - cat $< | $(AWK) 'BEGIN{i=1}{ if ( /WANT_/ ) i = /endif/ ; else if (i) print $0 }' > $@ + @$(disp_gen) + $(Q)$(AWK) 'BEGIN{i=1}{if (/WANT_/) i=/endif/;else if (i) print $0}' \ + $< > $@ objclean-y += locale_clean diff --git a/extra/locale/gen_collate.c b/extra/locale/gen_collate.c index 58464a2a8..44f6215b6 100644 --- a/extra/locale/gen_collate.c +++ b/extra/locale/gen_collate.c @@ -1,3 +1,12 @@ +/* + * Usage: + * gen_collate <INPUTDIR> [-o OUTPUTFILE] LOCALE ... + * + * Generate collation data from locales LOCALE. + * Reads all LOCALE from INPUTDIR and writes collation data to OUTPUTFILE. + * + * The output file defaults to "locales_collate.h". + */ /* TODO: * * add UNDEFINED at end if not specified @@ -24,6 +33,7 @@ #include <limits.h> #include <ctype.h> #include <assert.h> +#include <errno.h> #include <search.h> typedef struct { @@ -253,6 +263,14 @@ static void *root_sym = NULL; static size_t num_sym = 0; static size_t mem_sym = 0; +static const char *inputdir; +static size_t inputdir_len; +static unsigned verbose = 0; +enum { + VINFO = (1<<0), + VDETAIL = (1<<1), +}; + static void error_msg(const char *fmt, ...) __attribute__ ((noreturn, format (printf, 1, 2))); static void *xmalloc(size_t n); static char *xsymdup(const char *s); /* only allocate once... store in a tree */ @@ -294,6 +312,18 @@ enum { DT_RANGE = 0x10, }; +static int verbose_msg(const unsigned lvl, const char *fmt, ...) +{ + va_list arg; + int ret = 0; + + if (verbose & lvl) { + va_start(arg, fmt); + ret = vfprintf(stderr, fmt, arg); + va_end(arg); + } + return ret; +} static section_t *new_section(const char *name) { section_t *p; @@ -310,7 +340,7 @@ static section_t *new_section(const char *name) ++anonsection; } #warning devel code -/* fprintf(stderr, "section %s\n", name); */ +/* verbose_msg(VDETAIL, "section %s\n", name); */ p->name = xsymdup(name); p->itm_list = NULL; p->num_items = 0; @@ -328,7 +358,7 @@ static section_t *new_section(const char *name) p->rules[3] |= R_POSITION; cur_rule[3] |= R_POSITION; } -/* fprintf(stderr, "new section %s -- cur_num_weights = %d\n", p->name, cur_num_weights); */ +/* verbose_msg(VDETAIL, "new section %s -- cur_num_weights = %d\n", p->name, cur_num_weights); */ return p; } @@ -379,7 +409,7 @@ static void do_unrecognized(void) #if 1 error_msg("warning: unrecognized: %s", pos); #else -/* fprintf(stderr, "warning: unrecognized initial keyword \"%s\"\n", pos); */ +/* verbose_msg(VDETAIL, "warning: unrecognized initial keyword \"%s\"\n", pos); */ fprintf(stderr, "warning: unrecognized: %s", pos); if (end_of_token) { fprintf(stderr, "%c%s", end_of_token, pos_e+1); @@ -587,10 +617,10 @@ static void add_superset_weight(char *t) lli = new_ll_item(DT_REORDER, cur_section); lli->prev = lli->next = lli; insque(lli, comm_prev_ptr); -/* fprintf(stderr, " subsection -----------------------\n"); */ +/* verbose_msg(VDETAIL, " subsection -----------------------\n"); */ } -/* fprintf(stderr, " %s %s\n", t, ((weighted_item_t *)(comm_cur_ptr->data))->symbol); */ +/* verbose_msg(VDETAIL, " %s %s\n", t, ((weighted_item_t *)(comm_cur_ptr->data))->symbol); */ wi = add_weight(t); lli = new_ll_item(DT_WEIGHTED, wi); mark_reordered(wi->symbol); @@ -745,7 +775,7 @@ static void processfile(void) } if (cur_base == cur_col) { - fprintf(stderr, "Base: %15s", cur_col->name); + verbose_msg(VDETAIL, "Base: %15s", cur_col->name); } else { #if 1 if (!cur_col->undefined_idx) { @@ -794,20 +824,21 @@ static void processfile(void) } #endif - fprintf(stderr, " Der: %15s", cur_col->name); + verbose_msg(VDETAIL, " Der: %15s", cur_col->name); } { +#if 0 ll_item_t *p = cur_col->section_list; - - fprintf(stderr, "%6u weights", tnumnodes(cur_col->root_wi_index)); +#endif + verbose_msg(VDETAIL, "%6u weights", tnumnodes(cur_col->root_wi_index)); if (cur_base) { - fprintf(stderr, " %6u der %6u reor %6u starter - %u new stubs", + verbose_msg(VDETAIL, " %6u der %6u reor %6u starter - %u new stubs", tnumnodes(cur_base->root_derived_wi), tnumnodes(cur_base->root_wi_index_reordered), tnumnodes(cur_base->root_starter_char), ll_count(cur_col->section_list, DT_REORDER)); } - fprintf(stderr, "\n"); + verbose_msg(VDETAIL, "\n"); #if 0 while (p) { @@ -826,7 +857,7 @@ static void processfile(void) if ((*((section_t *)(p->data))->name != 'a') || (((section_t *)(p->data))->num_items > 0) ) { - fprintf(stderr, + verbose_msg(VDETAIL, /* "\t%-15s %zu\n", */ "\t%-15s %6u\n", ((section_t *)(p->data))->name, @@ -1089,18 +1120,35 @@ int main(int argc, char **argv) ll_item_t *lli; int i; int total; + char *output_file = "locale_collate.h"; + unsigned verbosity = 0; - if (argc < 2) { + if (argc < 3) { return EXIT_FAILURE; } - + --argc; + inputdir = strdup(*++argv); + inputdir_len = strlen(inputdir); init_locale_list(); while (--argc) { - p = (const deps_t *) bsearch(*++argv, deps, sizeof(deps)/sizeof(deps[0]), sizeof(deps[0]), dep_cmp); + ++argv; + if (!strcmp(*argv, "-o")) { + --argc; + if (*++argv == NULL) { + printf("-o <outfile> requires an argument\n"); + return EXIT_FAILURE; + } + output_file = strdup(*argv); + continue; + } else if (!strcmp(*argv, "-v")) { + verbosity++; + continue; + } + p = (const deps_t *) bsearch(*argv, deps, sizeof(deps)/sizeof(deps[0]), sizeof(deps[0]), dep_cmp); if (!p) { if (!strcmp("C", *argv)) { - printf("ignoring C locale\n"); + printf("ignoring %s locale\n", *argv); continue; } else { printf("%s not found\n", *argv); @@ -1125,10 +1173,10 @@ int main(int argc, char **argv) total = 0; for (i=0 ; i < BASE_MAX ; i++) { -/* printf("der_count[%2d] = %3d\n", i, der_count[i]); */ +/* printf("der_count[%2d] = %3d\n", i, der_count[i]); */ total += der_count[i]; } -/* printf("total = %d\n", total); */ +/* printf("total = %d\n", total); */ new_args[new_arg_count++] = "dummyprogramname"; for (i=0 ; i < BASE_MAX ; i++) { @@ -1143,11 +1191,16 @@ int main(int argc, char **argv) } while (lli != locale_list[i]); new_args[new_arg_count++] = "-f"; } + for (i=0; i < verbosity; i++) + new_args[new_arg_count++] = "-v"; -/* for (i=0 ; i < new_arg_count ; i++) { */ -/* printf("%3d: %s\n", i, new_args[i]); */ -/* } */ - + new_args[new_arg_count++] = "-o"; + new_args[new_arg_count++] = output_file; +/* + for (i=0 ; i < new_arg_count ; i++) { + printf("%3d: %s\n", i, new_args[i]); + } +*/ return old_main(new_arg_count, (char **) new_args); } @@ -1158,6 +1211,7 @@ static int old_main(int argc, char **argv) { int next_is_base = 0; int next_is_subset = 0; + char *output_file = NULL; superset = 0; @@ -1185,6 +1239,11 @@ static int old_main(int argc, char **argv) next_is_subset = 0; next_is_base = 2; superset = 0; + } else if (((*argv)[1] == 'o') && !(*argv)[2]) { /* output file */ + --argc; + output_file = *++argv; + } else if (((*argv)[1] == 'v') && !(*argv)[2]) { /* verbose */ + ++verbose; } else { error_msg("unrecognized option %s", *argv); } @@ -1198,7 +1257,7 @@ static int old_main(int argc, char **argv) cur_derived = cur_col; } pushfile(*argv); -/* fprintf(stderr, "processing file %s\n", *argv); */ +/* verbose_msg(VDETAIL, "processing file %s\n", *argv); */ processfile(); /* this does a popfile */ /* twalk(cur_col->root_colitem, print_colnode); */ @@ -1212,17 +1271,17 @@ static int old_main(int argc, char **argv) } } - fprintf(stderr, "success!\n"); - fprintf(stderr, + verbose_msg(VINFO, "success!\n"); + verbose_msg(VINFO, /* "num_sym=%zu mem_sym=%zu unique_weights=%zu\n", */ "num_sym=%u mem_sym=%u unique_weights=%u\n", num_sym, mem_sym, unique_weights); /* twalk(root_weight, print_weight_node); */ - fprintf(stderr, "num base locales = %d num derived locales = %d\n", + verbose_msg(VINFO, "num base locales = %d num derived locales = %d\n", base_locale_len, der_locale_len); - fprintf(stderr, + verbose_msg(VINFO, "override_len = %d multistart_len = %d weightstr_len = %d\n" "wcs2colidt_len = %d index2weight_len = %d index2ruleidx_len = %d\n" "ruletable_len = %d\n" @@ -1250,10 +1309,10 @@ static int old_main(int argc, char **argv) #endif { - FILE *fp = fopen("locale_collate.h", "w"); + FILE *fp = fopen(output_file, "w"); if (!fp) { - error_msg("cannot open output file!"); + error_msg("cannot open output file '%s'!", output_file); } dump_collate(fp); if (ferror(fp) || fclose(fp)) { @@ -1282,20 +1341,23 @@ static void error_msg(const char *fmt, ...) static void pushfile(char *filename) { - static char fbuf[PATH_MAX]; - - snprintf(fbuf, PATH_MAX, "collation/%s", filename); + char *inputfile; + size_t inputfile_len; if (fno >= MAX_FNO) { error_msg("file stack size exceeded"); } - if (!(fstack[++fno] = fopen(fbuf, "r"))) { + inputfile_len = inputdir_len + strlen(filename) + 2; + inputfile = xmalloc(inputfile_len); + memset(inputfile, 0, inputfile_len); + sprintf(inputfile, "%s/%s", inputdir, filename); + if (!(fstack[++fno] = fopen(inputfile, "r"))) { --fno; /* oops */ - error_msg("cannot open file %s", fbuf); + error_msg("cannot open file %s: %s", inputfile, strerror(errno)); } - fname[fno] = xsymdup(filename); + fname[fno] = xsymdup(inputfile); lineno[fno] = 0; } @@ -1452,11 +1514,11 @@ static void do_copy(void) *e = 0; ++s; if (cur_base && !strcmp(cur_base->name,s)) { -/* fprintf(stderr, "skipping copy of base file %s\n", s); */ +/* verbose_msg(VDETAIL, "skipping copy of base file %s\n", s); */ #warning need to update last in order and position or check return; } -/* fprintf(stderr, "full copy of %s\n", s); */ +/* verbose_msg(VDETAIL, "full copy of %s\n", s); */ pushfile(s); return; } @@ -1541,7 +1603,7 @@ static ll_item_t *find_section_list_item(const char *name, col_locale_t *loc) while (p) { #warning devel code /* if (!((p->data_type == DT_SECTION) || (p->data_type == DT_REORDER))) { */ -/* fprintf(stderr, "fsli = %d\n", p->data_type); */ +/* verbose_msg(VDETAIL, "fsli = %d\n", p->data_type); */ /* } */ assert((p->data_type == DT_SECTION) || (p->data_type == DT_REORDER)); if (!strcmp(name, ((section_t *)(p->data))->name)) { @@ -1685,11 +1747,11 @@ static void add_colitem(char *item, char *def) #warning devel code if (superset) { if (tfind(p, &cur_base->root_colitem, colitem_cmp)) { -/* fprintf(stderr, "skipping superset duplicate collating item \"%s\"\n", p->string); */ +/* verbose_msg(VDETAIL, "skipping superset duplicate collating item \"%s\"\n", p->string); */ del_colitem(p); return; /* } else { */ -/* fprintf(stderr, "superset: new collating item \"%s\" = %s\n", p->string, p->element); */ +/* verbose_msg(VDETAIL, "superset: new collating item \"%s\" = %s\n", p->string, p->element); */ } } @@ -1850,7 +1912,7 @@ static void do_order_start(void) cur_section = sect; -/* fprintf(stderr, "setting cur_num_weights to %d for %s\n", sect->num_rules, sect->name); */ +/* verbose_msg(VDETAIL, "setting cur_num_weights to %d for %s\n", sect->num_rules, sect->name); */ cur_num_weights = sect->num_rules; memcpy(cur_rule, sect->rules, MAX_COLLATION_WEIGHTS); } @@ -1923,7 +1985,7 @@ static void do_reorder_after(void) insque(l1, l2); l3 = find_ll_last(cur_col->section_list); - fprintf(stderr, "reorder_after %p %p %p %s\n", l1, l2, l3, cur_section->name); + verbose_msg(VDETAIL, "reorder_after %p %p %p %s\n", l1, l2, l3, cur_section->name); } #else insque(new_ll_item(DT_REORDER, cur_section), find_ll_last(cur_col->section_list)); @@ -1935,7 +1997,7 @@ static void do_reorder_after(void) #warning devel code -/* fprintf(stderr, "reorder -- %s %d\n", ((weighted_item_t *)(lli->data))->symbol, w->num_weights); */ +/* verbose_msg(VDETAIL, "reorder -- %s %d\n", ((weighted_item_t *)(lli->data))->symbol, w->num_weights); */ #warning hack to get around hu_HU reorder-after problem /* if (!w->num_weights) { */ @@ -1945,7 +2007,7 @@ static void do_reorder_after(void) /* memcpy(cur_rule, w->rule, MAX_COLLATION_WEIGHTS); */ /* } */ -/* fprintf(stderr, "reorder_after succeeded for %s\n", t); */ +/* verbose_msg(VDETAIL, "reorder_after succeeded for %s\n", t); */ } static void do_reorder_end(void) @@ -1986,9 +2048,9 @@ static void do_reorder_sections_after(void) lli = cur_base->section_list; do { -/* fprintf(stderr, "hmm -- |%s|%d|\n", ((section_t *)(lli->data))->name, lli->data_type); */ +/* verbose_msg(VDETAIL, "hmm -- |%s|%d|\n", ((section_t *)(lli->data))->name, lli->data_type); */ if (lli->data_type & DT_SECTION) { -/* fprintf(stderr, "checking |%s|%s|\n", ((section_t *)(lli->data))->name, t); */ +/* verbose_msg(VDETAIL, "checking |%s|%s|\n", ((section_t *)(lli->data))->name, t); */ if (!strcmp(((section_t *)(lli->data))->name, t)) { reorder_section_ptr = lli; return; @@ -2025,7 +2087,7 @@ static ll_item_t *new_ll_item(int data_type, void *data) static int sym_cmp(const void *n1, const void *n2) { -/* fprintf(stderr, "sym_cmp: |%s| |%s|\n", (const char *)n1, (const char *)n2); */ +/* verbose_msg(VDETAIL, "sym_cmp: |%s| |%s|\n", (const char *)n1, (const char *)n2); */ return strcmp((const char *) n1, (const char *) n2); } @@ -2039,9 +2101,9 @@ static char *xsymdup(const char *s) } ++num_sym; mem_sym += strlen(s) + 1; -/* fprintf(stderr, "xsymdup: alloc |%s| %p |%s| %p\n", *(char **)p, p, s, s); */ +/* verbose_msg(VDETAIL, "xsymdup: alloc |%s| %p |%s| %p\n", *(char **)p, p, s, s); */ /* } else { */ -/* fprintf(stderr, "xsymdup: found |%s| %p\n", *(char **)p, p); */ +/* verbose_msg(VDETAIL, "xsymdup: found |%s| %p\n", *(char **)p, p); */ } return *(char **) p; } @@ -2079,7 +2141,7 @@ static weight_t *register_weight(weight_t *w) } ++unique_weights; /* } else { */ -/* fprintf(stderr, "rw: found\n"); */ +/* verbose_msg(VDETAIL, "rw: found\n"); */ } return *(weight_t **)p; } @@ -2200,7 +2262,7 @@ static void add_final_col_index(const char *s) ci.element = NULL; /* don't care */ v = tfind(&ci, &cur_base->root_colitem, colitem_cmp); if (!v) { - fprintf(stderr, "%s NOT DEFINED!!!\n", s); + verbose_msg(VDETAIL, "%s NOT DEFINED!!!\n", s); } else { p = *((colitem_t **) v); if (p->element != NULL) { @@ -2347,11 +2409,11 @@ static ll_item_t *init_comm_ptr(void) #warning devel code /* { */ /* ll_item_t *p = comm_cur_ptr; */ -/* fprintf(stderr, "init_comm_ptr\n"); */ +/* verbose_msg(VDETAIL, "init_comm_ptr\n"); */ /* while (p != comm_cur_ptr) { */ /* if (p->data_type & DT_WEIGHTED) { */ -/* fprintf(stderr, "%s", ((weighted_item_t *)p)->symbol); */ +/* verbose_msg(VDETAIL, "%s", ((weighted_item_t *)p)->symbol); */ /* } */ /* p = p->next; */ /* } */ @@ -2359,7 +2421,7 @@ static ll_item_t *init_comm_ptr(void) assert(comm_cur_ptr); -/* fprintf(stderr, "init_comm_ptr -- %s %p %p %p %d\n", */ +/* verbose_msg(VDETAIL, "init_comm_ptr -- %s %p %p %p %d\n", */ /* ((weighted_item_t *)(comm_cur_ptr->data))->symbol, */ /* comm_cur_ptr, comm_cur_ptr->prev, comm_cur_ptr->next, */ /* ll_len(comm_cur_ptr)); */ @@ -2625,7 +2687,7 @@ static void finalize_base(void) for (s = cur_base->section_list ; s ; s = s->next) { #if 1 if (s->data_type & DT_REORDER) { /* a reordered section */ - fprintf(stderr, "pass1: reordered section %s - xxx\n", ((section_t *)(s->data))->name); + verbose_msg(VDETAIL, "pass1: reordered section %s - xxx\n", ((section_t *)(s->data))->name); lli = ((section_t *)(s->data))->itm_list; r = 0; if (lli) { @@ -2635,7 +2697,7 @@ static void finalize_base(void) if (r > mr) { mr = r; } - fprintf(stderr, "pass1: reordered section %s - %d\n", ((section_t *)(s->data))->name, r); + verbose_msg(VDETAIL, "pass1: reordered section %s - %d\n", ((section_t *)(s->data))->name, r); continue; } #endif @@ -2652,11 +2714,11 @@ static void finalize_base(void) lli->idx = i; assert(!rli); rli = lli; - fprintf(stderr, "range pre = %d after = ", i); + verbose_msg(VDETAIL, "range pre = %d after = ", i); i += ((range_item_t *)(lli->data))->length + 1; #warning check ko_kR and 9 /* ++i; */ - fprintf(stderr, "%d\n", i); + verbose_msg(VDETAIL, "%d\n", i); if (!index2weight_len_inc) { /* ko_KR hack */ final_index += ((range_item_t *)(lli->data))->length + 1; } @@ -2726,7 +2788,7 @@ static void finalize_base(void) /* cur_base->name, lli->idx, final_index_val(w->symbol), w->symbol); */ } else { -/* fprintf(stderr, "section: %s %d %d\n", ((section_t *)(s->data))->name, */ +/* verbose_msg(VDETAIL, "section: %s %d %d\n", ((section_t *)(s->data))->name, */ /* s->data_type, lli->data_type); */ /* assert(!(s->data_type & DT_REORDER)); */ /* assert(lli->data_type & DT_REORDER); */ @@ -2772,7 +2834,7 @@ static void finalize_base(void) mr = mi; for (cli = cur_base->derived_list ; cli ; cli = cli->next) { cl = (col_locale_t *)(cli->data); -/* fprintf(stderr, "pass3: %d %s\n", cli->data_type, cl->name); */ +/* verbose_msg(VDETAIL, "pass3: %d %s\n", cli->data_type, cl->name); */ /* fprintf(stdout, "pass3: %d %s\n", cli->data_type, cl->name); */ @@ -2790,7 +2852,7 @@ static void finalize_base(void) do { assert(!(lli->data_type & DT_RANGE)); if (lli->data_type & DT_WEIGHTED) { -/* fprintf(stderr, " %d %d %s\n", lli->data_type, lli->idx, ((weighted_item_t *)(lli->data))->symbol); */ +/* verbose_msg(VDETAIL, " %d %d %s\n", lli->data_type, lli->idx, ((weighted_item_t *)(lli->data))->symbol); */ add_final_col_index(((weighted_item_t *)(lli->data))->symbol); if (s->data_type & DT_REORDER) { continue; @@ -2850,10 +2912,10 @@ static void finalize_base(void) ++wcs2index_count; if ((tfind(buf, &cur_base->root_starter_char, sym_cmp)) != NULL) { wcs2index[i] = ++starter_index; -/* fprintf(stderr, "wcs2index[ %#06x ] = %d (starter)\n", i, wcs2index[i]); */ +/* verbose_msg(VDETAIL, "wcs2index[ %#06x ] = %d (starter)\n", i, wcs2index[i]); */ } else { wcs2index[i] = (int)(p->data); -/* fprintf(stderr, "wcs2index[ %#06x ] = %d\n", i, wcs2index[i]); */ +/* verbose_msg(VDETAIL, "wcs2index[ %#06x ] = %d\n", i, wcs2index[i]); */ } } else { if ((tfind(buf, &cur_base->root_starter_char, sym_cmp)) != NULL) { @@ -2898,7 +2960,7 @@ static void finalize_base(void) smallest = newopt(wcs2index, RANGE, n, &table); assert(t == smallest); wcs2colidt_len += smallest; -/* fprintf(stderr, "smallest = %d wcs2colidt_len = %d\n", smallest, wcs2colidt_len); */ +/* verbose_msg(VDETAIL, "smallest = %d wcs2colidt_len = %d\n", smallest, wcs2colidt_len); */ #if 0 { @@ -2919,15 +2981,15 @@ static void finalize_base(void) u >>= __LOCALE_DATA_WCctype_II_SHIFT; i0 = tbl->ii[u]; - fprintf(stderr, "i0 = %d\n", i0); + verbose_msg(VDETAIL, "i0 = %d\n", i0); i0 <<= __LOCALE_DATA_WCctype_II_SHIFT; i1 = tbl->ii[__LOCALE_DATA_WCctype_II_LEN + i0 + n]; /* i1 = tbl->ti[i0 + n]; */ - fprintf(stderr, "i1 = %d\n", i1); + verbose_msg(VDETAIL, "i1 = %d\n", i1); i1 <<= __LOCALE_DATA_WCctype_TI_SHIFT; /* return *(uint16_t *)(&(tbl->ii[__LOCALE_DATA_WCctype_II_LEN + __LOCALE_DATA_WCctype_TI_LEN + i1 + sc])); */ - fprintf(stderr, "i2 = %d\n", __LOCALE_DATA_WCctype_II_LEN + __LOCALE_DATA_WCctype_TI_LEN + i1 + sc); - fprintf(stderr, "val = %d\n", tbl->ii[__LOCALE_DATA_WCctype_II_LEN + __LOCALE_DATA_WCctype_TI_LEN + i1 + sc]); + verbose_msg(VDETAIL, "i2 = %d\n", __LOCALE_DATA_WCctype_II_LEN + __LOCALE_DATA_WCctype_TI_LEN + i1 + sc); + verbose_msg(VDETAIL, "val = %d\n", tbl->ii[__LOCALE_DATA_WCctype_II_LEN + __LOCALE_DATA_WCctype_TI_LEN + i1 + sc]); /* return tbl->ut[i1 + sc]; */ @@ -2944,7 +3006,7 @@ static void finalize_base(void) base_locale_array[base_locale_len].max_col_index = final_index; base_locale_array[base_locale_len].max_weight = max_weight; - fprintf(stderr, "%s: %6u invariant %6u varying %6u derived %6u total %6u max weight %6u wcs2\n", + verbose_msg(VDETAIL, "%s: %6u invariant %6u varying %6u derived %6u total %6u max weight %6u wcs2\n", cur_base->name, num_invariant, num_varying, tnumnodes(cur_base->root_derived_wi), final_index, max_weight, wcs2index_count); @@ -2960,7 +3022,7 @@ static void finalize_base(void) for (s = cur_base->section_list ; s ; s = s->next) { #if 1 if (s->data_type & DT_REORDER) { - fprintf(stderr, "1: skipping reordered section %s\n", ((section_t *)(s->data))->name); + verbose_msg(VDETAIL, "1: skipping reordered section %s\n", ((section_t *)(s->data))->name); continue; } #endif @@ -2988,7 +3050,7 @@ static void finalize_base(void) for (s = cur_base->section_list ; s ; s = s->next) { #if 1 if (s->data_type & DT_REORDER) { - fprintf(stderr, "2: skipping reordered section %s\n", ((section_t *)(s->data))->name); + verbose_msg(VDETAIL, "2: skipping reordered section %s\n", ((section_t *)(s->data))->name); continue; } #endif @@ -3015,7 +3077,7 @@ static void finalize_base(void) do_starter_lists(cur_base); -/* fprintf(stderr,"updated final_index = %d\n", final_index); */ +/* verbose_msg(VDETAIL,"updated final_index = %d\n", final_index); */ if (rli) { base_locale_array[base_locale_len].range_low @@ -3042,8 +3104,8 @@ static void finalize_base(void) && isupper(cur_base->name[4]) ) { - fprintf(stderr, "adding special derived for %s\n", cur_base->name); -/* fprintf(stderr,"updated final_index = %d\n", final_index); */ + verbose_msg(VDETAIL, "adding special derived for %s\n", cur_base->name); +/* verbose_msg(VDETAIL,"updated final_index = %d\n", final_index); */ assert(der_locale_len+1 < DER_LOCALE_LEN); @@ -3080,7 +3142,7 @@ static void finalize_base(void) ++der_locale_len; } else { - fprintf(stderr, "NOT adding special derived for %s\n", cur_base->name); + verbose_msg(VDETAIL, "NOT adding special derived for %s\n", cur_base->name); } /* now all the derived... */ @@ -3102,7 +3164,7 @@ static void finalize_base(void) } /* we do this in two passes... first all sequences, then all single reorders */ for (s = cl->section_list ; s ; s = s->next) { -/* fprintf(stderr, "doing section %s\n", ((section_t *)(s->data))->name); */ +/* verbose_msg(VDETAIL, "doing section %s\n", ((section_t *)(s->data))->name); */ h = lli = ((section_t *)(s->data))->itm_list; if (!lli) { /* fprintf(stdout, "EMPTY ITEM LIST IN SECTION %s\n", ((section_t *)(s->data))->name ); */ @@ -3195,7 +3257,7 @@ static void finalize_base(void) ++base_locale_len; /* if (tnumnodes(cur_base->root_starter_char)) { */ -/* fprintf(stderr, "starter nodes\n"); */ +/* verbose_msg(VDETAIL, "starter nodes\n"); */ /* twalk(cur_base->root_starter_char, print_starter_node); */ /* } */ |