The explanation of these three changes is available from http://lists.gnu.org/archive/html/bug-gnu-utils/2004-11/msg00096.html http://lists.gnu.org/archive/html/bug-gnu-utils/2004-11/msg00098.html http://lists.gnu.org/archive/html/bug-gnu-utils/2004-11/msg00097.html respectively. --- dfa.c 2004-12-16 09:27:24.000000000 +0100 +++ dfa.c 2004-12-16 13:20:30.000000000 +0100 @@ -595,6 +595,9 @@ { wctype_t wt; /* Query the character class as wctype_t. */ + if (case_fold && (strcmp(str, "upper") == 0 || strcmp(str, "lower") == 0)) + strcpy(str, "alpha"); + wt = wctype (str); if (ch_classes_al == 0) @@ -633,7 +636,7 @@ work_mbc->coll_elems[work_mbc->ncoll_elems++] = elem; } } - wc = WEOF; + wc = wc1 = WEOF; } else /* We treat '[' as a normal character here. */ @@ -681,6 +684,28 @@ REALLOC_IF_NECESSARY(work_mbc->range_ends, wchar_t, range_ends_al, work_mbc->nranges + 1); work_mbc->range_ends[work_mbc->nranges++] = (wchar_t)wc2; + if (case_fold && (iswlower((wint_t)wc) || iswupper((wint_t)wc)) + && (iswlower((wint_t)wc2) || iswupper((wint_t)wc2))) + { + wint_t altcase; + altcase = wc; + if (iswlower((wint_t)wc)) + altcase = towupper((wint_t)wc); + else + altcase = towlower((wint_t)wc); + REALLOC_IF_NECESSARY(work_mbc->range_sts, wchar_t, + range_sts_al, work_mbc->nranges + 1); + work_mbc->range_sts[work_mbc->nranges] = (wchar_t)altcase; + + altcase = wc2; + if (iswlower((wint_t)wc2)) + altcase = towupper((wint_t)wc2); + else + altcase = towlower((wint_t)wc2); + REALLOC_IF_NECESSARY(work_mbc->range_ends, wchar_t, + range_ends_al, work_mbc->nranges + 1); + work_mbc->range_ends[work_mbc->nranges++] = (wchar_t)altcase; + } } else if (wc != WEOF) /* build normal characters. */