regex_parser.c

Thu, 02 Feb 2012 14:17:35 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 02 Feb 2012 14:17:35 +0100
changeset 28
72a98cbcb9f1
parent 27
95a958e3de88
child 29
fa625066ae52
permissions
-rw-r--r--

added regex parser

universe@27 1 /*
universe@27 2 * regex_parser.c
universe@27 3 *
universe@27 4 * Created on: 26.01.2012
universe@27 5 * Author: fox3049
universe@27 6 */
universe@27 7
universe@27 8 #include "regex_parser.h"
universe@27 9
universe@27 10 regex_parser_t* new_regex_parser_t() {
universe@27 11 regex_parser_t* ret = malloc(sizeof(regex_parser_t));
universe@27 12 if (ret != NULL) {
universe@27 13 ret->pattern_list = new_string_list_t();
universe@27 14 ret->matched_lines = 0;
universe@27 15 ret->pattern_match = 0;
universe@27 16 ret->compiled_patterns = NULL;
universe@28 17 ret->compiled_pattern_count = 0;
universe@27 18 }
universe@27 19 return ret;
universe@27 20 }
universe@27 21
universe@28 22 void regex_destcomppats(regex_parser_t* parser) {
universe@28 23 if (parser->compiled_patterns != NULL) {
universe@28 24 for (int i = 0 ; i < parser->compiled_pattern_count ; i++) {
universe@28 25 if (parser->compiled_patterns[i] != NULL) {
universe@28 26 free(parser->compiled_patterns[i]);
universe@28 27 }
universe@28 28 }
universe@28 29 free(parser->compiled_patterns);
universe@28 30 parser->compiled_patterns = NULL;
universe@28 31 parser->compiled_pattern_count = 0;
universe@28 32 }
universe@28 33 }
universe@28 34
universe@27 35 void destroy_regex_parser_t(regex_parser_t* parser) {
universe@28 36 regex_destcomppats(parser);
universe@27 37 destroy_string_list_t(parser->pattern_list);
universe@27 38 free(parser);
universe@27 39 }
universe@27 40
universe@27 41 bool regex_parser_matching(regex_parser_t* parser) {
universe@27 42 return parser->pattern_match > 0;
universe@27 43 }
universe@27 44
universe@28 45 int regex_parser_do(regex_parser_t* parser, char* input) {
universe@28 46 int err = REG_NOMATCH;
universe@28 47 if (parser->compiled_pattern_count > 0) {
universe@28 48 regmatch_t match;
universe@27 49
universe@28 50 if (regex_parser_matching(parser)) {
universe@28 51 parser->matched_lines++;
universe@28 52
universe@28 53 err = regexec(parser->compiled_patterns[parser->pattern_match],
universe@28 54 input, 1, &match, 0);
universe@28 55 if (err > 0 && err != REG_NOMATCH) {
universe@28 56 fprintf(stderr, "Regex-Error: 0x%08x", err);
universe@28 57 }
universe@28 58 if (err == 0) {
universe@28 59 parser->pattern_match = 0;
universe@28 60 /* do not match line, if it does not end with the pattern */
universe@28 61 if (match.rm_eo < strlen(input)) {
universe@28 62 parser->matched_lines--;
universe@28 63 }
universe@28 64 }
universe@28 65 } else {
universe@28 66 for (int i = 0 ; i < parser->compiled_pattern_count - 1 ; i += 2) {
universe@28 67 err = regexec(parser->compiled_patterns[i], input, 1, &match, 0);
universe@28 68 if (err > 0 && err != REG_NOMATCH) {
universe@28 69 fprintf(stderr, "Regex-Error: 0x%08x", err);
universe@28 70 }
universe@28 71 if (err == 0) {
universe@28 72 parser->pattern_match = i+1;
universe@28 73 parser->matched_lines = 0;
universe@28 74 /* Check, if end pattern is also in this line */
universe@28 75 regex_parser_do(parser, input);
universe@28 76 /* do not match line, if it does not start with the pattern */
universe@28 77 if (match.rm_so > 0 && parser->matched_lines > 0) {
universe@28 78 parser->matched_lines--;
universe@28 79 }
universe@28 80 break;
universe@28 81 }
universe@27 82 }
universe@27 83 }
universe@27 84 }
universe@28 85 return err;
universe@27 86 }
universe@28 87
universe@28 88 bool regex_compile_all(regex_parser_t* parser) {
universe@28 89 bool success = true;
universe@28 90 size_t pcount = parser->pattern_list->count;
universe@28 91 if (pcount > 0) {
universe@28 92 regex_destcomppats(parser);
universe@28 93 parser->compiled_patterns = calloc(pcount, sizeof(regex_t));
universe@28 94 parser->compiled_pattern_count = pcount;
universe@28 95
universe@28 96 regex_t* re;
universe@28 97 for (int i = 0 ; i < pcount ; i++) {
universe@28 98 re = malloc(sizeof(regex_t));
universe@28 99 if (regcomp(re, parser->pattern_list->items[i], REG_EXTENDED) == 0) {
universe@28 100 parser->compiled_patterns[i] = re;
universe@28 101 } else {
universe@28 102 fprintf(stderr, "Cannot compile pattern: %s\n",
universe@28 103 (parser->pattern_list->items[i]));
universe@28 104 parser->compiled_patterns[i] = NULL;
universe@28 105 success = false;
universe@28 106 }
universe@28 107 }
universe@28 108 }
universe@28 109 return success;
universe@28 110 }

mercurial