From 1bd23651cfafc4b6ab399be0d78c3d726895de4f Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sun, 13 Aug 2006 05:55:02 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.c | 4 ++- ase/awk/awk.h | 22 +++++++++--- ase/awk/awk_i.h | 5 +-- ase/awk/parse.c | 5 +-- ase/awk/run.c | 89 ++++++++++++++++++++++++++++++++++++------------- ase/awk/sa.h | 3 +- 6 files changed, 94 insertions(+), 34 deletions(-) diff --git a/ase/awk/awk.c b/ase/awk/awk.c index 2ec37fdf..d3ea7f10 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.68 2006-08-10 16:02:15 bacon Exp $ + * $Id: awk.c,v 1.69 2006-08-13 05:55:02 bacon Exp $ */ #include @@ -71,6 +71,7 @@ xp_awk_t* xp_awk_open (xp_awk_thrlks_t* thrlks) awk->tree.end = XP_NULL; awk->tree.chain = XP_NULL; awk->tree.chain_tail = XP_NULL; + awk->tree.chain_size = 0; awk->token.prev = 0; awk->token.type = 0; @@ -172,6 +173,7 @@ int xp_awk_clear (xp_awk_t* awk) } awk->tree.chain_tail = XP_NULL; + awk->tree.chain_size = 0; return 0; } diff --git a/ase/awk/awk.h b/ase/awk/awk.h index 05b3d987..c3e08180 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.94 2006-08-10 16:02:15 bacon Exp $ + * $Id: awk.h,v 1.95 2006-08-13 05:55:02 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -18,7 +18,6 @@ typedef struct xp_awk_runios_t xp_awk_runios_t; typedef struct xp_awk_runcbs_t xp_awk_runcbs_t; typedef void (*xp_awk_lk_t) (xp_awk_t* awk, void* arg); -typedef void (*xp_awk_cb_t) (xp_awk_t* awk, void* handle, void* arg); typedef xp_ssize_t (*xp_awk_io_t) ( int cmd, void* arg, xp_char_t* data, xp_size_t count); @@ -65,8 +64,8 @@ struct xp_awk_runios_t struct xp_awk_runcbs_t { - xp_awk_cb_t start; - xp_awk_cb_t end; + void (*on_start) (xp_awk_t* awk, void* handle, void* arg); + void (*on_end) (xp_awk_t* awk, void* handle, int errnum, void* arg); void* custom_data; }; @@ -258,10 +257,25 @@ void xp_awk_setopt (xp_awk_t* awk, int opt); int xp_awk_parse (xp_awk_t* awk, xp_awk_srcios_t* srcios); +/* + * xp_awk_run return 0 on success and -1 on failure, generally speaking. + * A runtime context is required for it to start running the program. + * Once the runtime context is created, the program starts to run. + * The context creation failure is reported by the return value -1 of + * this function. however, the runtime error after the context creation + * is reported differently depending on the use of the callback. + * When no callback is specified (i.e. runcbs is XP_NULL), xp_awk_run + * returns -1 on an error and awk->errnum is set accordingly. + * However, if a callback is specified (i.e. runcbs is not XP_NULL), + * xp_awk_run returns 0 on both success and failure. Instead, the + * on_end handler of the callback is triggered with the relevant + * error number. The third parameter to on_end denotes this error number. + */ 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); +void xp_awk_stopall (xp_awk_t* awk); int xp_awk_getrunerrnum (xp_awk_t* awk, void* run, int* errnum); /* functions to access internal stack structure */ diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index 225dad15..7c366cfb 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.43 2006-08-10 16:02:15 bacon Exp $ + * $Id: awk_i.h,v 1.44 2006-08-13 05:55:02 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -49,6 +49,7 @@ struct xp_awk_tree_t xp_awk_nde_t* end; xp_awk_chain_t* chain; xp_awk_chain_t* chain_tail; + xp_size_t chain_size; /* number of nodes in the chain */ }; struct xp_awk_t @@ -138,7 +139,6 @@ struct xp_awk_t struct xp_awk_chain_t { xp_awk_nde_t* pattern; - int pattern_range_state; /* used when pattern is a range */ xp_awk_nde_t* action; xp_awk_chain_t* next; }; @@ -160,6 +160,7 @@ struct xp_awk_run_t xp_size_t rcache_count; xp_awk_nde_blk_t* active_block; + xp_byte_t* pattern_range_state; struct { diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 3440a18d..9f25befc 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.163 2006-08-10 16:02:15 bacon Exp $ + * $Id: parse.c,v 1.164 2006-08-13 05:55:02 bacon Exp $ */ #include @@ -841,7 +841,6 @@ static xp_awk_chain_t* __parse_pattern_block ( } chain->pattern = ptn; - chain->pattern_range_state = 0; chain->action = nde; chain->next = XP_NULL; @@ -849,11 +848,13 @@ static xp_awk_chain_t* __parse_pattern_block ( { awk->tree.chain = chain; awk->tree.chain_tail = chain; + awk->tree.chain_size++; } else { awk->tree.chain_tail->next = chain; awk->tree.chain_tail = chain; + awk->tree.chain_size++; } return chain; diff --git a/ase/awk/run.c b/ase/awk/run.c index d8d1e68e..8750fb5a 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.164 2006-08-10 16:02:15 bacon Exp $ + * $Id: run.c,v 1.165 2006-08-13 05:55:02 bacon Exp $ */ #include @@ -52,8 +52,10 @@ 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); -static int __run_pattern_block_chain (xp_awk_run_t* run, xp_awk_chain_t* chain); -static int __run_pattern_block (xp_awk_run_t* run, xp_awk_chain_t* chain); +static int __run_pattern_block_chain ( + xp_awk_run_t* run, xp_awk_chain_t* chain); +static int __run_pattern_block ( + xp_awk_run_t* run, xp_awk_chain_t* chain, xp_size_t block_no); static int __run_block (xp_awk_run_t* run, xp_awk_nde_blk_t* nde); static int __run_statement (xp_awk_run_t* run, xp_awk_nde_t* nde); static int __run_if (xp_awk_run_t* run, xp_awk_nde_if_t* nde); @@ -246,14 +248,29 @@ int xp_awk_run (xp_awk_t* awk, xp_awk_runios_t* runios, xp_awk_runcbs_t* runcbs) return -1; } - if (runcbs->start != XP_NULL) - runcbs->start (awk, run, runcbs->custom_data); + if (runcbs != XP_NULL && runcbs->on_start != XP_NULL) + { + runcbs->on_start (awk, run, runcbs->custom_data); + } n = __run_main (run); - if (n == -1) awk->errnum = XP_AWK_ERUNTIME; + if (n == -1) + { + /* if no callback is specified, awk's error number + * is updated with the run's error number */ + awk->errnum = (runcbs == XP_NULL)? run->errnum: XP_AWK_ERUNTIME; + } - if (runcbs->end != XP_NULL) - runcbs->end (awk, run, runcbs->custom_data); + if (runcbs != XP_NULL && runcbs->on_end != XP_NULL) + { + runcbs->on_end (awk, run, + ((n == -1)? run->errnum: XP_AWK_ENOERR), + runcbs->custom_data); + + /* when using callbacks, the function always returns 0 after + * the start callbacks has been triggered */ + n = 0; + } __deinit_run (run); @@ -296,6 +313,22 @@ int xp_awk_stop (xp_awk_t* awk, void* run) return n; } +void xp_awk_stopall (xp_awk_t* awk) +{ + xp_awk_run_t* r; + + 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) + { + r->exit_level = EXIT_ABORT; + } + + if (awk->thr.lks != XP_NULL) + awk->thr.lks->unlock (awk, awk->thr.lks->custom_data); +} + int xp_awk_getrunerrnum (xp_awk_t* awk, void* run, int* errnum) { xp_awk_run_t* r; @@ -407,6 +440,16 @@ static int __init_run ( return -1; } + run->pattern_range_state = (xp_byte_t*) + xp_calloc (run->awk->tree.chain_size, xp_sizeof(xp_byte_t)); + if (run->pattern_range_state == XP_NULL) + { + xp_awk_map_close (&run->named); + xp_str_close (&run->inrec.line); + *errnum = XP_AWK_ENOMEM; + return -1; + } + 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; @@ -418,6 +461,8 @@ static int __init_run ( static void __deinit_run (xp_awk_run_t* run) { + xp_free (run->pattern_range_state); + /* close all pending eio's */ /* TODO: what if this operation fails? */ xp_awk_clearextio (run); @@ -643,20 +688,11 @@ static int __run_pattern_blocks (xp_awk_run_t* run) xp_ssize_t n; xp_bool_t need_to_close = xp_false; int errnum; - xp_awk_chain_t* chain; run->inrec.buf_pos = 0; run->inrec.buf_len = 0; run->inrec.eof = xp_false; - /* clear the pattern_range_state */ - chain = run->awk->tree.chain; - while (chain != XP_NULL) - { - chain->pattern_range_state = 0; - chain = chain->next; - } - /* run each pattern block */ while (run->exit_level != EXIT_GLOBAL && run->exit_level != EXIT_ABORT) @@ -710,6 +746,8 @@ static int __run_pattern_blocks (xp_awk_run_t* run) static int __run_pattern_block_chain (xp_awk_run_t* run, xp_awk_chain_t* chain) { + xp_size_t block_no = 0; + while (run->exit_level != EXIT_GLOBAL && run->exit_level != EXIT_ABORT && chain != XP_NULL) { @@ -719,14 +757,17 @@ static int __run_pattern_block_chain (xp_awk_run_t* run, xp_awk_chain_t* chain) break; } - if (__run_pattern_block (run, chain) == -1) return -1; - chain = chain->next; + if (__run_pattern_block (run, chain, block_no) == -1) return -1; + + chain = chain->next; + block_no++; } return 0; } -static int __run_pattern_block (xp_awk_run_t* run, xp_awk_chain_t* chain) +static int __run_pattern_block ( + xp_awk_run_t* run, xp_awk_chain_t* chain, xp_size_t block_no) { xp_awk_nde_t* ptn; xp_awk_nde_blk_t* blk; @@ -769,7 +810,7 @@ static int __run_pattern_block (xp_awk_run_t* run, xp_awk_chain_t* chain) /* pattern, pattern { ... } */ xp_assert (ptn->next->next == XP_NULL); - if (chain->pattern_range_state == 0) + if (run->pattern_range_state[block_no] == 0) { xp_awk_val_t* v1; @@ -786,12 +827,12 @@ static int __run_pattern_block (xp_awk_run_t* run, xp_awk_chain_t* chain) return -1; } - chain->pattern_range_state = 1; + run->pattern_range_state[block_no] = 1; } xp_awk_refdownval (run, v1); } - else if (chain->pattern_range_state == 1) + else if (run->pattern_range_state[block_no] == 1) { xp_awk_val_t* v2; @@ -807,7 +848,7 @@ static int __run_pattern_block (xp_awk_run_t* run, xp_awk_chain_t* chain) } if (xp_awk_valtobool(v2)) - chain->pattern_range_state = 0; + run->pattern_range_state[block_no] = 0; xp_awk_refdownval (run, v2); } diff --git a/ase/awk/sa.h b/ase/awk/sa.h index c33639fc..91efd80d 100644 --- a/ase/awk/sa.h +++ b/ase/awk/sa.h @@ -1,5 +1,5 @@ /* - * $Id: sa.h,v 1.27 2006-07-22 16:40:39 bacon Exp $ + * $Id: sa.h,v 1.28 2006-08-13 05:55:02 bacon Exp $ */ #ifndef _XP_AWK_SA_H_ @@ -32,6 +32,7 @@ #endif #define xp_malloc malloc +#define xp_calloc calloc #define xp_realloc realloc #define xp_free free #define xp_memset memset