diff --git a/src/jairee.c b/src/jairee.c new file mode 100644 index 0000000..d6f8ff5 --- /dev/null +++ b/src/jairee.c @@ -0,0 +1,65 @@ +#include "jairee.h" +#include +#include + +#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) +{ +} + +jairee_re_t * jairee_compile(jairee_string_t * rs) +{ + jairee_re_t * re = (jairee_re_t *)malloc(sizeof(jairee_re_t)); + re->error = 0u; + + size_t offset = 0u; + while (offset < rs->len) + { + jairee_cp_t cp = rs->decode(rs->str, &offset); + if (cp == JAIREE_DECODE_ERROR) + { + re->error |= JAIREE_ERR_DECODE; + break; + } + if (!jairee_compile_add_cp(re, cp)) + { + break; + } + } + + return re; +} + +void jairee_free_re(jairee_re_t * re) +{ + free(re); +} + +static jairee_cp_t decode_ascii(const void * s, size_t * offset) +{ + jairee_cp_t cp = (jairee_cp_t)((const char *)s)[*offset]; + (*offset)++; + return cp; +} + +jairee_string_t * jairee_string_from_asciiz(const char * s) +{ + jairee_string_t * js = (jairee_string_t *)malloc(sizeof(jairee_string_t)); + js->str = s; + js->len = strlen(s); + js->decode = decode_ascii; + return js; +} + +void jairee_free_string(jairee_string_t * str) +{ + free(str); +} diff --git a/src/jairee.h b/src/jairee.h index c2d185a..5ee3cbe 100644 --- a/src/jairee.h +++ b/src/jairee.h @@ -4,11 +4,14 @@ #include #include -#define JAIREE_DECODE_ERROR 0xFEFEFEFFu +#define JAIREE_DECODE_ERROR 0xFEFEFE00u + +#define JAIREE_ERR_DECODE 0x1u +#define JAIREE_ERR_COMPILE 0x2u typedef uint32_t jairee_cp_t; -typedef jairee_cp_t (*jairee_decode_t)(void * str, size_t offset); +typedef jairee_cp_t (*jairee_decode_t)(const void * str, size_t * offset); typedef struct jairee_match_s { size_t start; @@ -17,13 +20,13 @@ typedef struct jairee_match_s { } jairee_match_t; typedef struct { - void * str; + const void * str; size_t len; jairee_decode_t decode; } jairee_string_t; typedef struct { - size_t todo; + size_t error; } jairee_re_t; typedef struct { @@ -32,6 +35,9 @@ typedef struct { jairee_re_t * jairee_compile(jairee_string_t * exp); +void jairee_free_re(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); @@ -41,5 +47,10 @@ jairee_state_t * jairee_start(jairee_string_t * str, size_t start_offset, jairee jairee_state_t * jairee_startc(jairee_string_t * str, size_t start_offset, jairee_re_t * re, jairee_match_t ** match); jairee_status_t jairee_step(jairee_state_t * state, size_t timeout); +#endif + +jairee_string_t * jairee_string_from_asciiz(const char * s); + +void jairee_free_string(jairee_string_t * str); #endif