diff --git a/src/jairee.c b/src/jairee.c index da152e0..57c5c4c 100644 --- a/src/jairee.c +++ b/src/jairee.c @@ -5,14 +5,26 @@ #define NODE_TYPE_ACCEPT_ONE 0u #define NODE_TYPE_ACCEPT_RANGE 1u -typedef struct { - jairee_cp_t cp1; - jairee_cp_t cp2; - size_t type; -} node_t; - bool jairee_compile_add_cp(jairee_re_t * re, jairee_cp_t cp) { + node_t * node = (node_t *)malloc(sizeof(node_t)); + node->next = NULL; + node->cp1 = cp; + node->type = NODE_TYPE_ACCEPT_ONE; + if (re->nodes == NULL) + { + re->nodes = node; + } + else + { + node_t * current = re->nodes; + while (current->next != NULL) + { + current = current->next; + } + current->next = node; + } + return true; } jairee_re_t * jairee_compile(jairee_string_t * rs) @@ -43,6 +55,37 @@ void jairee_re_free(jairee_re_t * re) free(re); } +jairee_match_t * jairee_matchc(jairee_string_t * str, size_t start_offset, jairee_re_t * re) +{ + if ((re->error != 0u) || (re->nodes == NULL)) + { + return NULL; + } + node_t * node = re->nodes; + size_t offset = start_offset; + while (node != NULL) + { + if (offset >= str->len) + { + return NULL; + } + jairee_cp_t cp = str->decode(str->str, &offset); + if (cp == JAIREE_DECODE_ERROR) + { + return NULL; + } + if (cp == node->cp1) + { + node = node->next; + } + } + jairee_match_t * match = (jairee_match_t *)malloc(sizeof(jairee_match_t)); + match->start = start_offset; + match->end = offset; + match->next = NULL; + return match; +} + static jairee_cp_t decode_ascii(const void * s, size_t * offset) { jairee_cp_t cp = (jairee_cp_t)((const char *)s)[*offset]; diff --git a/src/jairee.h b/src/jairee.h index cc795f9..3c489dc 100644 --- a/src/jairee.h +++ b/src/jairee.h @@ -25,7 +25,15 @@ typedef struct { jairee_decode_t decode; } jairee_string_t; +typedef struct node_s { + struct node_s * next; + jairee_cp_t cp1; + jairee_cp_t cp2; + size_t type; +} node_t; + typedef struct { + node_t * nodes; size_t error; } jairee_re_t; @@ -37,11 +45,11 @@ jairee_re_t * jairee_compile(jairee_string_t * exp); void jairee_re_free(jairee_re_t * re); +jairee_match_t * jairee_matchc(jairee_string_t * str, size_t start_offset, jairee_re_t * re); + #if 0 jairee_match_t * jairee_match(jairee_string_t * str, size_t start_offset, jairee_string_t * exp); -jairee_match_t * jairee_matchc(jairee_string_t * str, size_t start_offset, jairee_re_t * re); - jairee_state_t * jairee_start(jairee_string_t * str, size_t start_offset, jairee_string_t * exp, jairee_match_t ** match); jairee_state_t * jairee_startc(jairee_string_t * str, size_t start_offset, jairee_re_t * re, jairee_match_t ** match);