start on some simple exact matching
This commit is contained in:
parent
bd541e581a
commit
8831c93ade
55
src/jairee.c
55
src/jairee.c
@ -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];
|
||||||
|
12
src/jairee.h
12
src/jairee.h
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user