---- regex2.h.orig 2004-11-25 11:38:32.000000000 -0800
-+++ regex2.h 2005-02-24 14:26:21.000000000 -0800
-@@ -127,9 +127,10 @@
+--- 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(cs, ch)
-+CHIN1(cs, ch, loc)
- cset *cs;
- wint_t ch;
-+locale_t loc;
+-CHIN1(cset *cs, wint_t ch)
++CHIN1(cset *cs, wint_t ch, locale_t loc)
{
int i;
-@@ -144,15 +145,16 @@
+ 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++)
}
static __inline int
--CHIN(cs, ch)
-+CHIN(cs, ch, loc)
- cset *cs;
- wint_t ch;
-+locale_t loc;
+-CHIN(cset *cs, wint_t ch)
++CHIN(cset *cs, wint_t ch, locale_t loc)
{
assert(ch >= 0);
-@@ -160,10 +162,10 @@
+- 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)
}
/*
-@@ -193,8 +195,9 @@
+@@ -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? */
};
/* misc utilities */
- #define OUT (-2) /* a non-character value */
+-#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) == '_')