127 lines
2.3 KiB
C
127 lines
2.3 KiB
C
/* -*- mode: c; mode: fold -*- */
|
|
# include "config.h"
|
|
/*# undef HAVE_REGEX_H*/
|
|
# include <stdlib.h>
|
|
# include <string.h>
|
|
# include "pager.h"
|
|
# include "valid.h"
|
|
|
|
valid_t *
|
|
v_new (char *pattern)
|
|
{
|
|
valid_t *v;
|
|
# if ! HAVE_REGEX_H
|
|
int cnt, siz;
|
|
char *ptr, *sav;
|
|
int n;
|
|
# endif /* ! HAVE_REGEX_H */
|
|
|
|
if (v = (valid_t *) malloc (sizeof (valid_t))) {
|
|
# if HAVE_REGEX_H
|
|
if (regcomp (& v -> r, pattern, REG_EXTENDED)) {
|
|
free (v);
|
|
v = NULL;
|
|
}
|
|
# else /* HAVE_REGEX_H */
|
|
v -> pats = NULL;
|
|
v -> lens = NULL;
|
|
v -> malways = 0;
|
|
if (! strcmp (pattern, "-"))
|
|
v -> malways = 1;
|
|
else if (pattern = strdup (pattern)) {
|
|
cnt = 0;
|
|
siz = 0;
|
|
for (ptr = pattern; ptr; ) {
|
|
sav = ptr;
|
|
if (ptr = strchr (ptr, '|'))
|
|
*ptr++ = '\0';
|
|
if (cnt >= siz) {
|
|
siz += 4;
|
|
if (! (v -> pats = Realloc (v -> pats, (siz + 1) * sizeof (char *))))
|
|
break;
|
|
}
|
|
if (! (v -> pats[cnt] = strdup (sav))) {
|
|
while (--cnt >= 0)
|
|
free (v -> pats[cnt]);
|
|
free (v -> pats);
|
|
v -> pats = NULL;
|
|
break;
|
|
}
|
|
++cnt;
|
|
}
|
|
free (pattern);
|
|
if (v -> pats) {
|
|
v -> pats[cnt] = NULL;
|
|
if (! (v -> lens = (int *) malloc ((cnt + 1) * sizeof (int)))) {
|
|
for (n = 0; n < cnt; ++n)
|
|
free (v -> pats[n]);
|
|
free (v -> pats);
|
|
v -> pats = NULL;
|
|
} else
|
|
for (n = 0; n < cnt; ++n)
|
|
v -> lens[n] = strlen (v -> pats[n]);
|
|
}
|
|
if (! v -> pats) {
|
|
free (v);
|
|
v = NULL;
|
|
}
|
|
}
|
|
# endif /* HAVE_REGEX_H */
|
|
}
|
|
return v;
|
|
}
|
|
|
|
Bool
|
|
v_alidate (valid_t *v, char *str, int *start, int *end)
|
|
{
|
|
Bool ret = False;
|
|
# if HAVE_REGEX_H
|
|
regmatch_t mt;
|
|
|
|
if (! regexec (& v -> r, str, 1, & mt, 0)) {
|
|
*start = mt.rm_so;
|
|
*end = mt.rm_eo;
|
|
ret = True;
|
|
}
|
|
# else /* HAVE_REGEX_H */
|
|
int n;
|
|
|
|
if (v -> pats) {
|
|
for (n = 0; v -> pats[n]; ++n)
|
|
if (! strncmp (v -> pats[n], str, v -> lens[n]))
|
|
break;
|
|
if (v -> pats[n]) {
|
|
*start = 0;
|
|
*end = v -> lens[n];
|
|
ret = True;
|
|
}
|
|
} else if (v -> malways) {
|
|
*start = 0;
|
|
*end = 0;
|
|
ret = True;
|
|
}
|
|
# endif /* HAVE_REGEX_H */
|
|
return ret;
|
|
}
|
|
|
|
void
|
|
v_free (valid_t *v)
|
|
{
|
|
# if HAVE_REGEX_H
|
|
regfree (& v -> r);
|
|
# else /* HAVE_REGEX_H */
|
|
int n;
|
|
|
|
if (v -> pats) {
|
|
for (n = 0; v -> pats[n]; ++n)
|
|
free (v -> pats[n]);
|
|
free (v -> pats);
|
|
}
|
|
if (v -> lens) {
|
|
free (v -> lens);
|
|
v -> lens = NULL;
|
|
}
|
|
# endif /* HAVE_REGEX_H */
|
|
free (v);
|
|
}
|