*** empty log message ***
This commit is contained in:
parent
856b83d8ee
commit
f6c98e99ec
104
ase/awk/rex.c
104
ase/awk/rex.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: rex.c,v 1.13 2006-07-25 16:41:40 bacon Exp $
|
* $Id: rex.c,v 1.14 2006-07-26 02:25:47 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -63,6 +63,30 @@ struct __code_t
|
|||||||
xp_size_t ubound;
|
xp_size_t ubound;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct __build_t
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const xp_char_t* ptr;
|
||||||
|
const xp_char_t* end;
|
||||||
|
const xp_char_t* curp;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int type;
|
||||||
|
xp_char_t value;
|
||||||
|
} curc;
|
||||||
|
} ptn;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
xp_byte_t* buf;
|
||||||
|
xp_size_t size;
|
||||||
|
xp_size_t capa;
|
||||||
|
} code;
|
||||||
|
|
||||||
|
int errnum;
|
||||||
|
};
|
||||||
|
|
||||||
struct __match_t
|
struct __match_t
|
||||||
{
|
{
|
||||||
const xp_char_t* match_ptr;
|
const xp_char_t* match_ptr;
|
||||||
@ -239,6 +263,82 @@ const xp_char_t* xp_awk_rex_geterrstr (xp_awk_rex_t* rex)
|
|||||||
return XP_T("unknown error");
|
return XP_T("unknown error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len)
|
||||||
|
{
|
||||||
|
xp_awk_rex_t rex;
|
||||||
|
|
||||||
|
rex.code.capa = 512;
|
||||||
|
rex.code.size = 0;
|
||||||
|
rex.code.buf = (xp_byte_t*) xp_malloc (rex.code.capa);
|
||||||
|
if (rex.code.buf == XP_NULL) return XP_NULL;
|
||||||
|
|
||||||
|
rex.ptn.ptr = ptn;
|
||||||
|
rex.ptn.end = rex.ptn.ptr + len;
|
||||||
|
rex.ptn.curp = rex.ptn.ptr;
|
||||||
|
|
||||||
|
rex.ptn.curc.type = CT_EOF;
|
||||||
|
rex.ptn.curc.value = XP_T('\0');
|
||||||
|
|
||||||
|
//NEXT_CHAR (&rex, LEVEL_TOP);
|
||||||
|
if (__next_char (&rex, LEVEL_TOP) == -1) return XP_NULL;
|
||||||
|
|
||||||
|
if (__compile_pattern (&rex) == -1)
|
||||||
|
{
|
||||||
|
xp_free (rex.code.buf);
|
||||||
|
return XP_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rex.ptn.curc.type != CT_EOF)
|
||||||
|
{
|
||||||
|
/* garbage after the pattern */
|
||||||
|
xp_free (rex.code.buf);
|
||||||
|
return XP_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rex.code.buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
int xp_awk_matchrex (void* code,
|
||||||
|
const xp_char_t* str, xp_size_t len,
|
||||||
|
const xp_char_t** match_ptr, xp_size_t* match_len)
|
||||||
|
{
|
||||||
|
xp_awk_rex_t rex;
|
||||||
|
struct __match_t mat;
|
||||||
|
xp_size_t offset = 0;
|
||||||
|
|
||||||
|
mat.matched = xp_false;
|
||||||
|
|
||||||
|
/* store the source string */
|
||||||
|
rex.match.str.ptr = str;
|
||||||
|
rex.match.str.end = str + len;
|
||||||
|
|
||||||
|
/* TODO: shoud it allow an offset here??? */
|
||||||
|
mat.match_ptr = str + offset;
|
||||||
|
|
||||||
|
while (mat.match_ptr < rex.match.str.end)
|
||||||
|
{
|
||||||
|
if (__match_pattern (
|
||||||
|
&rex, code, &mat) == XP_NULL) return -1;
|
||||||
|
|
||||||
|
if (mat.matched)
|
||||||
|
{
|
||||||
|
if (match_ptr != XP_NULL) *match_ptr = mat.match_ptr;
|
||||||
|
if (match_len != XP_NULL) *match_len = mat.match_len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mat.match_ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (mat.matched)? 1: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void xp_awk_printrex (void* rex)
|
||||||
|
{
|
||||||
|
__print_pattern (rex);
|
||||||
|
xp_printf (XP_T("\n"));
|
||||||
|
}
|
||||||
|
|
||||||
int xp_awk_rex_compile (xp_awk_rex_t* rex, const xp_char_t* ptn, xp_size_t len)
|
int xp_awk_rex_compile (xp_awk_rex_t* rex, const xp_char_t* ptn, xp_size_t len)
|
||||||
{
|
{
|
||||||
rex->ptn.ptr = ptn;
|
rex->ptn.ptr = ptn;
|
||||||
@ -255,7 +355,7 @@ int xp_awk_rex_compile (xp_awk_rex_t* rex, const xp_char_t* ptn, xp_size_t len)
|
|||||||
|
|
||||||
if (rex->ptn.curc.type != CT_EOF)
|
if (rex->ptn.curc.type != CT_EOF)
|
||||||
{
|
{
|
||||||
/* garbage after the patter */
|
/* garbage after the pattern */
|
||||||
rex->errnum = XP_AWK_REX_EGARBAGE;
|
rex->errnum = XP_AWK_REX_EGARBAGE;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: rex.h,v 1.7 2006-07-24 16:23:19 bacon Exp $
|
* $Id: rex.h,v 1.8 2006-07-26 02:25:47 bacon Exp $
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef _XP_AWK_REX_H_
|
#ifndef _XP_AWK_REX_H_
|
||||||
@ -91,9 +91,14 @@ enum
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len);
|
||||||
|
int xp_awk_matchrex (void* code,
|
||||||
|
const xp_char_t* str, xp_size_t len,
|
||||||
|
const xp_char_t** match_ptr, xp_size_t* match_len);
|
||||||
|
|
||||||
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);
|
||||||
void xp_awk_rex_close (xp_awk_rex_t* rex);
|
void xp_awk_rex_close (xp_awk_rex_t* rex);
|
||||||
void xp_awk_rex_clear (xp_awk_rex_t* rex);
|
|
||||||
|
|
||||||
int xp_awk_rex_compile (
|
int xp_awk_rex_compile (
|
||||||
xp_awk_rex_t* rex, const xp_char_t* ptn, xp_size_t len);
|
xp_awk_rex_t* rex, const xp_char_t* ptn, xp_size_t len);
|
||||||
|
@ -4,7 +4,7 @@ CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\.. -D__STAND_ALONE
|
|||||||
LDFLAGS = /libpath:..\..\bas /libpath:..\..\awk
|
LDFLAGS = /libpath:..\..\bas /libpath:..\..\awk
|
||||||
LIBS = xpawk.lib user32.lib
|
LIBS = xpawk.lib user32.lib
|
||||||
|
|
||||||
all: awk rex
|
all: awk rex rex2
|
||||||
|
|
||||||
awk: awk.obj
|
awk: awk.obj
|
||||||
link /nologo /out:awk.exe $(LDFLAGS) $(LIBS) awk.obj
|
link /nologo /out:awk.exe $(LDFLAGS) $(LIBS) awk.obj
|
||||||
@ -12,6 +12,9 @@ awk: awk.obj
|
|||||||
rex: rex.obj
|
rex: rex.obj
|
||||||
link /nologo /out:rex.exe $(LDFLAGS) $(LIBS) rex.obj
|
link /nologo /out:rex.exe $(LDFLAGS) $(LIBS) rex.obj
|
||||||
|
|
||||||
|
rex2: rex2.obj
|
||||||
|
link /nologo /out:rex2.exe $(LDFLAGS) $(LIBS) rex2.obj
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
del $(OBJS) *.obj awk.exe rex.exe
|
del $(OBJS) *.obj awk.exe rex.exe
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user