From 1ea85ed09d30ce8cca7b1ca51701227d2ab6e7b3 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 4 Aug 2006 16:31:22 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.c | 3 ++- ase/awk/awk.h | 14 ++++++++++++-- ase/awk/awk_i.h | 5 +++-- ase/awk/parse.c | 9 ++++++--- ase/awk/run.c | 43 ++++++++++++++++++++++++++++++++++--------- ase/test/awk/awk.c | 39 +++++++++++++++++++++++++++++++++++++-- 6 files changed, 94 insertions(+), 19 deletions(-) diff --git a/ase/awk/awk.c b/ase/awk/awk.c index 79424d89..4e1b7eb8 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.64 2006-08-03 09:53:41 bacon Exp $ + * $Id: awk.c,v 1.65 2006-08-04 16:31:21 bacon Exp $ */ #include @@ -70,6 +70,7 @@ xp_awk_t* xp_awk_open (void) awk->parse.nlocals_max = 0; awk->tree.nglobals = 0; + awk->tree.nbglobals = 0; awk->tree.begin = XP_NULL; awk->tree.end = XP_NULL; awk->tree.chain = XP_NULL; diff --git a/ase/awk/awk.h b/ase/awk/awk.h index 516fbc74..c4ed229a 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.87 2006-08-03 15:49:37 bacon Exp $ + * $Id: awk.h,v 1.88 2006-08-04 16:31:21 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -12,10 +12,13 @@ typedef struct xp_awk_t xp_awk_t; typedef struct xp_awk_val_t xp_awk_val_t; typedef struct xp_awk_extio_t xp_awk_extio_t; typedef struct xp_awk_rex_t xp_awk_rex_t; +typedef struct xp_awk_runcb_t xp_awk_runcb_t; typedef xp_ssize_t (*xp_awk_io_t) ( int cmd, void* arg, xp_char_t* data, xp_size_t count); +typedef void (*xp_awk_cb_t) (xp_awk_t* awk, void* handle); + struct xp_awk_extio_t { int type; /* console, file, coproc, pipe */ @@ -36,6 +39,12 @@ struct xp_awk_extio_t xp_awk_extio_t* next; }; +struct xp_awk_runcb_t +{ + xp_awk_cb_t start; + xp_awk_cb_t end; +}; + /* io function commands */ enum { @@ -218,7 +227,8 @@ xp_size_t xp_awk_getsrcline (xp_awk_t* awk); int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg); int xp_awk_parse (xp_awk_t* awk); -int xp_awk_run (xp_awk_t* awk); +int xp_awk_run (xp_awk_t* awk, xp_awk_runcb_t* runcb); +int xp_awk_stop (xp_awk_t* awk, void* handle); /* functions to access internal stack structure */ xp_size_t xp_awk_getnargs (void* run); diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index 7c1b8665..e4c13c96 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.38 2006-08-03 15:49:37 bacon Exp $ + * $Id: awk_i.h,v 1.39 2006-08-04 16:31:21 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -70,7 +70,8 @@ run with run_stack struct xp_awk_tree_t { - xp_size_t nglobals; + xp_size_t nglobals; /* total number of globals */ + xp_size_t nbglobals; /* number of builtin globals */ xp_awk_map_t afns; /* awk function map */ xp_awk_nde_t* begin; xp_awk_nde_t* end; diff --git a/ase/awk/parse.c b/ase/awk/parse.c index dcff28c4..bfaa3f38 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.156 2006-08-04 06:39:05 bacon Exp $ + * $Id: parse.c,v 1.157 2006-08-04 16:31:21 bacon Exp $ */ #include @@ -356,12 +356,13 @@ static void __dump (xp_awk_t* awk) { xp_awk_chain_t* chain; - if (awk->tree.nglobals > 0) + if (awk->tree.nglobals > awk->tree.nbglobals) { xp_size_t i; + xp_assert (awk->tree.nglobals > 0); xp_printf (XP_T("global ")); - for (i = 0; i < awk->tree.nglobals - 1; i++) + for (i = awk->tree.nbglobals; i < awk->tree.nglobals - 1; i++) { xp_printf (XP_T("__global%lu, "), (unsigned long)i); } @@ -1020,10 +1021,12 @@ static xp_awk_t* __add_builtin_globals (xp_awk_t* awk) { struct __bvent* p = __bvtab; + awk->tree.nbglobals = 0; while (p->name != XP_NULL) { if (__add_global (awk, p->name, p->name_len) == XP_NULL) return XP_NULL; + awk->tree.nbglobals++; p++; } diff --git a/ase/awk/run.c b/ase/awk/run.c index 4d10eaf3..fb4826c2 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.159 2006-08-03 15:49:37 bacon Exp $ + * $Id: run.c,v 1.160 2006-08-04 16:31:21 bacon Exp $ */ #include @@ -222,7 +222,7 @@ void xp_awk_seterrnum (void* run, int errnum) r->errnum = errnum; } -int xp_awk_run (xp_awk_t* awk) +int xp_awk_run (xp_awk_t* awk, xp_awk_runcb_t* runcb) { xp_awk_run_t* run; int n; @@ -243,19 +243,38 @@ int xp_awk_run (xp_awk_t* awk) return -1; } + if (runcb->start != XP_NULL) runcb->start (awk, run); + n = __run_main (run); - if (n == -1) + if (n == -1) { awk->errnum = run->errnum; awk->suberrnum = run->suberrnum; } + if (runcb->end != XP_NULL) runcb->end (awk, run); + __close_run (run); xp_free (run); return n; } +int xp_awk_stop (xp_awk_t* awk, void* handle) +{ + xp_awk_run_t* run = (xp_awk_run_t*)handle; + + if (run->awk != awk) + { + /* TODO: use awk->errnum or run->errnum??? */ + run->errnum = XP_AWK_EINVAL; + return -1; + } + + run->exit_level = EXIT_ABORT; + return 0; +} + static void __free_namedval (void* run, void* val) { xp_awk_refdownval ((xp_awk_run_t*)run, val); @@ -270,7 +289,7 @@ static int __open_run (xp_awk_run_t* run, xp_awk_t* awk) run->stack_base = 0; run->stack_limit = 0; - run->exit_level = 0; + run->exit_level = EXIT_NONE; run->icache_count = 0; run->rcache_count = 0; @@ -382,13 +401,13 @@ static int __run_main (xp_awk_run_t* run) } } + run->exit_level = EXIT_NONE; + if (run->opt & XP_AWK_RUNMAIN) { /* TODO: should the main function be user-specifiable? */ xp_awk_nde_call_t nde; - run->exit_level = EXIT_NONE; - nde.type = XP_AWK_NDE_AFN; nde.next = XP_NULL; nde.what.afn.name = XP_T("main"); @@ -451,7 +470,9 @@ static int __run_main (xp_awk_run_t* run) STACK_NARGS(run) = (void*)nargs; /* stack set up properly. ready to exeucte statement blocks */ - if (n == 0 && run->awk->tree.begin != XP_NULL) + if (n == 0 && + run->awk->tree.begin != XP_NULL && + run->exit_level != EXIT_ABORT) { xp_awk_nde_blk_t* blk; @@ -463,12 +484,16 @@ static int __run_main (xp_awk_run_t* run) if (__run_block (run, blk) == -1) n = -1; } - if (n == 0 && run->awk->tree.chain != XP_NULL) + if (n == 0 && + run->awk->tree.chain != XP_NULL && + run->exit_level != EXIT_ABORT) { if (__run_pattern_blocks (run) == -1) n = -1; } - if (n == 0 && run->awk->tree.end != XP_NULL) + if (n == 0 && + run->awk->tree.end != XP_NULL && + run->exit_level != EXIT_ABORT) { xp_awk_nde_blk_t* blk; diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index 3477b5f7..a70fd3b3 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -1,10 +1,11 @@ /* - * $Id: awk.c,v 1.62 2006-08-03 09:53:46 bacon Exp $ + * $Id: awk.c,v 1.63 2006-08-04 16:31:22 bacon Exp $ */ #include #include #include +#include #ifdef XP_CHAR_IS_WCHAR #include @@ -479,6 +480,33 @@ xp_printf (XP_TEXT("switching console[%s] of type %x\n"), epa->name, epa->type); return n; } + +xp_awk_t* app_awk = NULL; +void* app_run = NULL; + +static void __stop_run (int sig) +{ + signal (SIGINT, SIG_IGN); + xp_awk_stop (app_awk, app_run); + //xp_awk_stoprun (awk, handle); + /*xp_awk_stopallruns (awk); */ + signal (SIGINT, __stop_run); +} + +static void __on_run_start (xp_awk_t* awk, void* handle) +{ + app_awk = awk; + app_run = handle; +xp_printf (XP_T("AWK PRORAM ABOUT TO START...\n")); +} + +static void __on_run_end (xp_awk_t* awk, void* handle) +{ + app_awk = NULL; + app_run = NULL; +xp_printf (XP_T("AWK PRORAM ABOUT TO END...\n")); +} + #if defined(__STAND_ALONE) && !defined(_WIN32) static int __main (int argc, char* argv[]) #else @@ -486,8 +514,10 @@ static int __main (int argc, xp_char_t* argv[]) #endif { xp_awk_t* awk; + xp_awk_runcb_t runcb; struct src_io src_io = { NULL, NULL }; + if ((awk = xp_awk_open()) == XP_NULL) { xp_printf (XP_T("Error: cannot open awk\n")); @@ -599,7 +629,12 @@ static int __main (int argc, xp_char_t* argv[]) return -1; } - if (xp_awk_run (awk) == -1) + signal (SIGINT, __stop_run); + + runcb.start = __on_run_start; + runcb.end = __on_run_end; + + if (xp_awk_run (awk, &runcb) == -1) { #if defined(__STAND_ALONE) && !defined(_WIN32) && defined(XP_CHAR_IS_WCHAR) xp_printf (