*** empty log message ***
This commit is contained in:
parent
a70e9a0f76
commit
6df65679cd
@ -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 <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -39,7 +39,6 @@ struct __code
|
|||||||
#define PC_UBOUND(rex,base) (rex)->code[(base)].dc.ubound
|
#define PC_UBOUND(rex,base) (rex)->code[(base)].dc.ubound
|
||||||
#define PC_VALUE(rex,base) (rex)->code[(base)].cc
|
#define PC_VALUE(rex,base) (rex)->code[(base)].cc
|
||||||
|
|
||||||
|
|
||||||
xp_awk_rex_t* xp_awk_rex_open (xp_awk_rex_t* rex)
|
xp_awk_rex_t* xp_awk_rex_open (xp_awk_rex_t* rex)
|
||||||
{
|
{
|
||||||
if (rex == XP_NULL)
|
if (rex == XP_NULL)
|
||||||
@ -58,11 +57,13 @@ void xp_awk_rex_close (xp_awk_rex_t* rex)
|
|||||||
if (rex->__dynamic) xp_free (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;
|
const xp_char_t* p = ptn;
|
||||||
xp_char_t c;
|
xp_char_t c;
|
||||||
|
|
||||||
|
rex->ptn = ptn;
|
||||||
|
|
||||||
while (*p != XP_T('\0'))
|
while (*p != XP_T('\0'))
|
||||||
{
|
{
|
||||||
c = *p++; // TODO: backspace escaping...
|
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;
|
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)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user