mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-27 17:52:43 +00:00
51 lines
1.2 KiB
Diff
51 lines
1.2 KiB
Diff
$FreeBSD$
|
|
|
|
Index: b.c
|
|
===================================================================
|
|
--- b.c (revision 201951)
|
|
+++ b.c (working copy)
|
|
@@ -285,9 +285,21 @@ int quoted(char **pp) /* pick up next thing after
|
|
return c;
|
|
}
|
|
|
|
+static int collate_range_cmp(int a, int b)
|
|
+{
|
|
+ static char s[2][2];
|
|
+
|
|
+ if ((uschar)a == (uschar)b)
|
|
+ return 0;
|
|
+ s[0][0] = a;
|
|
+ s[1][0] = b;
|
|
+ return (strcoll(s[0], s[1]));
|
|
+}
|
|
+
|
|
char *cclenter(const char *argp) /* add a character class */
|
|
{
|
|
int i, c, c2;
|
|
+ int j;
|
|
uschar *p = (uschar *) argp;
|
|
uschar *op, *bp;
|
|
static uschar *buf = 0;
|
|
@@ -306,15 +318,18 @@ char *cclenter(const char *argp) /* add a characte
|
|
c2 = *p++;
|
|
if (c2 == '\\')
|
|
c2 = quoted((char **) &p);
|
|
- if (c > c2) { /* empty; ignore */
|
|
+ if (collate_range_cmp(c, c2) > 0) {
|
|
bp--;
|
|
i--;
|
|
continue;
|
|
}
|
|
- while (c < c2) {
|
|
+ for (j = 0; j < NCHARS; j++) {
|
|
+ if ((collate_range_cmp(c, j) > 0) ||
|
|
+ collate_range_cmp(j, c2) > 0)
|
|
+ continue;
|
|
if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, "cclenter1"))
|
|
FATAL("out of space for character class [%.10s...] 2", p);
|
|
- *bp++ = ++c;
|
|
+ *bp++ = j;
|
|
i++;
|
|
}
|
|
continue;
|