*** empty log message ***
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: rex.c,v 1.18 2006-08-10 16:02:15 bacon Exp $
|
||||
* $Id: rex.c,v 1.19 2006-08-10 16:03:35 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: rex.h,v 1.10 2006-07-26 16:43:35 bacon Exp $
|
||||
* $Id: rex.h,v 1.11 2006-08-10 16:02:15 bacon Exp $
|
||||
**/
|
||||
|
||||
#ifndef _XP_AWK_REX_H_
|
||||
@ -37,21 +37,6 @@
|
||||
* ab|xy -> |2|10|4|ORD_CHAR(no bound)|a|ORD_CHAR(no bound)|b|4|ORD_CHAR(no bound)|x|ORD_CHAR(no bound)|y|
|
||||
*/
|
||||
|
||||
enum
|
||||
{
|
||||
XP_AWK_REX_ENOERR, /* no error */
|
||||
XP_AWK_REX_ENOMEM, /* ran out of memory */
|
||||
XP_AWK_REX_ERPAREN, /* a right parenthesis is expected */
|
||||
XP_AWK_REX_ERBRACKET, /* a right bracket is expected */
|
||||
XP_AWK_REX_ERBRACE, /* a right brace is expected */
|
||||
XP_AWK_REX_ECOLON, /* a colon is expected */
|
||||
XP_AWK_REX_ECRANGE, /* invalid character range */
|
||||
XP_AWK_REX_ECCLASS, /* invalid character class */
|
||||
XP_AWK_REX_EBRANGE, /* invalid boundary range */
|
||||
XP_AWK_REX_EEND, /* unexpected end of the pattern */
|
||||
XP_AWK_REX_EGARBAGE /* garbage after the pattern */
|
||||
};
|
||||
|
||||
#define XP_AWK_REX_NA(code) (*(xp_size_t*)(code))
|
||||
|
||||
#define XP_AWK_REX_LEN(code) \
|
||||
@ -61,8 +46,6 @@ enum
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
const xp_char_t* xp_awk_getrexerrstr (int errnum);
|
||||
|
||||
void* xp_awk_buildrex (const xp_char_t* ptn, xp_size_t len, int* errnum);
|
||||
|
||||
int xp_awk_matchrex (void* code,
|
||||
|
173
ase/awk/run.c
173
ase/awk/run.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: run.c,v 1.163 2006-08-04 17:54:52 bacon Exp $
|
||||
* $Id: run.c,v 1.164 2006-08-10 16:02:15 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk_i.h>
|
||||
@ -39,16 +39,16 @@ enum
|
||||
|
||||
#define PANIC(run,code) \
|
||||
do { (run)->errnum = (code); return XP_NULL; } while (0)
|
||||
#define PANIC2(run,code,subcode) \
|
||||
do { (run)->errnum = (code); (run)->suberrnum = (subcode); return XP_NULL; } while (0)
|
||||
|
||||
#define PANIC_I(run,code) \
|
||||
do { (run)->errnum = (code); return -1; } while (0)
|
||||
#define PANIC2_I(awk,code,subcode) \
|
||||
do { (run)->errnum = (code); (run)->suberrnum = (subcode); return -1; } while (0)
|
||||
|
||||
static int __open_run (xp_awk_run_t* run, xp_awk_t* awk);
|
||||
static void __close_run (xp_awk_run_t* run);
|
||||
static void __add_run (xp_awk_t* awk, xp_awk_run_t* run);
|
||||
static void __del_run (xp_awk_t* awk, xp_awk_run_t* run);
|
||||
|
||||
static int __init_run (
|
||||
xp_awk_run_t* run, xp_awk_runios_t* runios, int* errnum);
|
||||
static void __deinit_run (xp_awk_run_t* run);
|
||||
|
||||
static int __run_main (xp_awk_run_t* run);
|
||||
static int __run_pattern_blocks (xp_awk_run_t* run);
|
||||
@ -225,7 +225,9 @@ void xp_awk_seterrnum (void* run, int errnum)
|
||||
int xp_awk_run (xp_awk_t* awk, xp_awk_runios_t* runios, xp_awk_runcbs_t* runcbs)
|
||||
{
|
||||
xp_awk_run_t* run;
|
||||
int n;
|
||||
int n, errnum;
|
||||
|
||||
awk->errnum = XP_AWK_ENOERR;
|
||||
|
||||
run = (xp_awk_run_t*) xp_malloc (xp_sizeof(xp_awk_run_t));
|
||||
if (run == XP_NULL)
|
||||
@ -234,11 +236,12 @@ int xp_awk_run (xp_awk_t* awk, xp_awk_runios_t* runios, xp_awk_runcbs_t* runcbs)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (__open_run (run, awk) == -1)
|
||||
__add_run (awk, run);
|
||||
|
||||
if (__init_run (run, runios, &errnum) == -1)
|
||||
{
|
||||
/* TODO: find a way to set the errnum into awk object in a thread-safe way */
|
||||
awk->errnum = run->errnum;
|
||||
awk->suberrnum = run->suberrnum;
|
||||
awk->errnum = errnum;
|
||||
__del_run (awk, run);
|
||||
xp_free (run);
|
||||
return -1;
|
||||
}
|
||||
@ -247,16 +250,14 @@ int xp_awk_run (xp_awk_t* awk, xp_awk_runios_t* runios, xp_awk_runcbs_t* runcbs)
|
||||
runcbs->start (awk, run, runcbs->custom_data);
|
||||
|
||||
n = __run_main (run);
|
||||
if (n == -1)
|
||||
{
|
||||
awk->errnum = run->errnum;
|
||||
awk->suberrnum = run->suberrnum;
|
||||
}
|
||||
if (n == -1) awk->errnum = XP_AWK_ERUNTIME;
|
||||
|
||||
if (runcbs->end != XP_NULL)
|
||||
runcbs->end (awk, run, runcbs->custom_data);
|
||||
|
||||
__close_run (run);
|
||||
__deinit_run (run);
|
||||
|
||||
__del_run (awk, run);
|
||||
xp_free (run);
|
||||
|
||||
return n;
|
||||
@ -264,17 +265,65 @@ int xp_awk_run (xp_awk_t* awk, xp_awk_runios_t* runios, xp_awk_runcbs_t* runcbs)
|
||||
|
||||
int xp_awk_stop (xp_awk_t* awk, void* run)
|
||||
{
|
||||
xp_awk_run_t* r = (xp_awk_run_t*)run;
|
||||
xp_awk_run_t* r;
|
||||
int n = 0;
|
||||
|
||||
if (r->awk != awk)
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->lock (awk, awk->thr.lks->custom_data);
|
||||
|
||||
/* check if the run handle given is valid */
|
||||
for (r = awk->run.ptr; r != XP_NULL; r = r->next)
|
||||
{
|
||||
/* TODO: use awk->errnum or run->errnum??? */
|
||||
r->errnum = XP_AWK_EINVAL;
|
||||
return -1;
|
||||
if (r == run)
|
||||
{
|
||||
xp_assert (r->awk == awk);
|
||||
r->exit_level = EXIT_ABORT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
r->exit_level = EXIT_ABORT;
|
||||
return 0;
|
||||
if (r == XP_NULL)
|
||||
{
|
||||
/* if it is not found in the awk's run list,
|
||||
* it is not a valid handle */
|
||||
awk->errnum = XP_AWK_EINVAL;
|
||||
n = -1;
|
||||
}
|
||||
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->unlock (awk, awk->thr.lks->custom_data);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
int xp_awk_getrunerrnum (xp_awk_t* awk, void* run, int* errnum)
|
||||
{
|
||||
xp_awk_run_t* r;
|
||||
int n = 0;
|
||||
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->lock (awk, awk->thr.lks->custom_data);
|
||||
|
||||
for (r = awk->run.ptr; r != XP_NULL; r = r->next)
|
||||
{
|
||||
if (r == run)
|
||||
{
|
||||
xp_assert (r->awk == awk);
|
||||
*errnum = r->errnum;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (r == XP_NULL)
|
||||
{
|
||||
awk->errnum = XP_AWK_EINVAL;
|
||||
n = -1;
|
||||
}
|
||||
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->unlock (awk, awk->thr.lks->custom_data);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static void __free_namedval (void* run, void* val)
|
||||
@ -282,10 +331,50 @@ static void __free_namedval (void* run, void* val)
|
||||
xp_awk_refdownval ((xp_awk_run_t*)run, val);
|
||||
}
|
||||
|
||||
static int __open_run (xp_awk_run_t* run, xp_awk_t* awk)
|
||||
static void __add_run (xp_awk_t* awk, xp_awk_run_t* run)
|
||||
{
|
||||
xp_memset (run, 0, xp_sizeof(*run));
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->lock (awk, awk->thr.lks->custom_data);
|
||||
|
||||
run->awk = awk;
|
||||
run->prev = XP_NULL;
|
||||
run->next = awk->run.ptr;
|
||||
if (run->next != XP_NULL) run->next->prev = run;
|
||||
awk->run.ptr = run;
|
||||
awk->run.count++;
|
||||
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->unlock (awk, awk->thr.lks->custom_data);
|
||||
}
|
||||
|
||||
static void __del_run (xp_awk_t* awk, xp_awk_run_t* run)
|
||||
{
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->lock (awk, awk->thr.lks->custom_data);
|
||||
|
||||
xp_assert (awk->run.ptr != XP_NULL);
|
||||
|
||||
if (run->prev == XP_NULL)
|
||||
{
|
||||
awk->run.ptr = run->next;
|
||||
if (run->next != XP_NULL) run->next->prev = XP_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
run->prev->next = run->next;
|
||||
if (run->next != XP_NULL) run->next->prev = run->prev;
|
||||
}
|
||||
|
||||
run->awk = XP_NULL;
|
||||
awk->run.count--;
|
||||
|
||||
if (awk->thr.lks != XP_NULL)
|
||||
awk->thr.lks->unlock (awk, awk->thr.lks->custom_data);
|
||||
}
|
||||
|
||||
static int __init_run (
|
||||
xp_awk_run_t* run, xp_awk_runios_t* runios, int* errnum)
|
||||
{
|
||||
run->stack = XP_NULL;
|
||||
run->stack_top = 0;
|
||||
run->stack_base = 0;
|
||||
@ -297,10 +386,6 @@ static int __open_run (xp_awk_run_t* run, xp_awk_t* awk)
|
||||
run->rcache_count = 0;
|
||||
|
||||
run->errnum = XP_AWK_ENOERR;
|
||||
run->suberrnum = XP_AWK_ENOERR;
|
||||
/*run->tree = &awk->tree; */
|
||||
/*run->nglobals = awk->tree.nglobals;*/
|
||||
run->awk = awk;
|
||||
|
||||
run->inrec.buf_pos = 0;
|
||||
run->inrec.buf_len = 0;
|
||||
@ -310,7 +395,7 @@ static int __open_run (xp_awk_run_t* run, xp_awk_t* awk)
|
||||
run->inrec.d0 = xp_awk_val_nil;
|
||||
if (xp_str_open (&run->inrec.line, DEF_BUF_CAPA) == XP_NULL)
|
||||
{
|
||||
run->errnum = XP_AWK_ENOMEM;
|
||||
*errnum = XP_AWK_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -318,19 +403,25 @@ static int __open_run (xp_awk_run_t* run, xp_awk_t* awk)
|
||||
run, DEF_BUF_CAPA, __free_namedval) == XP_NULL)
|
||||
{
|
||||
xp_str_close (&run->inrec.line);
|
||||
run->errnum = XP_AWK_ENOMEM;
|
||||
*errnum = XP_AWK_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
run->extio = XP_NULL;
|
||||
run->extio.handler[XP_AWK_EXTIO_PIPE] = runios->pipe;
|
||||
run->extio.handler[XP_AWK_EXTIO_COPROC] = runios->coproc;
|
||||
run->extio.handler[XP_AWK_EXTIO_FILE] = runios->file;
|
||||
run->extio.handler[XP_AWK_EXTIO_CONSOLE] = runios->console;
|
||||
run->extio.chain = XP_NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __close_run (xp_awk_run_t* run)
|
||||
static void __deinit_run (xp_awk_run_t* run)
|
||||
{
|
||||
/* close all pending eio's */
|
||||
/* TODO: what if this operation fails? */
|
||||
xp_awk_clearextio (run);
|
||||
xp_assert (run->extio.chain == XP_NULL);
|
||||
|
||||
/* destroy input record. __clear_record should be called
|
||||
* before the run stack has been destroyed because it may try
|
||||
@ -385,7 +476,6 @@ static int __run_main (xp_awk_run_t* run)
|
||||
/* secure space for global variables */
|
||||
saved_stack_top = run->stack_top;
|
||||
|
||||
/*nglobals = run->nglobals;*/
|
||||
nglobals = run->awk->tree.nglobals;
|
||||
|
||||
while (nglobals > 0)
|
||||
@ -1604,7 +1694,7 @@ static xp_awk_val_t* __eval_expression (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
||||
if (n == -1)
|
||||
{
|
||||
xp_awk_refdownval (run, v);
|
||||
PANIC2 (run, XP_AWK_EREXMATCH, errnum);
|
||||
PANIC (run, errnum);
|
||||
}
|
||||
|
||||
xp_awk_refdownval (run, v);
|
||||
@ -3030,7 +3120,7 @@ static xp_awk_val_t* __eval_binop_match0 (
|
||||
((xp_awk_val_str_t*)right)->buf,
|
||||
((xp_awk_val_str_t*)right)->len, &errnum);
|
||||
if (rex_code == XP_NULL)
|
||||
PANIC2 (run, XP_AWK_EREXBUILD, errnum);
|
||||
PANIC (run, errnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3041,7 +3131,7 @@ static xp_awk_val_t* __eval_binop_match0 (
|
||||
if (rex_code == XP_NULL)
|
||||
{
|
||||
xp_free (str);
|
||||
PANIC2 (run, XP_AWK_EREXBUILD, errnum);
|
||||
PANIC (run, errnum);
|
||||
}
|
||||
|
||||
xp_free (str);
|
||||
@ -3057,7 +3147,7 @@ static xp_awk_val_t* __eval_binop_match0 (
|
||||
if (n == -1)
|
||||
{
|
||||
if (right->type != XP_AWK_VAL_REX) xp_free (rex_code);
|
||||
PANIC2 (run, XP_AWK_EREXMATCH, errnum);
|
||||
PANIC (run, errnum);
|
||||
}
|
||||
|
||||
res = xp_awk_makeintval (run, (n == ret));
|
||||
@ -3082,7 +3172,7 @@ static xp_awk_val_t* __eval_binop_match0 (
|
||||
{
|
||||
xp_free (str);
|
||||
if (right->type != XP_AWK_VAL_REX) xp_free (rex_code);
|
||||
PANIC2 (run, XP_AWK_EREXMATCH, errnum);
|
||||
PANIC (run, errnum);
|
||||
}
|
||||
|
||||
res = xp_awk_makeintval (run, (n == ret));
|
||||
@ -4542,3 +4632,4 @@ static xp_char_t* __idxnde_to_str (
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user