version 1.13, 2021/10/31 21:34:16 |
version 1.14, 2021/11/02 03:09:15 |
|
|
}; |
}; |
|
|
static void |
static void |
genclass(s) |
genclass(STR *s) |
STR *s; |
|
{ |
{ |
int cnt, (*func)(int); |
|
CLASS *cp, tmp; |
CLASS *cp, tmp; |
int *p; |
size_t len; |
|
int i; |
|
|
tmp.name = (char *)s->str; |
tmp.name = (char *)s->str; |
if ((cp = (CLASS *)bsearch(&tmp, classes, sizeof(classes) / |
if ((cp = (CLASS *)bsearch(&tmp, classes, sizeof(classes) / |
sizeof(CLASS), sizeof(CLASS), c_class)) == NULL) |
sizeof(CLASS), sizeof(CLASS), c_class)) == NULL) |
errx(1, "unknown class %s", s->str); |
errx(1, "unknown class %s", s->str); |
|
|
if ((cp->set = p = calloc(NCHARS + 1, sizeof(int))) == NULL) |
/* |
errx(1, "no memory for a class"); |
* Generate the set of characters in the class if we haven't |
for (cnt = 0, func = cp->func; cnt < NCHARS; ++cnt) |
* already done so. |
if ((func)(cnt)) |
*/ |
*p++ = cnt; |
if (cp->set == NULL) { |
*p = OOBCH; |
cp->set = reallocarray(NULL, NCHARS + 1, sizeof(*cp->set)); |
|
if (cp->set == NULL) |
|
err(1, NULL); |
|
len = 0; |
|
for (i = 0; i < NCHARS; i++) { |
|
if (cp->func(i)) { |
|
cp->set[len] = i; |
|
len++; |
|
} |
|
} |
|
cp->set[len] = OOBCH; |
|
len++; |
|
cp->set = reallocarray(cp->set, len, sizeof(*cp->set)); |
|
if (cp->set == NULL) |
|
err(1, NULL); |
|
} |
|
|
s->cnt = 0; |
s->cnt = 0; |
s->state = SET; |
s->state = SET; |