diff --git a/ase/awk/rex.c b/ase/awk/rex.c index 854d0a23..9766e537 100644 --- a/ase/awk/rex.c +++ b/ase/awk/rex.c @@ -1,5 +1,5 @@ /* - * $Id: rex.c,v 1.2 2006-07-17 14:27:09 bacon Exp $ + * $Id: rex.c,v 1.3 2006-07-18 15:28:26 bacon Exp $ */ #include @@ -39,7 +39,6 @@ struct __code #define PC_UBOUND(rex,base) (rex)->code[(base)].dc.ubound #define PC_VALUE(rex,base) (rex)->code[(base)].cc - xp_awk_rex_t* xp_awk_rex_open (xp_awk_rex_t* rex) { if (rex == XP_NULL) @@ -58,11 +57,13 @@ void xp_awk_rex_close (xp_awk_rex_t* rex) if (rex->__dynamic) xp_free (rex); } -int xp_awk_rex_compile (const xp_awk_rex_t* rex, const xp_char_t* ptn) +int xp_awk_rex_compile (xp_awk_rex_t* rex, const xp_char_t* ptn) { const xp_char_t* p = ptn; xp_char_t c; + rex->ptn = ptn; + while (*p != XP_T('\0')) { c = *p++; // TODO: backspace escaping... @@ -75,3 +76,78 @@ int xp_awk_rex_compile (const xp_awk_rex_t* rex, const xp_char_t* ptn) return -1; } + +int __compile_expression (xp_awk_rex_t* rex) +{ + if (__compile_branch (rex) == -1) return -1; + + while (rex->curc == VBAR) + { + GET_NEXT_CHAR (rex); + + branch_base = rex->code_size; + if (compie_branch(rex) == -1) return -1; + + rex->code[branch_base]++; + rex->code[len_base] += xxxxx; + } +} + +int __compile_branch (xp_awk_rex_t* rex) +{ + + while (1) + { + atom_base = rex->code_size; + + n = compile_atom (); + if (n == -1) return -1; + if (n == 1) break; + + c = rex->curc; + if (c == PLUS) /* + */ + { + __apply_bound (1, MAX); + get_next_char (); + } + else if (c == STAR) /* * */ + { + __apply_bound (0, MAX); + get_next_char (); + } + else if (c == QUEST) /* ? */ + { + __apply_bound (0, 1); + get_next_char (); + } + else if (c == LBRACE) /* { */ + { + if (__compile_bound(rex) == -1) return -1; + } + } +} + +int __compile_atom (xp_awk_rex_t* rex) +{ + xp_char_t c; + + c = rex->curc; + + if (c == LPAREN) + { + } + else + { + if (c == CARET) + else if (c == DOLLAR) + else if (c == PERIOD) + else if (c == LBRACKET) + else if (....) + } + + return n; +} + +int __compile_bound (xp_awk_rex_t* rex) +{ +}