From 0e16ecfa1e7689c0b3be626f9a3441ebb5710c70 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 28 Jun 2000 04:27:24 +0000 Subject: [PATCH] Update. * locale/programs/ld-ctype.c (ctype_finish): Take all characters from the input charset into account when generating the hash table. (allocate_arrays): Correct setting default width. Not all empty slots in the table are filled, only those not covert explicitly by the locale description and in the charset. * stdio-common/vfscanf.c: Make sure to always return WEOF and EOF for wide character version. For %C handling, test correct pointer variable for NULL. * wcsmbs/wctob.c: Handle WEOF special. * wcsmbs/wcwidth.h: 0xff in width array means invalid character. * wctype/wctype.h: Protect gcc-isms with __extension__. Avoid always-true test to avoid warning. --- ChangeLog | 17 +++ locale/programs/ld-ctype.c | 64 ++++++++++- localedata/ChangeLog | 42 +++++++ localedata/Makefile | 32 ++++-- localedata/charmaps/EUC-JP | 2 - localedata/tests-mbwc/dat_iswcntrl.c | 4 + localedata/tests-mbwc/dat_iswctype.c | 10 ++ localedata/tests-mbwc/dat_iswprint.c | 3 +- localedata/tests-mbwc/dat_swscanf.c | 16 ++- localedata/tests-mbwc/dat_towctrans.c | 8 ++ localedata/tests-mbwc/dat_wcscoll.c | 24 ++++ localedata/tests-mbwc/dat_wcswidth.c | 31 ++++- localedata/tests-mbwc/dat_wcsxfrm.c | 5 +- localedata/tests-mbwc/dat_wctob.c | 11 ++ localedata/tests-mbwc/dat_wcwidth.c | 16 ++- localedata/tests-mbwc/tst_funcs.h | 156 +++++++++++++------------- localedata/tests-mbwc/tst_swscanf.c | 2 +- localedata/tests-mbwc/tst_towctrans.c | 6 + localedata/tests-mbwc/tst_wcschr.c | 2 +- localedata/tests-mbwc/tst_wcscoll.c | 25 ++++- localedata/tests-mbwc/tst_wcscpy.c | 2 +- localedata/tests-mbwc/tst_wcsncat.c | 2 +- localedata/tests-mbwc/tst_wcsncpy.c | 2 +- localedata/tests-mbwc/tst_wcspbrk.c | 4 +- localedata/tests-mbwc/tst_wcsstr.c | 6 +- localedata/tests-mbwc/tst_wctrans.c | 3 +- localedata/tests-mbwc/tst_wctype.c | 2 +- localedata/tst-ctype-de_DE.in | 2 +- localedata/tst-ctype.sh | 3 + stdio-common/vfscanf.c | 6 +- wcsmbs/wctob.c | 3 + wcsmbs/wcwidth.h | 6 +- wctype/wctype.h | 77 ++++++++----- 33 files changed, 435 insertions(+), 159 deletions(-) diff --git a/ChangeLog b/ChangeLog index e53b21df1f..fa9eaeafe8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,25 @@ 2000-06-27 Ulrich Drepper + * locale/programs/ld-ctype.c (ctype_finish): Take all characters from + the input charset into account when generating the hash table. + (allocate_arrays): Correct setting default width. Not all empty slots + in the table are filled, only those not covert explicitly by the + locale description and in the charset. + * wctype/towctrans.c (__towctrans): Be graceful and accept error return values from the wctrans function. + * stdio-common/vfscanf.c: Make sure to always return WEOF and EOF for + wide character version. + For %C handling, test correct pointer variable for NULL. + + * wcsmbs/wctob.c: Handle WEOF special. + + * wcsmbs/wcwidth.h: 0xff in width array means invalid character. + + * wctype/wctype.h: Protect gcc-isms with __extension__. Avoid + always-true test to avoid warning. + 2000-06-27 Greg McGary * elf/dl-open.c (_dl_sysdep_start): Wrap weak_extern decl in BP_SYM (). diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index ce097e741b..417660160f 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -345,6 +345,10 @@ ctype_finish (struct localedef_t *locale, struct charmap_t *charmap) struct charseq *space_seq; struct locale_ctype_t *ctype = locale->categories[LC_CTYPE].ctype; int warned; + const void *key; + size_t len; + void *vdata; + void *curs; /* Now resolve copying and also handle completely missing definitions. */ if (ctype == NULL) @@ -637,6 +641,21 @@ character '%s' in class `%s' must not be in class `%s'"), } } + /* Now set all the other characters of the character set to the + default width. */ + curs = NULL; + while (iterate_table (&charmap->char_table, &curs, &key, &len, &vdata) == 0) + { + struct charseq *data = (struct charseq *) vdata; + + if (data->ucs4 == UNINITIALIZED_CHAR_VALUE) + data->ucs4 = repertoire_find_value (ctype->repertoire, + data->name, len); + + if (data->ucs4 != ILLEGAL_CHAR_VALUE) + (void) find_idx (ctype, NULL, NULL, NULL, data->ucs4); + } + /* There must be a multiple of 10 digits. */ if (ctype->mbdigits_act % 10 != 0) { @@ -3158,6 +3177,10 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charmap_t *charmap, { size_t idx; size_t width_table_size; + const void *key; + size_t len; + void *vdata; + void *curs; /* First we have to decide how we organize the arrays. It is easy for a one-byte character set. But multi-byte character set @@ -3345,8 +3368,8 @@ Computing table size for character classes might take a while..."), width_table_size = (ctype->plane_size * ctype->plane_cnt + 3) & ~3ul; ctype->width = (unsigned char *) xmalloc (width_table_size); - /* Initialize with default width value. */ - memset (ctype->width, charmap->width_default, width_table_size); + /* Initialize with -1. */ + memset (ctype->width, '\xff', width_table_size); if (charmap->width_rules != NULL) { size_t cnt; @@ -3389,8 +3412,10 @@ Computing table size for character classes might take a while..."), size_t depth = 0; while (ctype->names[nr + depth * ctype->plane_size] != wch) - ++depth; - assert (depth < ctype->plane_cnt); + { + ++depth; + assert (depth < ctype->plane_cnt); + } ctype->width[nr + depth * ctype->plane_size] = charmap->width_rules[cnt].width; @@ -3421,6 +3446,37 @@ Computing table size for character classes might take a while..."), } } + /* Now set all the other characters of the character set to the + default width. */ + curs = NULL; + while (iterate_table (&charmap->char_table, &curs, &key, &len, &vdata) == 0) + { + struct charseq *data = (struct charseq *) vdata; + size_t nr; + size_t depth; + + if (data->ucs4 == UNINITIALIZED_CHAR_VALUE) + data->ucs4 = repertoire_find_value (ctype->repertoire, + data->name, len); + + if (data->ucs4 != ILLEGAL_CHAR_VALUE) + { + nr = data->ucs4 % ctype->plane_size; + depth = 0; + + while (ctype->names[nr + depth * ctype->plane_size] != data->ucs4) + { + ++depth; + assert (depth < ctype->plane_cnt); + } + + if (ctype->width[nr + depth * ctype->plane_size] + == (unsigned char) '\xff') + ctype->width[nr + depth * ctype->plane_size] = + charmap->width_default; + } + } + /* Set MB_CUR_MAX. */ ctype->mb_cur_max = charmap->mb_cur_max; diff --git a/localedata/ChangeLog b/localedata/ChangeLog index 0b7dac9a8a..f733268498 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,5 +1,47 @@ 2000-06-27 Ulrich Drepper + * tests-mbwc/dat_iswcntrl.c: U0000 is not in class cntrl. + * tests-mbwc/dat_iswctype.c: U0000 is not in class cntrl. + U4E06 is not in EUC-JP. + * tests-mbwc/dat_swscanf.c: Correct several bugs in the tests. + * tests-mbwc/dat_towctrans.c: Likewise. + * tests-mbwc/dat_wcscoll.c: Likewise. + * tests-mbwc/dat_wcswidth.c: Likewise. + * tests-mbwc/dat_wctob.c: Likewise. + + * tests-mbwc/tst_towctrans.c: Remove hack which avoided crash in an + versions. + + * tests-mbwc/dat_iswprint.c: Disable one test until it is decided + what is correct. + * tests-mbwc/dat_wcsxfrm.c: Likewise. + * tests-mbwc/dat_wcwidth.c: Likewise. + + * tests-mbwc/tst_funcs.h: Pretty print. + + * tests-mbwc/tst_scscanf.c: Use correct format to avoid warning. + * tests-mbwc/tst_wcschr.c: Likewise. + * tests-mbwc/tst_wcscpy.c: Likewise. + * tests-mbwc/tst_wcscat.c: Likewise. + * tests-mbwc/tst_wcsncpy.c: Likewise. + * tests-mbwc/tst_wcspbrk.c: Likewise. + * tests-mbwc/tst_wcsstr.c: Likewise. + * tests-mbwc/tst_wctrans.c: Likewise. + * tests-mbwc/tst_wctype.c: Likewise. + + * tests-mbwc/tst_wcscoll.c: Print better error messages. + + * Makefile (tests): Define as $(locale_test_suite) but only + if not cross-compiling and shared libs are built. + (locale_test_suite): New variable. Name all new tests from the + locale test suite. + Add rule to run new tests only when all data is available. + * tst-ctype.sh: Add hack to generate en_US.ANSI_X3.4-1968 locale. + + * tst-ctype-de_DE.in: U00A0 is not in class graph. + + * charmaps/EUC-JP: Remove U005C and U007E entries from non-ASCII range. + * locales/i18n: Backspace isn't blank, tab is. * tst-ctype.c (main): Add tests for control characters and space. diff --git a/localedata/Makefile b/localedata/Makefile index 0330a973f3..7c88b045a8 100644 --- a/localedata/Makefile +++ b/localedata/Makefile @@ -35,15 +35,6 @@ locales := $(filter-out $(addprefix locales/, CVS RCS SCCS %~), \ repertoiremaps := $(filter-out $(addprefix repertoiremaps/, CVS RCS SCCS %~), \ $(wildcard repertoiremaps/*)) -# Disable the tests for now - first the locales have to be generated -#tests := tst_iswalnum tst_iswprint tst_towctrans tst_wcsncmp tst_wctrans \ -# tst_iswalpha tst_iswpunct tst_wcschr tst_wcspbrk tst_wctype \ -# tst_iswcntrl tst_iswspace tst_wcscoll tst_wcsspn tst_iswdigit \ -# tst_iswupper tst_wcscpy tst_wcsstr tst_iswgraph tst_iswxdigit \ -# tst_wcscspn tst_wcswidth tst_iswlower tst_swscanf tst_wcslen \ -# tst_wctob tst_iswctype tst_towlower tst_wcscat tst_towupper \ -# tst_wcscmp tst_wcsncat tst_wcsncpy tst_wcsxfrm tst_wcwidth - subdir-dirs = tests-mbwc vpath %.c tests-mbwc @@ -69,8 +60,9 @@ fmon-tests = n01y12 n02n40 n10y31 n11y41 n12y11 n20n32 n30y20 n41n00 \ y01y10 y02n22 y22n42 y30y21 y32n31 y40y00 y42n21 generated := $(test-input) $(test-output) -generated-dirs := $(basename $(test-input)) en_US $(ld-test-names) tt_TT\ - de_DE.437 $(addprefix tstfmon_,$(fmon-tests)) +generated-dirs := $(basename $(test-input)) $(ld-test-names) tt_TT \ + de_DE.437 $(addprefix tstfmon_,$(fmon-tests)) \ + en_US.ANSI_X3.4-1968 ja_JP.EUC-JP distribute := CHECKSUMS README SUPPORTED ChangeLog \ $(charmaps) $(locales) $(repertoiremaps) \ @@ -82,6 +74,22 @@ distribute := CHECKSUMS README SUPPORTED ChangeLog \ # Get $(inst_i18ndir) defined. include ../Makeconfig +ifeq (no,$(cross-compiling)) +ifeq (yes,$(build-shared)) +# Disable the tests for now - first the locales have to be generated +locale_test_suite := tst_iswalnum tst_iswprint tst_towctrans tst_wcsncmp \ + tst_wctrans tst_iswalpha tst_iswpunct tst_wcschr \ + tst_wcspbrk tst_wctype tst_iswcntrl tst_iswspace \ + tst_wcscoll tst_wcsspn tst_iswdigit tst_iswupper \ + tst_wcscpy tst_wcsstr tst_iswgraph tst_iswxdigit \ + tst_wcscspn tst_wcswidth tst_iswlower tst_swscanf \ + tst_wcslen tst_wctob tst_iswctype tst_towlower \ + tst_wcscat tst_towupper tst_wcscmp tst_wcsncat \ + tst_wcsncpy tst_wcsxfrm tst_wcwidth +tests = $(locale_test_suite) +endif +endif + # Files to install. install-others := $(addprefix $(inst_i18ndir)/, $(charmaps) $(locales) \ $(repertoiremaps)) @@ -101,6 +109,7 @@ CFLAGS-tst-mbswcs4.c = -Wno-format CFLAGS-tst-mbswcs5.c = -Wno-format CFLAGS-tst-trans.c = -Wno-format + ifeq (no,$(cross-compiling)) ifeq (yes,$(build-shared)) .PHONY: do-collate-test do-tst-fmon do-tst-locale do-tst-rpmatch do-tst-trans \ @@ -123,6 +132,7 @@ do-tst-mbswcs: tst-mbswcs.sh $(objpfx)tst-mbswcs1 $(objpfx)tst-mbswcs2 \ $(SHELL) -e $< $(common-objpfx) do-tst-ctype: tst-ctype.sh $(objpfx)tst-ctype do-collate-test $(SHELL) -e $< $(common-objpfx) +$(addsuffix .out,$(addprefix $(objpfx),$(locale_test_suite))): %: do-tst-ctype endif endif diff --git a/localedata/charmaps/EUC-JP b/localedata/charmaps/EUC-JP index f5ff8fa8e9..047d6b8c71 100644 --- a/localedata/charmaps/EUC-JP +++ b/localedata/charmaps/EUC-JP @@ -242,7 +242,6 @@ CHARMAP /xa1/xbd HORIZONTAL BAR /xa1/xbe HYPHEN /xa1/xbf FULLWIDTH SOLIDUS - /xa1/xc0 REVERSE SOLIDUS /xa1/xc1 WAVE DASH /xa1/xc2 DOUBLE VERTICAL LINE /xa1/xc3 FULLWIDTH VERTICAL LINE @@ -7102,7 +7101,6 @@ CHARMAP /x8f/xa2/xb4 MACRON /x8f/xa2/xb5 OGONEK /x8f/xa2/xb6 RING ABOVE - /x8f/xa2/xb7 TILDE /x8f/xa2/xb8 GREEK TONOS /x8f/xa2/xb9 GREEK DIALYTIKA TONOS /x8f/xa2/xc2 INVERTED EXCLAMATION MARK diff --git a/localedata/tests-mbwc/dat_iswcntrl.c b/localedata/tests-mbwc/dat_iswcntrl.c index 89d5021916..4eac814ec0 100644 --- a/localedata/tests-mbwc/dat_iswcntrl.c +++ b/localedata/tests-mbwc/dat_iswcntrl.c @@ -46,7 +46,11 @@ TST_ISW_LOC (CNTRL, cntrl) = { { TST_ISW_REC (enUS, cntrl) { { { WEOF }, { 0,0,1,0 } }, +#ifdef SHOJI_IS_RIGHT { { 0x0000 }, { 0,0,0,0 } }, +#else + { { 0x0000 }, { 0,0,1,0 } }, +#endif { { 0x001F }, { 0,0,0,0 } }, { { 0x0020 }, { 0,0,1,0 } }, { { 0x0021 }, { 0,0,1,0 } }, diff --git a/localedata/tests-mbwc/dat_iswctype.c b/localedata/tests-mbwc/dat_iswctype.c index ebdaedce57..7e481ff72f 100644 --- a/localedata/tests-mbwc/dat_iswctype.c +++ b/localedata/tests-mbwc/dat_iswctype.c @@ -210,7 +210,12 @@ TST_ISWCTYPE tst_iswctype_loc [] = { { { 0x0009, "blank" }, { 0,0,0,0 } }, { { 0x000B, "blank" }, { 0,0,1,0 } }, { { 0x0020, "blank" }, { 0,0,0,0 } }, +#ifdef SHOJI_IS_RIGHT { { 0x0000, "cntrl" }, { 0,0,0,0 } }, +#else + /* XXX U0000 has no properties at all. */ + { { 0x0000, "cntrl" }, { 0,0,1,0 } }, +#endif { { 0x001F, "cntrl" }, { 0,0,0,0 } }, { { 0x0020, "cntrl" }, { 0,0,1,0 } }, { { 0x0021, "cntrl" }, { 0,0,1,0 } }, @@ -531,8 +536,13 @@ TST_ISWCTYPE tst_iswctype_loc [] = { { { 0xFF66, "jkata" }, { 0,0,0,0 } }, /* HALF KATA WO */ { { 0xFF6F, "jkata" }, { 0,0,0,0 } }, /* HALF KATA tu */ { { 0x4E05, "jkanji" }, { 0,0,0,0 } }, /* CJK UNI.IDEO. */ +#ifdef SHOJI_IS_RIGHT /* : */ { { 0x4E06, "jkanji" }, { 0,0,1,1 } }, /* CJK UNI.IDEO.NON-J */ +#else + /* XXX This character does not exist in EUC-JP. */ + { { 0x4E06, "jkanji" }, { 0,0,1,0 } }, /* CJK UNI.IDEO.NON-J */ +#endif { { 0x4E07, "jkanji" }, { 0,0,0,0 } }, /* CJK UNI.IDEO. */ { is_last: 1 } } diff --git a/localedata/tests-mbwc/dat_iswprint.c b/localedata/tests-mbwc/dat_iswprint.c index 47fa4167da..70abb6635e 100644 --- a/localedata/tests-mbwc/dat_iswprint.c +++ b/localedata/tests-mbwc/dat_iswprint.c @@ -65,7 +65,9 @@ TST_ISW_LOC (PRINT, print) = { { { 0x007E }, { 0,0,0,0 } }, { { 0x007F }, { 0,0,1,0 } }, { { 0x0080 }, { 0,0,1,0 } }, /* 20 */ +#ifdef NO_WAIVER { { 0x3042 }, { 0,0,1,0 } }, /* */ +#endif { is_last: 1 } /* Last element. */ } }, @@ -120,4 +122,3 @@ TST_ISW_LOC (PRINT, print) = { }, { TST_ISW_REC (end, print) } }; - diff --git a/localedata/tests-mbwc/dat_swscanf.c b/localedata/tests-mbwc/dat_swscanf.c index 24274401ba..cce5b336e6 100644 --- a/localedata/tests-mbwc/dat_swscanf.c +++ b/localedata/tests-mbwc/dat_swscanf.c @@ -33,7 +33,6 @@ TST_SWSCANF tst_swscanf_loc [] = }, }, /*------------------------ 02 -----------------------*/ - /* x 2 */ { { { 0x00E4, 0x00C4, 0x0000 /* "äÄ" */ }, @@ -60,8 +59,13 @@ TST_SWSCANF tst_swscanf_loc [] = }, L"1%d:2%d:3%d:4%d:5%d:6%d:7%d:8%d:9%d", 0 }, - { 1,EINVAL,1,EOF, +#ifdef SHOJI_IS_RIGHT + { 1,EINVAL,1,WEOF, 0,0,0,0,"", { 0x0000 }, +#else + { 0,0,1,0, + 0,0,0,0,"", { 0x0000 }, +#endif }, }, /*---------------------------------------------------*/ @@ -136,7 +140,6 @@ TST_SWSCANF tst_swscanf_loc [] = }, }, /*------------------------ 03 -----------------------*/ - /* */ { { { 0x0031, 0x003A, 0x0030, 0x003A, @@ -144,12 +147,16 @@ TST_SWSCANF tst_swscanf_loc [] = 0x0061, 0x003A, 0x0063, 0x0064, 0x0000, 0x0000, }, - L"%2$d:%1$u:%f:%c:%s", 0 + L"%2$d:%1$u:%3$f:%4$c:%5$s", 0 }, { 1,0,1,5, 0, 1, 3.9, 'a', "cd", { 0x0000 } }, }, +#ifdef SHOJI_IS_RIGHT + /* XXX This test does not make sense. The format string is + L"\x1\x2\x25\x53" and it is supposed to match the words + 0x30A2, 0x30A4, 0x0001. */ /*------------------------ 04 -----------------------*/ /* x 2 */ { { { @@ -161,6 +168,7 @@ TST_SWSCANF tst_swscanf_loc [] = 0,0,0,0,"", { 0x0000 } }, }, +#endif /*---------------------------------------------------*/ { is_last: 1} /* Last element. */ } diff --git a/localedata/tests-mbwc/dat_towctrans.c b/localedata/tests-mbwc/dat_towctrans.c index 0baeb9bb09..53083e3bac 100644 --- a/localedata/tests-mbwc/dat_towctrans.c +++ b/localedata/tests-mbwc/dat_towctrans.c @@ -38,7 +38,11 @@ TST_TOWCTRANS tst_towctrans_loc [] = { { { Ttowctrans, TST_LOC_de }, { +#ifdef SHOJI_IS_RIGHT { { 0x0010, "tojkata" }, { 1,EINVAL,1,0x0010 } }, +#else + { { 0x0010, "tojkata" }, { 1,0, 1,0x0010 } }, +#endif { { 0x0080, "tolower" }, { 1,0, 1,0x0080 } }, { { 0x00EC, "toupper" }, { 1,0, 1,0x00CC } }, { { 0x00CC, "tolower" }, { 1,0, 1,0x00EC } }, @@ -48,7 +52,11 @@ TST_TOWCTRANS tst_towctrans_loc [] = { { { Ttowctrans, TST_LOC_enUS }, { +#ifdef SHOJI_IS_RIGHT { { 0x0010, "xxxxxxx" }, { 1,EINVAL,1,0x0010 } }, +#else + { { 0x0010, "xxxxxxx" }, { 1,0, 1,0x0010 } }, +#endif { { 0x007F, "tolower" }, { 1,0, 1,0x007F } }, { { 0x0061, "toupper" }, { 1,0, 1,0x0041 } }, { { 0x0041, "tolower" }, { 1,0, 1,0x0061 } }, diff --git a/localedata/tests-mbwc/dat_wcscoll.c b/localedata/tests-mbwc/dat_wcscoll.c index d087fc6344..ffedacab1e 100644 --- a/localedata/tests-mbwc/dat_wcscoll.c +++ b/localedata/tests-mbwc/dat_wcscoll.c @@ -104,6 +104,7 @@ TST_WCSCOLL tst_wcscoll_loc [] = { { 0x0041,0x0041,0x0043,0x0000 }, }, /* #4 */ /*expect*/ { 0,0,0,0, -1, }, }, +#ifdef SHOJI_IS_RIGHT /* */ /* assume ascii */ { /*input.*/ { { 0x0041,0x0042,0x0043,0x0000 }, { 0x0041,0x0061,0x0043,0x0000 }, }, /* #5 */ @@ -114,6 +115,17 @@ TST_WCSCOLL tst_wcscoll_loc [] = { { 0x0041,0x0042,0x0043,0x0000 }, }, /* #6 */ /*expect*/ { 0,0,0,0, +1, }, }, +#else + /* XXX Correct order is lowercase before uppercase. */ + { /*input.*/ { { 0x0041,0x0042,0x0043,0x0000 }, + { 0x0041,0x0061,0x0043,0x0000 }, }, /* #5 */ + /*expect*/ { 0,0,0,0, +1, }, + }, + { /*input.*/ { { 0x0041,0x0061,0x0043,0x0000 }, + { 0x0041,0x0042,0x0043,0x0000 }, }, /* #6 */ + /*expect*/ { 0,0,0,0, -1, }, + }, +#endif { /*input.*/ { { 0x0041,0x0042,0x0000 }, { 0x0041,0x0042,0x0049,0x0000 }, }, /* #7 */ /*expect*/ { 0,0,0,0, -1, }, @@ -122,6 +134,7 @@ TST_WCSCOLL tst_wcscoll_loc [] = { { 0x0041,0x0042,0x0000 }, }, /* #8 */ /*expect*/ { 0,0,0,0, +1, }, }, +#ifdef SHOJI_IS_RIGHT { /*input.*/ { { 0x0041,0x0092,0x0049,0x0000 }, { 0x0041,0x008E,0x0049,0x0000 }, }, /* #9 */ /*expect*/ { 1,0,0,0, +1, }, @@ -130,6 +143,17 @@ TST_WCSCOLL tst_wcscoll_loc [] = { { 0x0041,0x0092,0x0049,0x0000 }, }, /* #10 */ /*expect*/ { 0,0,0,0, -1, }, }, +#else + /* Do not assume position of character out of range. */ + { /*input.*/ { { 0x0041,0x0092,0x0049,0x0000 }, + { 0x0041,0x008E,0x0049,0x0000 }, }, /* #9 */ + /*expect*/ { 1,0,0,0, 0, }, + }, + { /*input.*/ { { 0x0041,0x008E,0x0049,0x0000 }, + { 0x0041,0x0092,0x0049,0x0000 }, }, /* #10 */ + /*expect*/ { 0,0,0,0, 0, }, + }, +#endif { is_last: 1 } } }, diff --git a/localedata/tests-mbwc/dat_wcswidth.c b/localedata/tests-mbwc/dat_wcswidth.c index f8d51341d7..a1c7076e60 100644 --- a/localedata/tests-mbwc/dat_wcswidth.c +++ b/localedata/tests-mbwc/dat_wcswidth.c @@ -64,10 +64,10 @@ TST_WCSWIDTH tst_wcswidth_loc [] = { { /*input.*/ { { 0x00C1,0x00FF,0x0000 }, 2 }, /* 18 */ /*expect*/ { 0,0,1,2 }, }, - { /*input.*/ { { 0x00C1,0x3042,0x0000 }, 2 }, /* 19 */ /* */ /* returns 2 */ + { /*input.*/ { { 0x00C1,0x3042,0x0000 }, 2 }, /* 19 */ /*expect*/ { 0,0,1,-1 }, }, - { /*input.*/ { { 0x00C1,0x3044,0x0000 }, 2 }, /* 20 */ /* */ /* returns 2 */ + { /*input.*/ { { 0x00C1,0x3044,0x0000 }, 2 }, /* 20 */ /*expect*/ { 0,0,1,-1 }, }, { is_last: 1 } @@ -85,12 +85,21 @@ TST_WCSWIDTH tst_wcswidth_loc [] = { { /*input.*/ { { 0x0041,0x0042,0x00C3,0x0000 }, 2 }, /* 03 */ /*expect*/ { 0,0,1,2 }, }, +#ifdef SHOJI_IS_RIGHT { /*input.*/ { { 0x0041,0x0042,0x00C3,0x0000 }, 3 }, /* 04 */ /*expect*/ { 0,0,1,3 }, }, { /*input.*/ { { 0x0041,0x0042,0x00C3,0x0000 }, 4 }, /* 05 */ /*expect*/ { 0,0,1,3 }, }, +#else + { /*input.*/ { { 0x0041,0x0042,0x00C3,0x0000 }, 3 }, /* 04 */ + /*expect*/ { 0,0,1,-1 }, + }, + { /*input.*/ { { 0x0041,0x0042,0x0043,0x0000 }, 4 }, /* 05 */ + /*expect*/ { 0,0,1,3 }, + }, +#endif { /*input.*/ { { 0x0000 }, 1 }, /* 06 */ /*expect*/ { 0,0,1,0 }, }, @@ -124,17 +133,24 @@ TST_WCSWIDTH tst_wcswidth_loc [] = { { /*input.*/ { { 0x0041,0x00A0,0x0000 }, 2 }, /* 16 */ /*expect*/ { 0,0,1,-1 }, }, +#ifdef SHOJI_IS_RIGHT { /*input.*/ { { 0x0041,0x00A1,0x0000 }, 2 }, /* 17 */ /*expect*/ { 0,0,1,2 }, }, { /*input.*/ { { 0x0041,0x00FF,0x0000 }, 2 }, /* 18 */ /*expect*/ { 0,0,1,2 }, }, - /* */ /* returns 2 */ +#else + { /*input.*/ { { 0x0041,0x007E,0x0000 }, 2 }, /* 17 */ + /*expect*/ { 0,0,1,2 }, + }, + { /*input.*/ { { 0x0041,0x0020,0x0000 }, 2 }, /* 18 */ + /*expect*/ { 0,0,1,2 }, + }, +#endif { /*input.*/ { { 0x0041,0x3042,0x0000 }, 2 }, /* 19 */ /*expect*/ { 0,0,1,-1 }, }, - /* */ /* returns 2 */ { /*input.*/ { { 0x0041,0x3044,0x0000 }, 2 }, /* 20 */ /*expect*/ { 0,0,1,-1 }, }, @@ -192,10 +208,17 @@ TST_WCSWIDTH tst_wcswidth_loc [] = { { /*input.*/ { { 0x0041,0x00A0,0x0000 }, 2 }, /* 16 */ /*expect*/ { 0,0,1,-1 }, }, +#ifdef NO_WAIVER /* */ /* returns 3 */ { /*input.*/ { { 0x0041,0x00A1,0x0000 }, 2 }, /* 17 */ /*expect*/ { 0,0,1,-1 }, }, +#else + /* XXX U00A1 is valid -> /x8f/xa2/xc4 in JIS X 0212 */ + { /*input.*/ { { 0x0041,0x00A1,0x0000 }, 2 }, /* 17 */ + /*expect*/ { 0,0,1,3 }, + }, +#endif { /*input.*/ { { 0x0041,0xFF71,0x0000 }, 2 }, /* 18 */ /*expect*/ { 0,0,1,2 }, }, diff --git a/localedata/tests-mbwc/dat_wcsxfrm.c b/localedata/tests-mbwc/dat_wcsxfrm.c index 8d52efcf90..46f99035c5 100644 --- a/localedata/tests-mbwc/dat_wcsxfrm.c +++ b/localedata/tests-mbwc/dat_wcsxfrm.c @@ -55,12 +55,13 @@ TST_WCSXFRM tst_wcsxfrm_loc [] = { { /*inp*/ { { 0x0000,0x0000 }, { 0x0000,0x0000 }, 7, 7 }, /* #04 */ /*exp*/ { 1,0, 0,0, }, }, - +#ifdef NO_WAIVER { /* x 2 */ /*inp*/ { { 0x3061,0x0000 }, { 0xFF42,0x0000 }, 7, 7 }, /* #05 */ /* */ /*exp*/ { 1,EINVAL, 1,(size_t)-1, }, }, +#endif { is_last: 1 } } }, @@ -82,10 +83,12 @@ TST_WCSXFRM tst_wcsxfrm_loc [] = { { /*inp*/ { { 0xFF71,0x0000 }, { 0x30A2,0x0000 }, 7, 7 }, /* #05 */ /*exp*/ { 1,0, 0,0, }, }, +#ifdef NO_WAIVER /* x 2 */ { /*inp*/ { { 0x008E,0x0000 }, { 0x008F,0x0000 }, 7, 7 }, /* #06 */ /*exp*/ { 1,EINVAL, 1,(size_t)-1, }, }, +#endif { is_last: 1 } } }, diff --git a/localedata/tests-mbwc/dat_wctob.c b/localedata/tests-mbwc/dat_wctob.c index 9f30aff0ea..d40b74a85a 100644 --- a/localedata/tests-mbwc/dat_wctob.c +++ b/localedata/tests-mbwc/dat_wctob.c @@ -25,8 +25,14 @@ TST_WCTOB tst_wctob_loc [] = { { { WEOF }, { 0,0, 1, EOF } }, { { 0x0020 }, { 0,0, 1, 0x20 } }, { { 0x0061 }, { 0,0, 1, 0x61 } }, +#ifdef SHOJI_IS_RIGHT { { 0x0080 }, { 0,0, 1, 0x80 } }, { { 0x00C4 }, { 0,0, 1, 0xC4 } }, +#else + /* XXX These are no valid characters. */ + { { 0x0080 }, { 0,0, 1, EOF } }, + { { 0x00C4 }, { 0,0, 1, EOF } }, +#endif { { 0x30C4 }, { 0,0, 1, EOF } }, { is_last: 1 } /* Last element. */ } @@ -36,7 +42,12 @@ TST_WCTOB tst_wctob_loc [] = { { { WEOF }, { 0,0, 1, EOF } }, { { 0x0020 }, { 0,0, 1, 0x20 } }, { { 0x0061 }, { 0,0, 1, 0x61 } }, +#ifdef SHOJI_IS_RIGHT { { 0x0080 }, { 0,0, 1, 0x80 } }, /* */ +#else + /* XXX These are no valid characters. */ + { { 0x0080 }, { 0,0, 1, EOF } }, +#endif { { 0x00C4 }, { 0,0, 1, EOF } }, { { 0x30C4 }, { 0,0, 1, EOF } }, { is_last: 1 } /* Last element. */ diff --git a/localedata/tests-mbwc/dat_wcwidth.c b/localedata/tests-mbwc/dat_wcwidth.c index d57a3d4247..5472d1f559 100644 --- a/localedata/tests-mbwc/dat_wcwidth.c +++ b/localedata/tests-mbwc/dat_wcwidth.c @@ -28,10 +28,16 @@ TST_WCWIDTH tst_wcwidth_loc [] = { { /*inp*/ { 0x00C1 }, /* #06 */ /*exp*/ { 0,0, 1,1, }, }, +#ifdef SHOJI_IS_RIGHT /* */ /* CHECK : wint_t */ { /*inp*/ { 0x3041 }, /* #07 */ /*exp*/ { 0,0, 1,0, }, }, +#else + { /*inp*/ { 0x3041 }, /* #07 */ + /*exp*/ { 0,0, 1,EOF, }, + }, +#endif { is_last: 1 } } }, @@ -50,15 +56,12 @@ TST_WCWIDTH tst_wcwidth_loc [] = { { /*inp*/ { 0x0080 }, /* #04 */ /*exp*/ { 0,0, 1,-1, }, }, - /* */ /* assume ascii */ { /*inp*/ { 0x00A1 }, /* #05 */ /*exp*/ { 0,0, 1,-1, }, }, - /* */ /* assume ascii */ { /*inp*/ { 0x00C1 }, /* #06 */ /*exp*/ { 0,0, 1,-1, }, }, - /* */ /* CHECK : wint_t */ { /*inp*/ { 0x3041 }, /* #07 */ /*exp*/ { 0,0, 1,-1, }, }, @@ -80,10 +83,17 @@ TST_WCWIDTH tst_wcwidth_loc [] = { { /*inp*/ { 0x0080 }, /* #04 */ /*exp*/ { 0,0, 1,-1, }, }, +#ifdef SHOJI_IS_RIGHT /* */ { /*inp*/ { 0x00A1 }, /* #05 */ /*exp*/ { 0,0, 1,0, }, }, +#else + /* XXX U00A1 is a valid character in EUC-JP. */ + { /*inp*/ { 0x00A1 }, /* #05 */ + /*exp*/ { 0,0, 1,2, }, + }, +#endif /* jisx0212 */ { /*inp*/ { 0x00C1 }, /* #06 */ /*exp*/ { 0,0, 1,2, }, diff --git a/localedata/tests-mbwc/tst_funcs.h b/localedata/tests-mbwc/tst_funcs.h index 95d0787e5d..e72154fa74 100644 --- a/localedata/tests-mbwc/tst_funcs.h +++ b/localedata/tests-mbwc/tst_funcs.h @@ -96,15 +96,15 @@ extern int result (FILE * fp, char res, const char *func, const char *loc, for (loc = 0; strcmp (TST_HEAD (o_func).locale, TST_LOC_end); ++loc) -#define TST_HEAD_LOCALE(ofunc, s_func) \ - func_id = TST_HEAD (ofunc).func_id; \ - locale = TST_HEAD (ofunc).locale; \ - if (setlocale (LC_ALL, locale) == NULL) \ - { \ - fprintf (stderr, "Warning : can't set locale: %s\nskipping ...\n", \ - locale); \ - result (fp, C_LOCALES, s_func, locale, 0, 0, 0, "can't set locale"); \ - continue; \ +#define TST_HEAD_LOCALE(ofunc, s_func) \ + func_id = TST_HEAD (ofunc).func_id; \ + locale = TST_HEAD (ofunc).locale; \ + if (setlocale (LC_ALL, locale) == NULL) \ + { \ + fprintf (stderr, "Warning : can't set locale: %s\nskipping ...\n", \ + locale); \ + result (fp, C_LOCALES, s_func, locale, 0, 0, 0, "can't set locale"); \ + continue; \ } #define TST_DO_REC(ofunc) \ @@ -131,36 +131,36 @@ extern int result (FILE * fp, char res, const char *func, const char *loc, #define TST_SAVE_ERRNO \ errno_save = errno -#define TST_IF_RETURN(_s_func_) \ - if (err_flg == 1) \ - { \ - if (errno_save == err_exp) \ - { \ - result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 1, \ - MS_PASSED); \ - } \ - else \ - { \ - err_count++; \ - result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 1, \ - "the value of errno is different from an expected value"); \ - } \ - } \ - \ - if (ret_flg == 1) \ - { \ - if (ret == ret_exp) \ - { \ - result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 2, \ - MS_PASSED); \ - } \ - else \ - { \ - err_count++; \ - result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 2, \ - "the return value is different from an expected value"); \ - } \ - } \ +#define TST_IF_RETURN(_s_func_) \ + if (err_flg == 1) \ + { \ + if (errno_save == err_exp) \ + { \ + result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 1, \ + MS_PASSED); \ + } \ + else \ + { \ + err_count++; \ + result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 1, \ + "the value of errno is different from an expected value"); \ + } \ + } \ + \ + if (ret_flg == 1) \ + { \ + if (ret == ret_exp) \ + { \ + result (fp, C_SUCCESS, _s_func_, locale, rec+1, seq_num+1, 2, \ + MS_PASSED); \ + } \ + else \ + { \ + err_count++; \ + result (fp, C_FAILURE, _s_func_, locale, rec+1, seq_num+1, 2, \ + "the return value is different from an expected value"); \ + } \ + } \ else #define TEX_ERRET_REC(_type_) \ @@ -188,45 +188,45 @@ extern int result (FILE * fp, char res, const char *func, const char *loc, TEX_ERRET_REC (int) TEX_ISW##_FUNC_##_REC; \ TMD_RECHEAD (ISW##_FUNC_) -#define TST_FUNC_ISW(_FUNC_, _func_) \ -int \ -tst_isw##_func_ (FILE *fp, int debug_flg) \ -{ \ - TST_DECL_VARS(int); \ - wint_t wc; \ - TST_DO_TEST (isw##_func_) \ - { \ - TST_HEAD_LOCALE (isw##_func_, S_ISW##_FUNC_); \ - TST_DO_REC(isw##_func_) \ - { \ - TST_GET_ERRET (isw##_func_); \ - wc = TST_INPUT (isw##_func_).wc; \ - ret = isw##_func_ (wc); \ - if (debug_flg) \ - { \ - fprintf (stdout, "isw*() [ %s : %d ] ret = %d\n", locale, \ - rec+1, ret); \ - } \ - \ - TST_IF_RETURN (S_ISW##_FUNC_) \ - { \ - if (ret != 0) \ - { \ - result (fp, C_SUCCESS, S_ISW##_FUNC_, locale, rec+1, \ - seq_num+1, 3, MS_PASSED); \ - } \ - else \ - { \ - err_count++; \ - result (fp, C_FAILURE, S_ISW##_FUNC_, locale, rec+1, \ - seq_num+1, 3, \ - "the function returned 0, but should be non-zero"); \ - } \ - } \ - } \ - } \ - \ - return err_count; \ +#define TST_FUNC_ISW(_FUNC_, _func_) \ +int \ +tst_isw##_func_ (FILE *fp, int debug_flg) \ +{ \ + TST_DECL_VARS(int); \ + wint_t wc; \ + TST_DO_TEST (isw##_func_) \ + { \ + TST_HEAD_LOCALE (isw##_func_, S_ISW##_FUNC_); \ + TST_DO_REC(isw##_func_) \ + { \ + TST_GET_ERRET (isw##_func_); \ + wc = TST_INPUT (isw##_func_).wc; \ + ret = isw##_func_ (wc); \ + if (debug_flg) \ + { \ + fprintf (stdout, "isw*() [ %s : %d ] ret = %d\n", locale, \ + rec+1, ret); \ + } \ + \ + TST_IF_RETURN (S_ISW##_FUNC_) \ + { \ + if (ret != 0) \ + { \ + result (fp, C_SUCCESS, S_ISW##_FUNC_, locale, rec+1, \ + seq_num+1, 3, MS_PASSED); \ + } \ + else \ + { \ + err_count++; \ + result (fp, C_FAILURE, S_ISW##_FUNC_, locale, rec+1, \ + seq_num+1, 3, \ + "the function returned 0, but should be non-zero"); \ + } \ + } \ + } \ + } \ + \ + return err_count; \ } diff --git a/localedata/tests-mbwc/tst_swscanf.c b/localedata/tests-mbwc/tst_swscanf.c index 4f3286f5cf..8819a0ef94 100644 --- a/localedata/tests-mbwc/tst_swscanf.c +++ b/localedata/tests-mbwc/tst_swscanf.c @@ -59,7 +59,7 @@ tst_swscanf (FILE * fp, int debug_flg) if (TST_INPUT (swscanf).wch) { - fprintf (stdout, " val_S[ 0 ] = 0x%x\n", + fprintf (stdout, " val_S[ 0 ] = 0x%lx\n", val_S[0]); } else diff --git a/localedata/tests-mbwc/tst_towctrans.c b/localedata/tests-mbwc/tst_towctrans.c index 102b23628d..1d874dc0f7 100644 --- a/localedata/tests-mbwc/tst_towctrans.c +++ b/localedata/tests-mbwc/tst_towctrans.c @@ -14,7 +14,9 @@ tst_towctrans (FILE *fp, int debug_flg) TST_DECL_VARS (wint_t); wint_t wc; const char *ts; +#if SHOJI_IS_RIGHT int dummy=0; +#endif wctrans_t wto; TST_DO_TEST (towctrans) @@ -26,6 +28,7 @@ tst_towctrans (FILE *fp, int debug_flg) wc = TST_INPUT (towctrans).wc; ts = TST_INPUT (towctrans).ts; +#if SHOJI_IS_RIGHT if ((wto = wctrans (ts)) == (wctrans_t) 0) { #if 0 @@ -41,6 +44,9 @@ tst_towctrans (FILE *fp, int debug_flg) fprintf (stdout, "towctrans() ------ wctrans() returnd 0.\n"); } } +#else + wto = wctrans (ts); +#endif TST_CLEAR_ERRNO; ret = towctrans (wc, wto); diff --git a/localedata/tests-mbwc/tst_wcschr.c b/localedata/tests-mbwc/tst_wcschr.c index 3dcc1e893f..118baba304 100644 --- a/localedata/tests-mbwc/tst_wcschr.c +++ b/localedata/tests-mbwc/tst_wcschr.c @@ -27,7 +27,7 @@ tst_wcschr (FILE * fp, int debug_flg) { if (ret) { - fprintf (stderr, "wcschr: ret = 0x%x\n", *ret); + fprintf (stderr, "wcschr: ret = 0x%lx\n", *ret); } else { diff --git a/localedata/tests-mbwc/tst_wcscoll.c b/localedata/tests-mbwc/tst_wcscoll.c index d648fa3c60..929f80d800 100644 --- a/localedata/tests-mbwc/tst_wcscoll.c +++ b/localedata/tests-mbwc/tst_wcscoll.c @@ -44,9 +44,28 @@ tst_wcscoll (FILE * fp, int debug_flg) else { err_count++; - Result (C_FAILURE, S_WCSCOLL, CASE_3, - "the return value should be positive " - "/negative but it's negative/positive."); + if (cmp == 1) + { + if (ret == 0) + Result (C_FAILURE, S_WCSCOLL, CASE_3, + "the return value should be positive" + " but it's zero."); + else + Result (C_FAILURE, S_WCSCOLL, CASE_3, + "the return value should be positive" + " but it's negative."); + } + else + { + if (ret == 0) + Result (C_FAILURE, S_WCSCOLL, CASE_3, + "the return value should be negative" + " but it's zero."); + else + Result (C_FAILURE, S_WCSCOLL, CASE_3, + "the return value should be negative" + " but it's positive."); + } } } } diff --git a/localedata/tests-mbwc/tst_wcscpy.c b/localedata/tests-mbwc/tst_wcscpy.c index 2e9212e6ce..3dc6406a38 100644 --- a/localedata/tests-mbwc/tst_wcscpy.c +++ b/localedata/tests-mbwc/tst_wcscpy.c @@ -46,7 +46,7 @@ tst_wcscpy (FILE * fp, int debug_flg) if (debug_flg) { fprintf (stderr, - "ws1[ %d ] = 0x%x <-> wx_ex[ %d ] = 0x%x\n", i, + "ws1[ %d ] = 0x%lx <-> wx_ex[ %d ] = 0x%lx\n", i, ws1[i], i, ws_ex[i]); } diff --git a/localedata/tests-mbwc/tst_wcsncat.c b/localedata/tests-mbwc/tst_wcsncat.c index 9342eb09ac..4665f72ced 100644 --- a/localedata/tests-mbwc/tst_wcsncat.c +++ b/localedata/tests-mbwc/tst_wcsncat.c @@ -48,7 +48,7 @@ tst_wcsncat (FILE * fp, int debug_flg) { if (debug_flg) { - fprintf (stderr, "ws1[%d] = 0x%x\n", i, ws1[i]); + fprintf (stderr, "ws1[%d] = 0x%lx\n", i, ws1[i]); } if (ws1[i] != ws_ex[i]) diff --git a/localedata/tests-mbwc/tst_wcsncpy.c b/localedata/tests-mbwc/tst_wcsncpy.c index cf27271ebd..f2127d4a7d 100644 --- a/localedata/tests-mbwc/tst_wcsncpy.c +++ b/localedata/tests-mbwc/tst_wcsncpy.c @@ -63,7 +63,7 @@ tst_wcsncpy (FILE *fp, int debug_flg) { if (debug_flg) fprintf (stderr, - "wcsncpy: ws1[ %d ] = 0x%x <-> wx_ex[ %d ] = 0x%x\n", + "wcsncpy: ws1[ %d ] = 0x%lx <-> wx_ex[ %d ] = 0x%lx\n", i, ws1[i], i, ws_ex[i]); if (ws1[i] != ws_ex[i]) diff --git a/localedata/tests-mbwc/tst_wcspbrk.c b/localedata/tests-mbwc/tst_wcspbrk.c index 1bb0f6dc44..405c12531e 100644 --- a/localedata/tests-mbwc/tst_wcspbrk.c +++ b/localedata/tests-mbwc/tst_wcspbrk.c @@ -32,7 +32,7 @@ tst_wcspbrk (FILE * fp, int debug_flg) rec + 1, (ret == NULL) ? "null" : "not null"); if (ret) fprintf (stderr, - " ret[0] = 0x%x : 0x%x = ws2[0]\n", + " ret[0] = 0x%lx : 0x%lx = ws2[0]\n", ret[0], ws2[0]); } @@ -58,7 +58,7 @@ tst_wcspbrk (FILE * fp, int debug_flg) if (debug_flg) fprintf (stdout, - " *ret = 0x%x <-> 0x%x = wc_ex\n", + " *ret = 0x%lx <-> 0x%lx = wc_ex\n", *ret, wc_ex); if (*ret != wc_ex) diff --git a/localedata/tests-mbwc/tst_wcsstr.c b/localedata/tests-mbwc/tst_wcsstr.c index 02f756c37c..15654df0a9 100644 --- a/localedata/tests-mbwc/tst_wcsstr.c +++ b/localedata/tests-mbwc/tst_wcsstr.c @@ -31,7 +31,7 @@ tst_wcsstr (FILE * fp, int debug_flg) if (ret) { fprintf (stderr, - " ret[ 0 ] = 0x%x <-> 0x%x = ws2[ 0 ]\n", + " ret[ 0 ] = 0x%lx <-> 0x%lx = ws2[ 0 ]\n", ret[0], ws2[0]); } } @@ -59,8 +59,8 @@ tst_wcsstr (FILE * fp, int debug_flg) if (debug_flg) { fprintf (stderr, - " : ret[ %d ] = 0x%x <-> 0x%x = ws2[ %d ]\n", i, - ret[i], ws2[i], i); + " : ret[ %d ] = 0x%lx <-> 0x%lx = ws2[ %d ]\n", + i, ret[i], ws2[i], i); } if (ret[i] != ws2[i]) diff --git a/localedata/tests-mbwc/tst_wctrans.c b/localedata/tests-mbwc/tst_wctrans.c index 129b797fb3..b422d6ff94 100644 --- a/localedata/tests-mbwc/tst_wctrans.c +++ b/localedata/tests-mbwc/tst_wctrans.c @@ -27,7 +27,8 @@ tst_wctrans (FILE * fp, int debug_flg) if (debug_flg) { - fprintf (stderr, "tst_wctrans : [ %d ] ret = %d\n", rec + 1, ret); + fprintf (stderr, "tst_wctrans : [ %d ] ret = %ld\n", rec + 1, + (long int) ret); fprintf (stderr, " errno = %d\n", errno_save); } diff --git a/localedata/tests-mbwc/tst_wctype.c b/localedata/tests-mbwc/tst_wctype.c index 1ad30ce372..a203e49087 100644 --- a/localedata/tests-mbwc/tst_wctype.c +++ b/localedata/tests-mbwc/tst_wctype.c @@ -25,7 +25,7 @@ tst_wctype (FILE * fp, int debug_flg) if (debug_flg) { - fprintf (stderr, "tst_wctype : [ %d ] ret = %d\n", rec + 1, ret); + fprintf (stderr, "tst_wctype : [ %d ] ret = %ld\n", rec + 1, ret); } TST_IF_RETURN (S_WCTYPE) diff --git a/localedata/tst-ctype-de_DE.in b/localedata/tst-ctype-de_DE.in index f4a1f23f1f..539ff8998d 100644 --- a/localedata/tst-ctype-de_DE.in +++ b/localedata/tst-ctype-de_DE.in @@ -27,7 +27,7 @@ print print ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ 111111111111111111111111111111111111111111111111 graph  ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ - 111111111111111111111111111111111111111111111111 + 011111111111111111111111111111111111111111111111 graph ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ 111111111111111111111111111111111111111111111111 blank  ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ diff --git a/localedata/tst-ctype.sh b/localedata/tst-ctype.sh index afb4e68e5e..6946c30671 100755 --- a/localedata/tst-ctype.sh +++ b/localedata/tst-ctype.sh @@ -38,6 +38,9 @@ generate_locale () } generate_locale EUC-JP ja_JP ja_JP.EUC-JP +# XXX This is a hack for now. We need the en_US.ANSI_X3.4-1968 locale +# XXX elsewhere +generate_locale ANSI_X3.4-1968 en_US en_US.ANSI_X3.4-1968 status=0 diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index 3ca82cc4c7..feff0eb50a 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -86,7 +86,7 @@ # define ISXDIGIT(Ch) iswxdigit (Ch) # define TOLOWER(Ch) towlower (Ch) # define ORIENT if (s->_vtable_offset == 0 && _IO_fwide (s, 1) != 1)\ - return EOF + return WEOF # define __strtoll_internal __wcstoll_internal # define __strtoull_internal __wcstoull_internal # define __strtol_internal __wcstol_internal @@ -99,6 +99,8 @@ # define CHAR_T wchar_t # define UCHAR_T unsigned int # define WINT_T wint_t +# undef EOF +# define EOF WEOF # else # define ungetc(c, s) ((void) ((int) c == EOF \ || (--read_in, \ @@ -715,7 +717,7 @@ __vfscanf (FILE *s, const char *format, va_list argptr) if (!(flags & SUPPRESS)) { wstr = ARG (wchar_t *); - if (str == NULL) + if (wstr == NULL) conv_error (); } diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c index 0ee17ce443..68ab6614f7 100644 --- a/wcsmbs/wctob.c +++ b/wcsmbs/wctob.c @@ -36,6 +36,9 @@ wctob (c) size_t dummy; int status; + if (c == WEOF) + return EOF; + /* Tell where we want the result. */ data.__outbuf = buf; data.__outbufend = buf + MB_LEN_MAX; diff --git a/wcsmbs/wcwidth.h b/wcsmbs/wcwidth.h index a9f8a26d49..ffc74be26c 100644 --- a/wcsmbs/wcwidth.h +++ b/wcsmbs/wcwidth.h @@ -1,5 +1,5 @@ /* Internal header containing implementation of wcwidth() function. - Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -33,6 +33,7 @@ static __inline int internal_wcwidth (wint_t ch) { size_t idx; + unsigned char res; if (ch == L'\0') return 0; @@ -41,5 +42,6 @@ internal_wcwidth (wint_t ch) if (idx == ~((size_t) 0) || (__ctype32_b[idx] & _ISwprint) == 0) return -1; - return (int) __ctype_width[idx]; + res = __ctype_width[idx]; + return res == (unsigned char) '\xff' ? -1 : (int) res; } diff --git a/wctype/wctype.h b/wctype/wctype.h index 2a4caddd90..8bcbaf987b 100644 --- a/wctype/wctype.h +++ b/wctype/wctype.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -176,48 +176,61 @@ extern int iswctype (wint_t __wc, wctype_t __desc) __THROW; extern unsigned int *__ctype32_b; # define iswalnum(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwalnum) : iswalnum (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwalnum) : iswalnum (wc))) # define iswalpha(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwalpha) : iswalpha (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwalpha) : iswalpha (wc))) # define iswcntrl(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwcntrl) : iswcntrl (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwcntrl) : iswcntrl (wc))) # define iswdigit(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwdigit) : iswdigit (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwdigit) : iswdigit (wc))) # define iswlower(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwlower) : iswlower (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwlower) : iswlower (wc))) # define iswgraph(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwgraph) : iswgraph (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwgraph) : iswgraph (wc))) # define iswprint(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwprint) : iswprint (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwprint) : iswprint (wc))) # define iswpunct(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwpunct) : iswpunct (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwpunct) : iswpunct (wc))) # define iswspace(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwspace) : iswspace (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwspace) : iswspace (wc))) # define iswupper(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwupper) : iswupper (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwupper) : iswupper (wc))) # define iswxdigit(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwxdigit) : iswxdigit (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwxdigit) : iswxdigit (wc))) # ifdef __USE_GNU # define iswblank(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & _ISwblank) : iswblank (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwblank) : iswblank (wc))) # endif # define iswctype(wc, desc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (int) (__ctype32_b[wc] & desc) : iswctype (wc, desc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (int) (__ctype32_b[(wint_t) (wc)] & desc) : iswctype (wc, desc))) #endif /* gcc && optimizing */ @@ -245,12 +258,14 @@ extern const wint_t *__ctype32_tolower; extern const wint_t *__ctype32_toupper; # define towlower(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (wint_t) __ctype32_tolower[wc] : towlower (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (wint_t) __ctype32_tolower[(wint_t) (wc)] : towlower (wc))) # define towupper(wc) \ - (__builtin_constant_p (wc) && (wc) >= L'\0' && (wc) <= L'\xff' \ - ? (wint_t) __ctype32_toupper[wc] : towupper (wc)) + (__extension__ \ + (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ + ? (wint_t) __ctype32_toupper[(wint_t) (wc)] : towupper (wc))) #endif /* gcc && optimizing */