start on some simple exact matching

This commit is contained in:
Josh Holtrop 2019-10-29 19:17:49 -04:00
parent bd541e581a
commit 8831c93ade
2 changed files with 59 additions and 8 deletions

View File

@ -5,14 +5,26 @@
#define NODE_TYPE_ACCEPT_ONE 0u #define NODE_TYPE_ACCEPT_ONE 0u
#define NODE_TYPE_ACCEPT_RANGE 1u #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) 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) jairee_re_t * jairee_compile(jairee_string_t * rs)
@ -43,6 +55,37 @@ void jairee_re_free(jairee_re_t * re)
free(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) static jairee_cp_t decode_ascii(const void * s, size_t * offset)
{ {
jairee_cp_t cp = (jairee_cp_t)((const char *)s)[*offset]; jairee_cp_t cp = (jairee_cp_t)((const char *)s)[*offset];

View File

@ -25,7 +25,15 @@ typedef struct {
jairee_decode_t decode; jairee_decode_t decode;
} jairee_string_t; } 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 { typedef struct {
node_t * nodes;
size_t error; size_t error;
} jairee_re_t; } jairee_re_t;
@ -37,11 +45,11 @@ jairee_re_t * jairee_compile(jairee_string_t * exp);
void jairee_re_free(jairee_re_t * re); 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 #if 0
jairee_match_t * jairee_match(jairee_string_t * str, size_t start_offset, jairee_string_t * exp); 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_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); jairee_state_t * jairee_startc(jairee_string_t * str, size_t start_offset, jairee_re_t * re, jairee_match_t ** match);