You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.8 KiB
85 lines
1.8 KiB
/* this file should not be used directly, only with `#include "regexps.c"` */ |
|
|
|
#include "log.h" |
|
|
|
f2b_regex_t * |
|
f2b_regexlist_append(f2b_regex_t *list, f2b_regex_t *regex) { |
|
assert(regex != NULL); |
|
|
|
regex->next = list; |
|
return regex; |
|
} |
|
|
|
bool |
|
f2b_regexlist_match(f2b_regex_t *list, const char *line, char *buf, size_t buf_size) { |
|
for (; list != NULL; list = list->next) { |
|
if (f2b_regex_match(list, line, buf, buf_size)) |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
f2b_regex_t * |
|
f2b_regexlist_from_file(const char *path) { |
|
f2b_regex_t *list = NULL, *regex = NULL; |
|
FILE *f = NULL; |
|
size_t linenum = 0; |
|
char line[REGEX_LINE_MAX] = ""; |
|
char *p, *q; |
|
|
|
if ((f = fopen(path, "r")) == NULL) { |
|
f2b_log_msg(log_error, "can't open regex list '%s': %s", path, strerror(errno)); |
|
return NULL; |
|
} |
|
|
|
while (1) { |
|
p = fgets(line, sizeof(line), f); |
|
if (!p && (feof(f) || ferror(f))) |
|
break; |
|
linenum++; |
|
/* strip leading spaces */ |
|
while (isblank(*p)) |
|
p++; |
|
/* strip trailing spaces */ |
|
if ((q = strchr(p, '\r')) || (q = strchr(p, '\n'))) { |
|
while(q > p && isspace(*q)) { |
|
*q = '\0'; |
|
q--; |
|
} |
|
} |
|
switch(*p) { |
|
case '\r': |
|
case '\n': |
|
case '\0': |
|
/* empty line */ |
|
break; |
|
case ';': |
|
case '#': |
|
/* comment line */ |
|
break; |
|
default: |
|
/* TODO: icase */ |
|
if ((regex = f2b_regex_create(p, false)) == NULL) { |
|
f2b_log_msg(log_warn, "can't create regex from pattern at %s:%d: %s", path, linenum, p); |
|
continue; |
|
} |
|
list = f2b_regexlist_append(list, regex); |
|
break; |
|
} |
|
} |
|
|
|
return list; |
|
} |
|
|
|
f2b_regex_t * |
|
f2b_regexlist_destroy(f2b_regex_t *list) { |
|
f2b_regex_t *next; |
|
|
|
for (; list != NULL; list = next) { |
|
next = list->next; |
|
f2b_regex_destroy(list); |
|
} |
|
|
|
return NULL; |
|
}
|
|
|