--- regex2.h.bsdnew 2009-11-11 11:29:04.000000000 -0800 +++ regex2.h 2009-11-11 12:18:35.000000000 -0800 @@ -120,14 +120,23 @@ typedef struct { int nranges; int invert; int icase; + int *equiv_classes; + int nequiv_classes; } cset; +#include "collate.h" + static int -CHIN1(cset *cs, wint_t ch) +CHIN1(cset *cs, wint_t ch, locale_t loc) { int i; assert(ch >= 0); + for (i = 0; i < cs->nequiv_classes; i++) + /* sadly, we can only deal with single characters from an + * equivalence class */ + if (__collate_equiv_match(cs->equiv_classes[i], NULL, 0, ch, NULL, 0, NULL, NULL, loc) > 0) + return (!cs->invert); if (ch < NC) return (((cs->bmp[ch >> 3] & (1 << (ch & 7))) != 0) ^ cs->invert); @@ -138,24 +147,24 @@ CHIN1(cset *cs, wint_t ch) if (cs->ranges[i].min <= ch && ch <= cs->ranges[i].max) return (!cs->invert); for (i = 0; i < cs->ntypes; i++) - if (iswctype(ch, cs->types[i])) + if (iswctype_l(ch, cs->types[i], loc)) return (!cs->invert); return (cs->invert); } static __inline int -CHIN(cset *cs, wint_t ch) +CHIN(cset *cs, wint_t ch, locale_t loc) { assert(ch >= 0); - if (ch < NC) + if (ch < NC && cs->nequiv_classes == 0) return (((cs->bmp[ch >> 3] & (1 << (ch & 7))) != 0) ^ cs->invert); else if (cs->icase) - return (CHIN1(cs, ch) || CHIN1(cs, towlower(ch)) || - CHIN1(cs, towupper(ch))); + return (CHIN1(cs, ch, loc) || CHIN1(cs, towlower_l(ch, loc), loc) || + CHIN1(cs, towupper_l(ch, loc), loc)); else - return (CHIN1(cs, ch)); + return (CHIN1(cs, ch, loc)); } /* @@ -185,8 +194,9 @@ struct re_guts { size_t nsub; /* copy of re_nsub */ int backrefs; /* does it use back references? */ sopno nplus; /* how deep does it nest +s? */ + locale_t loc; /* current locale */ }; /* misc utilities */ -#define OUT (CHAR_MIN - 1) /* a non-character value */ -#define ISWORD(c) (iswalnum((uch)(c)) || (c) == '_') +#define OUT (CHAR_MIN - 2) /* a non-character value */ +#define ISWORD(c,l) (iswalnum_l((uch)(c), l) || (c) == '_')