*** empty log message ***
This commit is contained in:
parent
8dd23af516
commit
899dea38f0
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h,v 1.96 2006-08-13 16:04:32 bacon Exp $
|
* $Id: awk.h,v 1.97 2006-08-16 08:55:42 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_AWK_H_
|
#ifndef _XP_AWK_AWK_H_
|
||||||
@ -145,6 +145,7 @@ enum
|
|||||||
XP_AWK_ERUNTIME, /* run-time error */
|
XP_AWK_ERUNTIME, /* run-time error */
|
||||||
XP_AWK_ERUNNING, /* there are running instances */
|
XP_AWK_ERUNNING, /* there are running instances */
|
||||||
XP_AWK_ETOOMANYRUNS, /* too many running instances */
|
XP_AWK_ETOOMANYRUNS, /* too many running instances */
|
||||||
|
XP_AWK_ERECURSION, /* recursion too deep */
|
||||||
|
|
||||||
XP_AWK_ESRCINOPEN,
|
XP_AWK_ESRCINOPEN,
|
||||||
XP_AWK_ESRCINCLOSE,
|
XP_AWK_ESRCINCLOSE,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: err.c,v 1.35 2006-08-10 16:02:15 bacon Exp $
|
* $Id: err.c,v 1.36 2006-08-16 08:55:43 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -19,6 +19,7 @@ const xp_char_t* xp_awk_geterrstr (int errnum)
|
|||||||
XP_T("run-time error"),
|
XP_T("run-time error"),
|
||||||
XP_T("one or more running instances"),
|
XP_T("one or more running instances"),
|
||||||
XP_T("too many running instances"),
|
XP_T("too many running instances"),
|
||||||
|
XP_T("recursion too deep"),
|
||||||
|
|
||||||
XP_T("cannot open source input"),
|
XP_T("cannot open source input"),
|
||||||
XP_T("cannot close source input"),
|
XP_T("cannot close source input"),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: rex.c,v 1.19 2006-08-10 16:03:35 bacon Exp $
|
* $Id: rex.c,v 1.20 2006-08-16 08:55:43 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -86,6 +86,12 @@ struct __builder_t
|
|||||||
xp_size_t capa;
|
xp_size_t capa;
|
||||||
} code;
|
} code;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int max;
|
||||||
|
int cur;
|
||||||
|
} depth;
|
||||||
|
|
||||||
int errnum;
|
int errnum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -100,6 +106,12 @@ struct __matcher_t
|
|||||||
} str;
|
} str;
|
||||||
} match;
|
} match;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int max;
|
||||||
|
int cur;
|
||||||
|
} depth;
|
||||||
|
|
||||||
int errnum;
|
int errnum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -128,6 +140,7 @@ typedef const xp_byte_t* (*atom_matcher_t) (
|
|||||||
#define CODEAT(rex,pos,type) (*((type*)&(rex)->code.buf[pos]))
|
#define CODEAT(rex,pos,type) (*((type*)&(rex)->code.buf[pos]))
|
||||||
|
|
||||||
static int __build_pattern (__builder_t* rex);
|
static int __build_pattern (__builder_t* rex);
|
||||||
|
static int __build_pattern0 (__builder_t* rex);
|
||||||
static int __build_branch (__builder_t* rex);
|
static int __build_branch (__builder_t* rex);
|
||||||
static int __build_atom (__builder_t* rex);
|
static int __build_atom (__builder_t* rex);
|
||||||
static int __build_charset (__builder_t* rex, struct __code_t* cmd);
|
static int __build_charset (__builder_t* rex, struct __code_t* cmd);
|
||||||
@ -146,6 +159,8 @@ static const xp_byte_t* __match_branch (
|
|||||||
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat);
|
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat);
|
||||||
static const xp_byte_t* __match_branch_body (
|
static const xp_byte_t* __match_branch_body (
|
||||||
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat);
|
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat);
|
||||||
|
static const xp_byte_t* __match_branch_body0 (
|
||||||
|
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat);
|
||||||
static const xp_byte_t* __match_atom (
|
static const xp_byte_t* __match_atom (
|
||||||
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat);
|
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat);
|
||||||
static const xp_byte_t* __match_bol (
|
static const xp_byte_t* __match_bol (
|
||||||
@ -220,6 +235,12 @@ static struct __char_class_t __char_class [] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len, int* errnum)
|
void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len, int* errnum)
|
||||||
|
{
|
||||||
|
return xp_awk_safebuildrex (ptn, len, 0, errnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* xp_awk_safebuildrex (
|
||||||
|
const xp_char_t* ptn, xp_size_t len, int max_depth, int* errnum)
|
||||||
{
|
{
|
||||||
__builder_t builder;
|
__builder_t builder;
|
||||||
|
|
||||||
@ -239,7 +260,9 @@ void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len, int* errnum)
|
|||||||
builder.ptn.curc.type = CT_EOF;
|
builder.ptn.curc.type = CT_EOF;
|
||||||
builder.ptn.curc.value = XP_T('\0');
|
builder.ptn.curc.value = XP_T('\0');
|
||||||
|
|
||||||
//NEXT_CHAR (&builder, LEVEL_TOP);
|
builder.depth.max = max_depth;
|
||||||
|
builder.depth.cur = 0;
|
||||||
|
|
||||||
if (__next_char (&builder, LEVEL_TOP) == -1)
|
if (__next_char (&builder, LEVEL_TOP) == -1)
|
||||||
{
|
{
|
||||||
if (errnum != XP_NULL) *errnum = builder.errnum;
|
if (errnum != XP_NULL) *errnum = builder.errnum;
|
||||||
@ -267,17 +290,28 @@ void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len, int* errnum)
|
|||||||
int xp_awk_matchrex (void* code,
|
int xp_awk_matchrex (void* code,
|
||||||
const xp_char_t* str, xp_size_t len,
|
const xp_char_t* str, xp_size_t len,
|
||||||
const xp_char_t** match_ptr, xp_size_t* match_len, int* errnum)
|
const xp_char_t** match_ptr, xp_size_t* match_len, int* errnum)
|
||||||
|
{
|
||||||
|
return xp_awk_safematchrex (
|
||||||
|
code, str, len, match_ptr, match_len, 0, errnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
int xp_awk_safematchrex (void* code,
|
||||||
|
const xp_char_t* str, xp_size_t len,
|
||||||
|
const xp_char_t** match_ptr, xp_size_t* match_len,
|
||||||
|
int max_depth, int* errnum)
|
||||||
{
|
{
|
||||||
__matcher_t matcher;
|
__matcher_t matcher;
|
||||||
__match_t mat;
|
__match_t mat;
|
||||||
xp_size_t offset = 0;
|
xp_size_t offset = 0;
|
||||||
|
|
||||||
mat.matched = xp_false;
|
|
||||||
|
|
||||||
/* store the source string */
|
/* store the source string */
|
||||||
matcher.match.str.ptr = str;
|
matcher.match.str.ptr = str;
|
||||||
matcher.match.str.end = str + len;
|
matcher.match.str.end = str + len;
|
||||||
|
|
||||||
|
matcher.depth.max = max_depth;
|
||||||
|
matcher.depth.cur = 0;
|
||||||
|
|
||||||
|
mat.matched = xp_false;
|
||||||
/* TODO: shoud it allow an offset here??? */
|
/* TODO: shoud it allow an offset here??? */
|
||||||
mat.match_ptr = str + offset;
|
mat.match_ptr = str + offset;
|
||||||
|
|
||||||
@ -309,12 +343,30 @@ void xp_awk_printrex (void* rex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int __build_pattern (__builder_t* builder)
|
static int __build_pattern (__builder_t* builder)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
if (builder->depth.max > 0 && builder->depth.cur >= builder->depth.max)
|
||||||
|
{
|
||||||
|
builder->errnum = XP_AWK_ERECURSION;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
builder->depth.cur++;
|
||||||
|
n = __build_pattern0 (builder);
|
||||||
|
builder->depth.cur--;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __build_pattern0 (__builder_t* builder)
|
||||||
{
|
{
|
||||||
xp_size_t zero = 0;
|
xp_size_t zero = 0;
|
||||||
xp_size_t old_size;
|
xp_size_t old_size;
|
||||||
xp_size_t pos_nb, pos_el;
|
xp_size_t pos_nb, pos_el;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
|
||||||
old_size = builder->code.size;
|
old_size = builder->code.size;
|
||||||
|
|
||||||
/* secure space for header and set the header fields to zero */
|
/* secure space for header and set the header fields to zero */
|
||||||
@ -905,6 +957,24 @@ static const xp_byte_t* __match_branch (
|
|||||||
|
|
||||||
static const xp_byte_t* __match_branch_body (
|
static const xp_byte_t* __match_branch_body (
|
||||||
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat)
|
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat)
|
||||||
|
{
|
||||||
|
const xp_byte_t* n;
|
||||||
|
|
||||||
|
if (matcher->depth.max > 0 && matcher->depth.cur >= matcher->depth.max)
|
||||||
|
{
|
||||||
|
matcher->errnum = XP_AWK_ERECURSION;
|
||||||
|
return XP_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
matcher->depth.cur++;
|
||||||
|
n = __match_branch_body0 (matcher, base, mat);
|
||||||
|
matcher->depth.cur--;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const xp_byte_t* __match_branch_body0 (
|
||||||
|
__matcher_t* matcher, const xp_byte_t* base, __match_t* mat)
|
||||||
{
|
{
|
||||||
const xp_byte_t* p;
|
const xp_byte_t* p;
|
||||||
// __match_t mat2;
|
// __match_t mat2;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: rex.h,v 1.11 2006-08-10 16:02:15 bacon Exp $
|
* $Id: rex.h,v 1.12 2006-08-16 08:55:43 bacon Exp $
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef _XP_AWK_REX_H_
|
#ifndef _XP_AWK_REX_H_
|
||||||
@ -48,10 +48,18 @@ extern "C" {
|
|||||||
|
|
||||||
void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len, int* errnum);
|
void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len, int* errnum);
|
||||||
|
|
||||||
|
void* xp_awk_safebuildrex (
|
||||||
|
const xp_char_t* ptn, xp_size_t len, int max_depth, int* errnum);
|
||||||
|
|
||||||
int xp_awk_matchrex (void* code,
|
int xp_awk_matchrex (void* code,
|
||||||
const xp_char_t* str, xp_size_t len,
|
const xp_char_t* str, xp_size_t len,
|
||||||
const xp_char_t** match_ptr, xp_size_t* match_len, int* errnum);
|
const xp_char_t** match_ptr, xp_size_t* match_len, int* errnum);
|
||||||
|
|
||||||
|
int xp_awk_safematchrex (void* code,
|
||||||
|
const xp_char_t* str, xp_size_t len,
|
||||||
|
const xp_char_t** match_ptr, xp_size_t* match_len,
|
||||||
|
int max_depth, int* errnum);
|
||||||
|
|
||||||
void xp_awk_printrex (void* code);
|
void xp_awk_printrex (void* code);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
Loading…
x
Reference in New Issue
Block a user