*** empty log message ***
This commit is contained in:
parent
ff3823788f
commit
c2acd692ae
174
ase/awk/rex.c
174
ase/awk/rex.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: rex.c,v 1.69 2007-02-28 11:00:32 bacon Exp $
|
||||
* $Id: rex.c,v 1.70 2007-02-28 11:04:16 bacon Exp $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -53,13 +53,13 @@ enum
|
||||
#define BOUND_MIN 0
|
||||
#define BOUND_MAX (ASE_TYPE_MAX(ase_size_t))
|
||||
|
||||
typedef struct __builder_t __builder_t;
|
||||
typedef struct __matcher_t __matcher_t;
|
||||
typedef struct builder_t builder_t;
|
||||
typedef struct matcher_t matcher_t;
|
||||
typedef struct __match_t __match_t;
|
||||
|
||||
#include <ase/pack.h>
|
||||
|
||||
ASE_BEGIN_PACKED_STRUCT (__code_t)
|
||||
ASE_BEGIN_PACKED_STRUCT (code_t)
|
||||
/*ase_byte_t cmd;*/
|
||||
short cmd;
|
||||
short negate; /* only for CMD_CHARSET */
|
||||
@ -67,7 +67,7 @@ ASE_BEGIN_PACKED_STRUCT (__code_t)
|
||||
ase_size_t ubound;
|
||||
ASE_END_PACKED_STRUCT ()
|
||||
|
||||
ASE_BEGIN_PACKED_STRUCT (__builder_t)
|
||||
ASE_BEGIN_PACKED_STRUCT (builder_t)
|
||||
ase_awk_t* awk;
|
||||
|
||||
struct
|
||||
@ -98,7 +98,7 @@ ASE_BEGIN_PACKED_STRUCT (__builder_t)
|
||||
int errnum;
|
||||
ASE_END_PACKED_STRUCT ()
|
||||
|
||||
ASE_BEGIN_PACKED_STRUCT (__matcher_t)
|
||||
ASE_BEGIN_PACKED_STRUCT (matcher_t)
|
||||
ase_awk_t* awk;
|
||||
|
||||
struct
|
||||
@ -133,7 +133,7 @@ ASE_END_PACKED_STRUCT ()
|
||||
#include <ase/unpack.h>
|
||||
|
||||
typedef const ase_byte_t* (*atom_matcher_t) (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
|
||||
#define NCHARS_REMAINING(rex) ((rex)->ptn.end - (rex)->ptn.curp)
|
||||
|
||||
@ -151,27 +151,27 @@ typedef const ase_byte_t* (*atom_matcher_t) (
|
||||
#define SET_CODE(rex,pos,type,code) (GET_CODE(rex,pos,type) = (code))
|
||||
#endif
|
||||
|
||||
static int __build_pattern (__builder_t* rex);
|
||||
static int __build_pattern0 (__builder_t* rex);
|
||||
static int __build_branch (__builder_t* rex);
|
||||
static int __build_atom (__builder_t* rex);
|
||||
static int __build_charset (__builder_t* rex, struct __code_t* cmd);
|
||||
static int __build_occurrences (__builder_t* rex, struct __code_t* cmd);
|
||||
static int __build_cclass (__builder_t* rex, ase_char_t* cc);
|
||||
static int __build_range (__builder_t* rex, struct __code_t* cmd);
|
||||
static int __next_char (__builder_t* rex, int level);
|
||||
static int __add_code (__builder_t* rex, void* data, ase_size_t len);
|
||||
static int __build_pattern (builder_t* rex);
|
||||
static int __build_pattern0 (builder_t* rex);
|
||||
static int __build_branch (builder_t* rex);
|
||||
static int __build_atom (builder_t* rex);
|
||||
static int __build_charset (builder_t* rex, struct code_t* cmd);
|
||||
static int __build_occurrences (builder_t* rex, struct code_t* cmd);
|
||||
static int __build_cclass (builder_t* rex, ase_char_t* cc);
|
||||
static int __build_range (builder_t* rex, struct code_t* cmd);
|
||||
static int __next_char (builder_t* rex, int level);
|
||||
static int __add_code (builder_t* rex, void* data, ase_size_t len);
|
||||
|
||||
#if defined(__sparc) || defined(__sparc__)
|
||||
|
||||
static ase_size_t __get_code (__builder_t* builder, ase_size_t pos)
|
||||
static ase_size_t __get_code (builder_t* builder, ase_size_t pos)
|
||||
{
|
||||
ase_size_t code;
|
||||
ase_memcpy (&code, &builder->code.buf[pos], ASE_SIZEOF(code));
|
||||
return code;
|
||||
}
|
||||
|
||||
static void __set_code (__builder_t* builder, ase_size_t pos, ase_size_t code)
|
||||
static void __set_code (builder_t* builder, ase_size_t pos, ase_size_t code)
|
||||
{
|
||||
ase_memcpy (&builder->code.buf[pos], &code, ASE_SIZEOF(code));
|
||||
}
|
||||
@ -182,34 +182,34 @@ static ase_bool_t __begin_with (
|
||||
const ase_char_t* str, ase_size_t len, const ase_char_t* what);
|
||||
|
||||
static const ase_byte_t* __match_pattern (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_branch (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_branch_body (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_branch_body0 (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_atom (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_bol (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_eol (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_any_char (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_ord_char (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_charset (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
static const ase_byte_t* __match_group (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat);
|
||||
|
||||
static const ase_byte_t* __match_occurrences (
|
||||
__matcher_t* matcher, ase_size_t si, const ase_byte_t* p,
|
||||
matcher_t* matcher, ase_size_t si, const ase_byte_t* p,
|
||||
ase_size_t lbound, ase_size_t ubound, __match_t* mat);
|
||||
|
||||
static ase_bool_t __test_charset (
|
||||
__matcher_t* matcher, const ase_byte_t* p, ase_size_t csc, ase_char_t c);
|
||||
matcher_t* matcher, const ase_byte_t* p, ase_size_t csc, ase_char_t c);
|
||||
|
||||
static ase_bool_t __cc_isalnum (ase_awk_t* awk, ase_char_t c);
|
||||
static ase_bool_t __cc_isalpha (ase_awk_t* awk, ase_char_t c);
|
||||
@ -265,7 +265,7 @@ static struct __char_class_t __char_class[] =
|
||||
void* ase_awk_buildrex (
|
||||
ase_awk_t* awk, const ase_char_t* ptn, ase_size_t len, int* errnum)
|
||||
{
|
||||
__builder_t builder;
|
||||
builder_t builder;
|
||||
|
||||
builder.awk = awk;
|
||||
builder.code.capa = DEF_CODE_CAPA;
|
||||
@ -329,7 +329,7 @@ int ase_awk_matchrex (
|
||||
const ase_char_t* str, ase_size_t len,
|
||||
const ase_char_t** match_ptr, ase_size_t* match_len, int* errnum)
|
||||
{
|
||||
__matcher_t matcher;
|
||||
matcher_t matcher;
|
||||
__match_t mat;
|
||||
ase_size_t offset = 0;
|
||||
/*const ase_char_t* match_ptr_zero = ASE_NULL;*/
|
||||
@ -426,7 +426,7 @@ ase_bool_t ase_awk_isemptyrex (ase_awk_t* awk, void* code)
|
||||
return (nb == 1 && el == ASE_SIZEOF(ase_size_t)*4)? ase_true: ase_false;
|
||||
}
|
||||
|
||||
static int __build_pattern (__builder_t* builder)
|
||||
static int __build_pattern (builder_t* builder)
|
||||
{
|
||||
int n;
|
||||
|
||||
@ -443,7 +443,7 @@ static int __build_pattern (__builder_t* builder)
|
||||
return n;
|
||||
}
|
||||
|
||||
static int __build_pattern0 (__builder_t* builder)
|
||||
static int __build_pattern0 (builder_t* builder)
|
||||
{
|
||||
ase_size_t zero = 0;
|
||||
ase_size_t old_size;
|
||||
@ -497,13 +497,13 @@ static int __build_pattern0 (__builder_t* builder)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __build_branch (__builder_t* builder)
|
||||
static int __build_branch (builder_t* builder)
|
||||
{
|
||||
int n;
|
||||
ase_size_t zero = 0;
|
||||
ase_size_t old_size;
|
||||
ase_size_t pos_na, pos_bl;
|
||||
struct __code_t* cmd;
|
||||
struct code_t* cmd;
|
||||
|
||||
old_size = builder->code.size;
|
||||
|
||||
@ -515,7 +515,7 @@ static int __build_branch (__builder_t* builder)
|
||||
|
||||
while (1)
|
||||
{
|
||||
cmd = (struct __code_t*)&builder->code.buf[builder->code.size];
|
||||
cmd = (struct code_t*)&builder->code.buf[builder->code.size];
|
||||
|
||||
n = __build_atom (builder);
|
||||
if (n == -1)
|
||||
@ -544,10 +544,10 @@ static int __build_branch (__builder_t* builder)
|
||||
return (builder->code.size == old_size)? 0: 1;
|
||||
}
|
||||
|
||||
static int __build_atom (__builder_t* builder)
|
||||
static int __build_atom (builder_t* builder)
|
||||
{
|
||||
int n;
|
||||
struct __code_t tmp;
|
||||
struct code_t tmp;
|
||||
|
||||
if (builder->ptn.curc.type == CT_EOF) return 0;
|
||||
|
||||
@ -599,9 +599,9 @@ static int __build_atom (__builder_t* builder)
|
||||
}
|
||||
else if (builder->ptn.curc.value == ASE_T('['))
|
||||
{
|
||||
struct __code_t* cmd;
|
||||
struct code_t* cmd;
|
||||
|
||||
cmd = (struct __code_t*)
|
||||
cmd = (struct code_t*)
|
||||
&builder->code.buf[builder->code.size];
|
||||
|
||||
tmp.cmd = CMD_CHARSET;
|
||||
@ -650,7 +650,7 @@ static int __build_atom (__builder_t* builder)
|
||||
}
|
||||
}
|
||||
|
||||
static int __build_charset (__builder_t* builder, struct __code_t* cmd)
|
||||
static int __build_charset (builder_t* builder, struct code_t* cmd)
|
||||
{
|
||||
ase_size_t zero = 0;
|
||||
ase_size_t old_size;
|
||||
@ -757,7 +757,7 @@ static int __build_charset (__builder_t* builder, struct __code_t* cmd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __build_cclass (__builder_t* builder, ase_char_t* cc)
|
||||
static int __build_cclass (builder_t* builder, ase_char_t* cc)
|
||||
{
|
||||
const struct __char_class_t* ccp = __char_class;
|
||||
ase_size_t len = builder->ptn.end - builder->ptn.curp;
|
||||
@ -810,7 +810,7 @@ static int __build_cclass (__builder_t* builder, ase_char_t* cc)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __build_occurrences (__builder_t* builder, struct __code_t* cmd)
|
||||
static int __build_occurrences (builder_t* builder, struct code_t* cmd)
|
||||
{
|
||||
if (builder->ptn.curc.type != CT_SPECIAL) return 0;
|
||||
|
||||
@ -861,7 +861,7 @@ static int __build_occurrences (__builder_t* builder, struct __code_t* cmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __build_range (__builder_t* builder, struct __code_t* cmd)
|
||||
static int __build_range (builder_t* builder, struct code_t* cmd)
|
||||
{
|
||||
ase_size_t bound;
|
||||
|
||||
@ -906,7 +906,7 @@ what if it is not in the raight format? convert it to ordinary characters?? */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __next_char (__builder_t* builder, int level)
|
||||
static int __next_char (builder_t* builder, int level)
|
||||
{
|
||||
if (builder->ptn.curp >= builder->ptn.end)
|
||||
{
|
||||
@ -968,7 +968,7 @@ static int __next_char (__builder_t* builder, int level)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __add_code (__builder_t* builder, void* data, ase_size_t len)
|
||||
static int __add_code (builder_t* builder, void* data, ase_size_t len)
|
||||
{
|
||||
if (len > builder->code.capa - builder->code.size)
|
||||
{
|
||||
@ -1032,7 +1032,7 @@ static ase_bool_t __begin_with (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_pattern (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p;
|
||||
__match_t mat2;
|
||||
@ -1081,7 +1081,7 @@ static const ase_byte_t* __match_pattern (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_branch (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
/*
|
||||
* branch body (base+sizeof(NA)+sizeof(BL)---+
|
||||
@ -1098,7 +1098,7 @@ static const ase_byte_t* __match_branch (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_branch_body (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* n;
|
||||
|
||||
@ -1116,7 +1116,7 @@ static const ase_byte_t* __match_branch_body (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_branch_body0 (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p;
|
||||
/* __match_t mat2;*/
|
||||
@ -1165,7 +1165,7 @@ static const ase_byte_t* __match_branch_body0 (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_atom (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
static atom_matcher_t matchers[] =
|
||||
{
|
||||
@ -1178,19 +1178,19 @@ static const ase_byte_t* __match_atom (
|
||||
};
|
||||
|
||||
ASE_AWK_ASSERT (matcher->awk,
|
||||
((struct __code_t*)base)->cmd >= 0 &&
|
||||
((struct __code_t*)base)->cmd < ASE_COUNTOF(matchers));
|
||||
((struct code_t*)base)->cmd >= 0 &&
|
||||
((struct code_t*)base)->cmd < ASE_COUNTOF(matchers));
|
||||
|
||||
return matchers[((struct __code_t*)base)->cmd] (matcher, base, mat);
|
||||
return matchers[((struct code_t*)base)->cmd] (matcher, base, mat);
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_bol (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p = base;
|
||||
const struct __code_t* cp;
|
||||
const struct code_t* cp;
|
||||
|
||||
cp = (const struct __code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
cp = (const struct code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
ASE_AWK_ASSERT (matcher->awk, cp->cmd == CMD_BOL);
|
||||
|
||||
mat->matched = (mat->match_ptr == matcher->match.str.ptr ||
|
||||
@ -1201,12 +1201,12 @@ static const ase_byte_t* __match_bol (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_eol (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p = base;
|
||||
const struct __code_t* cp;
|
||||
const struct code_t* cp;
|
||||
|
||||
cp = (const struct __code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
cp = (const struct code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
ASE_AWK_ASSERT (matcher->awk, cp->cmd == CMD_EOL);
|
||||
|
||||
mat->matched = (mat->match_ptr == matcher->match.str.end ||
|
||||
@ -1217,13 +1217,13 @@ static const ase_byte_t* __match_eol (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_any_char (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p = base;
|
||||
const struct __code_t* cp;
|
||||
const struct code_t* cp;
|
||||
ase_size_t si = 0, lbound, ubound;
|
||||
|
||||
cp = (const struct __code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
cp = (const struct code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
ASE_AWK_ASSERT (matcher->awk, cp->cmd == CMD_ANY_CHAR);
|
||||
|
||||
lbound = cp->lbound;
|
||||
@ -1234,10 +1234,10 @@ static const ase_byte_t* __match_any_char (
|
||||
|
||||
/* merge the same consecutive codes */
|
||||
while (p < mat->branch_end &&
|
||||
cp->cmd == ((const struct __code_t*)p)->cmd)
|
||||
cp->cmd == ((const struct code_t*)p)->cmd)
|
||||
{
|
||||
lbound += ((const struct __code_t*)p)->lbound;
|
||||
ubound += ((const struct __code_t*)p)->ubound;
|
||||
lbound += ((const struct code_t*)p)->lbound;
|
||||
ubound += ((const struct code_t*)p)->ubound;
|
||||
|
||||
p += ASE_SIZEOF(*cp);
|
||||
}
|
||||
@ -1269,14 +1269,14 @@ static const ase_byte_t* __match_any_char (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_ord_char (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p = base;
|
||||
const struct __code_t* cp;
|
||||
const struct code_t* cp;
|
||||
ase_size_t si = 0, lbound, ubound;
|
||||
ase_char_t cc;
|
||||
|
||||
cp = (const struct __code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
cp = (const struct code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
ASE_AWK_ASSERT (matcher->awk, cp->cmd == CMD_ORD_CHAR);
|
||||
|
||||
lbound = cp->lbound;
|
||||
@ -1290,12 +1290,12 @@ static const ase_byte_t* __match_ord_char (
|
||||
if (matcher->ignorecase)
|
||||
{
|
||||
while (p < mat->branch_end &&
|
||||
cp->cmd == ((const struct __code_t*)p)->cmd)
|
||||
cp->cmd == ((const struct code_t*)p)->cmd)
|
||||
{
|
||||
if (ASE_AWK_TOUPPER (matcher->awk, *(ase_char_t*)(p+ASE_SIZEOF(*cp))) != cc) break;
|
||||
|
||||
lbound += ((const struct __code_t*)p)->lbound;
|
||||
ubound += ((const struct __code_t*)p)->ubound;
|
||||
lbound += ((const struct code_t*)p)->lbound;
|
||||
ubound += ((const struct code_t*)p)->ubound;
|
||||
|
||||
p += ASE_SIZEOF(*cp) + ASE_SIZEOF(cc);
|
||||
}
|
||||
@ -1303,12 +1303,12 @@ static const ase_byte_t* __match_ord_char (
|
||||
else
|
||||
{
|
||||
while (p < mat->branch_end &&
|
||||
cp->cmd == ((const struct __code_t*)p)->cmd)
|
||||
cp->cmd == ((const struct code_t*)p)->cmd)
|
||||
{
|
||||
if (*(ase_char_t*)(p+ASE_SIZEOF(*cp)) != cc) break;
|
||||
|
||||
lbound += ((const struct __code_t*)p)->lbound;
|
||||
ubound += ((const struct __code_t*)p)->ubound;
|
||||
lbound += ((const struct code_t*)p)->lbound;
|
||||
ubound += ((const struct code_t*)p)->ubound;
|
||||
|
||||
p += ASE_SIZEOF(*cp) + ASE_SIZEOF(cc);
|
||||
}
|
||||
@ -1368,15 +1368,15 @@ static const ase_byte_t* __match_ord_char (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_charset (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p = base;
|
||||
const struct __code_t* cp;
|
||||
const struct code_t* cp;
|
||||
ase_size_t si = 0, lbound, ubound, csc, csl;
|
||||
ase_bool_t n;
|
||||
ase_char_t c;
|
||||
|
||||
cp = (const struct __code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
cp = (const struct code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
ASE_AWK_ASSERT (matcher->awk, cp->cmd == CMD_CHARSET);
|
||||
|
||||
lbound = cp->lbound;
|
||||
@ -1435,14 +1435,14 @@ static const ase_byte_t* __match_charset (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_group (
|
||||
__matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
matcher_t* matcher, const ase_byte_t* base, __match_t* mat)
|
||||
{
|
||||
const ase_byte_t* p = base;
|
||||
const struct __code_t* cp;
|
||||
const struct code_t* cp;
|
||||
__match_t mat2;
|
||||
ase_size_t si = 0, grp_len_static[16], * grp_len;
|
||||
|
||||
cp = (const struct __code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
cp = (const struct code_t*)p; p += ASE_SIZEOF(*cp);
|
||||
ASE_AWK_ASSERT (matcher->awk, cp->cmd == CMD_GROUP);
|
||||
|
||||
mat->matched = ase_false;
|
||||
@ -1568,7 +1568,7 @@ static const ase_byte_t* __match_group (
|
||||
}
|
||||
|
||||
static const ase_byte_t* __match_occurrences (
|
||||
__matcher_t* matcher, ase_size_t si, const ase_byte_t* p,
|
||||
matcher_t* matcher, ase_size_t si, const ase_byte_t* p,
|
||||
ase_size_t lbound, ase_size_t ubound, __match_t* mat)
|
||||
{
|
||||
ASE_AWK_ASSERT (matcher->awk, si >= lbound && si <= ubound);
|
||||
@ -1660,7 +1660,7 @@ static const ase_byte_t* __match_occurrences (
|
||||
}
|
||||
|
||||
static ase_bool_t __test_charset (
|
||||
__matcher_t* matcher, const ase_byte_t* p, ase_size_t csc, ase_char_t c)
|
||||
matcher_t* matcher, const ase_byte_t* p, ase_size_t csc, ase_char_t c)
|
||||
{
|
||||
ase_size_t i;
|
||||
|
||||
@ -1835,7 +1835,7 @@ static const ase_byte_t* __print_branch (ase_awk_t* awk, const ase_byte_t* p)
|
||||
|
||||
static const ase_byte_t* __print_atom (ase_awk_t* awk, const ase_byte_t* p)
|
||||
{
|
||||
const struct __code_t* cp = (const struct __code_t*)p;
|
||||
const struct code_t* cp = (const struct code_t*)p;
|
||||
|
||||
if (cp->cmd == CMD_BOL)
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: rex.h,v 1.26 2007-02-03 10:47:41 bacon Exp $
|
||||
* $Id: rex.h,v 1.27 2007-02-28 11:00:32 bacon Exp $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -66,9 +66,7 @@ void ase_awk_freerex (ase_awk_t* awk, void* code);
|
||||
|
||||
ase_bool_t ase_awk_isemptyrex (ase_awk_t* awk, void* code);
|
||||
|
||||
#ifdef DEBUG_REX
|
||||
void ase_awk_printrex (ase_awk_t* awk, void* rex);
|
||||
#endif
|
||||
void ase_awk_dprintrex (ase_awk_t* awk, void* rex);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -1,11 +1,15 @@
|
||||
/*
|
||||
* $Id: run.c,v 1.330 2007-02-24 14:31:44 bacon Exp $
|
||||
* $Id: run.c,v 1.331 2007-02-28 11:00:33 bacon Exp $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
|
||||
#include <ase/awk/awk_i.h>
|
||||
|
||||
#ifdef DEBUG_RUN
|
||||
#include <ase/utl/stdio.h>
|
||||
#endif
|
||||
|
||||
#define CMP_ERROR -99
|
||||
#define DEF_BUF_CAPA 256
|
||||
#define STACK_INCREMENT 512
|
||||
@ -1755,7 +1759,12 @@ static int __run_block0 (ase_awk_run_t* run, ase_awk_nde_blk_t* nde)
|
||||
p = nde->body;
|
||||
nlocals = nde->nlocals;
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("securing space for local variables nlocals = %d\n"), (int)nlocals);*/
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (
|
||||
ASE_T("securing space for local variables nlocals = %d\n"),
|
||||
(int)nlocals);
|
||||
#endif
|
||||
|
||||
saved_stack_top = run->stack_top;
|
||||
|
||||
/* secure space for local variables */
|
||||
@ -1772,10 +1781,17 @@ static int __run_block0 (ase_awk_run_t* run, ase_awk_nde_blk_t* nde)
|
||||
/* refupval is not required for ase_awk_val_nil */
|
||||
}
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("executing block statements\n"));*/
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("executing block statements\n"));
|
||||
#endif
|
||||
|
||||
while (p != ASE_NULL && run->exit_level == EXIT_NONE)
|
||||
{
|
||||
/*run->awk->prmfns.dprintf (ASE_T("running a statement\n"));*/
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("running a statement of type %d at line %d\n"),
|
||||
(int)p->type, (int)p->line);
|
||||
#endif
|
||||
|
||||
if (__run_statement (run, p) == -1)
|
||||
{
|
||||
n = -1;
|
||||
@ -1784,8 +1800,10 @@ static int __run_block0 (ase_awk_run_t* run, ase_awk_nde_blk_t* nde)
|
||||
p = p->next;
|
||||
}
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("popping off local variables\n"));*/
|
||||
/* pop off local variables */
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("popping off local variables\n"));
|
||||
#endif
|
||||
nlocals = nde->nlocals;
|
||||
while (nlocals > 0)
|
||||
{
|
||||
@ -2210,14 +2228,12 @@ static int __run_return (ase_awk_run_t* run, ase_awk_nde_return_t* nde)
|
||||
* by the parser first of all */
|
||||
ASE_AWK_ASSERT (run->awk, nde->val->next == ASE_NULL);
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("returning....\n"));*/
|
||||
val = __eval_expression (run, nde->val);
|
||||
if (val == ASE_NULL) return -1;
|
||||
|
||||
ase_awk_refdownval (run, STACK_RETVAL(run));
|
||||
STACK_RETVAL(run) = val;
|
||||
ase_awk_refupval (run, val); /* see __eval_call for the trick */
|
||||
/*run->awk->prmfns.dprintf (ASE_T("set return value....\n"));*/
|
||||
}
|
||||
|
||||
run->exit_level = EXIT_FUNCTION;
|
||||
@ -3281,7 +3297,11 @@ static ase_awk_val_t* __do_assignment_map (
|
||||
str = __idxnde_to_str (run, var->idx, &len);
|
||||
if (str == ASE_NULL) return ASE_NULL;
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("**** index str=>%s, map->ref=%d, map->type=%d\n"), str, (int)map->ref, (int)map->type);*/
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("**** index str=>%s, map->ref=%d, map->type=%d\n"),
|
||||
str, (int)map->ref, (int)map->type);
|
||||
#endif
|
||||
|
||||
n = ase_awk_map_putx (map->map, str, len, val, ASE_NULL);
|
||||
if (n < 0)
|
||||
{
|
||||
@ -5300,8 +5320,9 @@ static ase_awk_val_t* __eval_afn (ase_awk_run_t* run, ase_awk_nde_t* nde)
|
||||
|
||||
|
||||
/* run->stack_base has not been set for this
|
||||
* stack frame. so STACK_ARG cannot be used */
|
||||
/*ase_awk_refdownval (run, STACK_ARG(run,nargs));*/
|
||||
* stack frame. so the STACK_ARG macro cannot be used as in
|
||||
* ase_awk_refdownval (run, STACK_ARG(run,nargs));*/
|
||||
|
||||
#define UNWIND_RUN_STACK(run,nargs) \
|
||||
do { \
|
||||
while ((nargs) > 0) \
|
||||
@ -5375,7 +5396,10 @@ static ase_awk_val_t* __eval_call (
|
||||
|
||||
saved_stack_top = run->stack_top;
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("setting up function stack frame stack_top = %ld stack_base = %ld\n"), run->stack_top, run->stack_base); */
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("setting up function stack frame top=%ld base=%ld\n"),
|
||||
(long)run->stack_top, (long)run->stack_base);
|
||||
#endif
|
||||
if (__raw_push(run,(void*)run->stack_base) == -1)
|
||||
{
|
||||
ase_awk_setrunerror (
|
||||
@ -5500,7 +5524,9 @@ static ase_awk_val_t* __eval_call (
|
||||
run->stack_base = saved_stack_top;
|
||||
STACK_NARGS(run) = (void*)nargs;
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("running function body\n")); */
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("running function body\n"));
|
||||
#endif
|
||||
|
||||
if (afn != ASE_NULL)
|
||||
{
|
||||
@ -5526,16 +5552,19 @@ static ase_awk_val_t* __eval_call (
|
||||
}
|
||||
}
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("block run complete\n")); */
|
||||
|
||||
/* refdown args in the run.stack */
|
||||
nargs = (ase_size_t)STACK_NARGS(run);
|
||||
/*run->awk->prmfns.dprintf (ASE_T("block run complete nargs = %d\n"), (int)nargs); */
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("block run complete nargs = %d\n"), (int)nargs);
|
||||
#endif
|
||||
for (i = 0; i < nargs; i++)
|
||||
{
|
||||
ase_awk_refdownval (run, STACK_ARG(run,i));
|
||||
}
|
||||
/*run->awk->prmfns.dprintf (ASE_T("got return value\n")); */
|
||||
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("got return value\n"));
|
||||
#endif
|
||||
|
||||
/* this trick has been mentioned in __run_return.
|
||||
* adjust the reference count of the return value.
|
||||
@ -5550,7 +5579,10 @@ static ase_awk_val_t* __eval_call (
|
||||
|
||||
if (run->exit_level == EXIT_FUNCTION) run->exit_level = EXIT_NONE;
|
||||
|
||||
/*run->awk->prmfns.dprintf (ASE_T("returning from function stack_top=%ld, stack_base=%ld\n"), run->stack_top, run->stack_base); */
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("returning from function top=%ld, base=%ld\n"),
|
||||
(long)run->stack_top, (long)run->stack_base);
|
||||
#endif
|
||||
return (n == -1)? ASE_NULL: v;
|
||||
}
|
||||
|
||||
@ -6171,11 +6203,12 @@ static int __read_record (ase_awk_run_t* run)
|
||||
ase_awk_setrunerror (run, saved, 0, ASE_NULL);
|
||||
return -1;
|
||||
}
|
||||
/*
|
||||
run->awk->prmfns.dprintf (ASE_T("len = %d str=[%s]\n"),
|
||||
(int)ASE_STR_LEN(&run->inrec.line),
|
||||
ASE_STR_BUF(&run->inrec.line));
|
||||
*/
|
||||
#ifdef DEBUG_RUN
|
||||
ase_dprintf (ASE_T("record len = %d str=[%.*s]\n"),
|
||||
(int)ASE_STR_LEN(&run->inrec.line),
|
||||
(int)ASE_STR_LEN(&run->inrec.line),
|
||||
ASE_STR_BUF(&run->inrec.line));
|
||||
#endif
|
||||
if (n == 0)
|
||||
{
|
||||
ASE_AWK_ASSERT (run->awk, ASE_STR_LEN(&run->inrec.line) == 0);
|
||||
|
@ -1,11 +1,16 @@
|
||||
/*
|
||||
* $Id: val.c,v 1.111 2007-02-24 14:31:44 bacon Exp $
|
||||
* $Id: val.c,v 1.112 2007-02-28 11:00:33 bacon Exp $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
|
||||
#include <ase/awk/awk_i.h>
|
||||
|
||||
#ifdef DEBUG_VAL
|
||||
#include <ase/utl/stdio.h>
|
||||
#endif
|
||||
|
||||
|
||||
static ase_char_t* __str_to_str (
|
||||
ase_awk_run_t* run, const ase_char_t* str, ase_size_t str_len,
|
||||
int opt, ase_str_t* buf, ase_size_t* len);
|
||||
@ -78,7 +83,9 @@ ase_awk_val_t* ase_awk_makeintval (ase_awk_run_t* run, ase_long_t v)
|
||||
val->val = v;
|
||||
val->nde = ASE_NULL;
|
||||
|
||||
/*ase_printf (ASE_T("makeintval => %p\n"), val);*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("makeintval => %p\n"), val);
|
||||
#endif
|
||||
return (ase_awk_val_t*)val;
|
||||
}
|
||||
|
||||
@ -102,7 +109,9 @@ ase_awk_val_t* ase_awk_makerealval (ase_awk_run_t* run, ase_real_t v)
|
||||
val->val = v;
|
||||
val->nde = ASE_NULL;
|
||||
|
||||
/*ase_printf (ASE_T("makerealval => %p\n"), val);*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("makerealval => %p\n"), val);
|
||||
#endif
|
||||
return (ase_awk_val_t*)val;
|
||||
}
|
||||
|
||||
@ -130,7 +139,9 @@ ase_awk_val_t* ase_awk_makestrval (
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
/*ase_printf (ASE_T("makestrval => %p\n"), val);*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("makestrval => %p\n"), val);
|
||||
#endif
|
||||
return (ase_awk_val_t*)val;
|
||||
}
|
||||
|
||||
@ -171,7 +182,9 @@ ase_awk_val_t* ase_awk_makestrval2 (
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
/*ase_printf (ASE_T("makestrval2 => %p\n"), val);*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("makestrval2 => %p\n"), val);
|
||||
#endif
|
||||
return (ase_awk_val_t*)val;
|
||||
}
|
||||
|
||||
@ -208,11 +221,12 @@ ase_awk_val_t* ase_awk_makerexval (
|
||||
|
||||
static void __free_map_val (void* run, void* v)
|
||||
{
|
||||
/*
|
||||
ase_printf (ASE_T("refdown in map free..."));
|
||||
ase_awk_dprintval (v);
|
||||
ase_printf (ASE_T("\n"));
|
||||
*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("refdown in map free..."));
|
||||
ase_awk_dprintval (run, v);
|
||||
ase_dprintf (ASE_T("\n"));
|
||||
#endif
|
||||
|
||||
ase_awk_refdownval (run, v);
|
||||
}
|
||||
|
||||
@ -275,9 +289,12 @@ void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache)
|
||||
{
|
||||
if (ase_awk_isbuiltinval(val)) return;
|
||||
|
||||
/*ase_printf (ASE_T("freeing [cache=%d] ... "), cache);
|
||||
ase_awk_dprintval (val);
|
||||
ase_printf (ASE_T("\n"));*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("freeing [cache=%d] ... "), cache);
|
||||
ase_awk_dprintval (run, val);
|
||||
ase_dprintf (ASE_T("\n"));
|
||||
#endif
|
||||
|
||||
if (val->type == ASE_AWK_VAL_NIL)
|
||||
{
|
||||
ASE_AWK_FREE (run->awk, val);
|
||||
@ -340,15 +357,11 @@ void ase_awk_refupval (ase_awk_run_t* run, ase_awk_val_t* val)
|
||||
{
|
||||
if (ase_awk_isbuiltinval(val)) return;
|
||||
|
||||
/*
|
||||
run->awk->prmfns.misc.dprintf (
|
||||
run->awk->prmfns.misc.custom_data,
|
||||
ASE_T("ref up [ptr=%p] [count=%d] "), val, (int)val->ref);
|
||||
ase_awk_dprintval (run, val);
|
||||
run->awk->prmfns.misc.dprintf (
|
||||
run->awk->prmfns.misc.custom_data,
|
||||
ASE_T("\n"));
|
||||
*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("ref up [ptr=%p] [count=%d] "), val, (int)val->ref);
|
||||
ase_awk_dprintval (run, val);
|
||||
ase_dprintf (ASE_T("\n"));
|
||||
#endif
|
||||
|
||||
val->ref++;
|
||||
}
|
||||
@ -357,15 +370,11 @@ void ase_awk_refdownval (ase_awk_run_t* run, ase_awk_val_t* val)
|
||||
{
|
||||
if (ase_awk_isbuiltinval(val)) return;
|
||||
|
||||
/*
|
||||
run->awk->prmfns.misc.dprintf (
|
||||
run->awk->prmfns.misc.custom_data,
|
||||
ASE_T("ref down [ptr=%p] [count=%d]\n"), val, (int)val->ref);
|
||||
ase_awk_dprintval (run, val);
|
||||
run->awk->prmfns.misc.dprintf (
|
||||
run->awk->prmfns.misc.custom_data,
|
||||
ASE_T("\n"));
|
||||
*/
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (ASE_T("ref down [ptr=%p] [count=%d]\n"), val, (int)val->ref);
|
||||
ase_awk_dprintval (run, val);
|
||||
ase_dprintf (ASE_T("\n"));
|
||||
#endif
|
||||
|
||||
ASE_AWK_ASSERTX (run->awk, val->ref > 0,
|
||||
"the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs");
|
||||
@ -373,11 +382,6 @@ run->awk->prmfns.misc.dprintf (
|
||||
val->ref--;
|
||||
if (val->ref <= 0)
|
||||
{
|
||||
/*
|
||||
ase_printf (ASE_T("**FREEING ["));
|
||||
ase_awk_dprintval (val);
|
||||
ase_printf (ASE_T("]\n"));
|
||||
*/
|
||||
ase_awk_freeval(run, val, ase_true);
|
||||
}
|
||||
}
|
||||
@ -471,9 +475,8 @@ ase_char_t* ase_awk_valtostr (
|
||||
run, vs->buf, vs->len, opt, buf, len);
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
run->awk->prmfns.misc.dprintf (
|
||||
run->awk->prmfns.misc.custom_data,
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (
|
||||
ASE_T("ERROR: WRONG VALUE TYPE [%d] in ase_awk_valtostr\n"),
|
||||
v->type);
|
||||
#endif
|
||||
@ -729,9 +732,8 @@ int ase_awk_valtonum (
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
run->awk->prmfns.misc.dprintf (
|
||||
run->awk->prmfns.misc.custom_data,
|
||||
#ifdef DEBUG_VAL
|
||||
ase_dprintf (
|
||||
ASE_T("ERROR: WRONG VALUE TYPE [%d] in ase_awk_valtonum\n"),
|
||||
v->type);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user