From 706a53574039ee10483caf483f497c4349375c15 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 19 Jun 2006 15:43:27 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.c | 5 +++-- ase/awk/awk_i.h | 8 ++++---- ase/awk/parse.c | 44 ++++++++++++++++++++++++-------------------- ase/awk/run.c | 30 +++++++++++++++++++----------- ase/awk/tree.c | 28 +++++++++++++++++++++++----- ase/awk/tree.h | 13 +++++++++---- ase/test/awk/awk.c | 13 +++++++++++-- 7 files changed, 93 insertions(+), 48 deletions(-) diff --git a/ase/awk/awk.c b/ase/awk/awk.c index da58a78f..ecb5e112 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.53 2006-06-19 09:08:50 bacon Exp $ + * $Id: awk.c,v 1.54 2006-06-19 15:43:27 bacon Exp $ */ #include @@ -225,7 +225,7 @@ xp_size_t xp_awk_getsrcline (xp_awk_t* awk) } -/* TODO: redo it */ +/* TODO: imrove this... should it close io when it is overridden with a new handler??? */ int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg) { if (id < 0 || id >= xp_countof(awk->extio)) @@ -233,6 +233,7 @@ int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg) awk->errnum = XP_AWK_EINVAL; return -1; } + awk->extio[id] = handler; return 0; } diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index cbc0daf9..b16e6dc7 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.17 2006-06-19 09:08:50 bacon Exp $ + * $Id: awk_i.h,v 1.18 2006-06-19 15:43:27 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -10,12 +10,12 @@ typedef struct xp_awk_run_t xp_awk_run_t; typedef struct xp_awk_tree_t xp_awk_tree_t; #include -#include -#include #include #include -#include #include +#include +#include +#include #ifdef XP_AWK_STAND_ALONE #include diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 7b8a2735..c1709df1 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.116 2006-06-18 11:18:49 bacon Exp $ + * $Id: parse.c,v 1.117 2006-06-19 15:43:27 bacon Exp $ */ #include @@ -145,7 +145,8 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk); static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk); static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name); -static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name); +static xp_awk_nde_t* __parse_fncall ( + xp_awk_t* awk, xp_char_t* name, xp_awk_bfn_t* bfn); static xp_awk_nde_t* __parse_if (xp_awk_t* awk); static xp_awk_nde_t* __parse_while (xp_awk_t* awk); static xp_awk_nde_t* __parse_for (xp_awk_t* awk); @@ -2043,27 +2044,18 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk) { xp_awk_nde_t* nde; + xp_free (name_dup); if (!MATCH(awk,TOKEN_LPAREN)) { /* built-in function should be in the form * of the function call */ - xp_free (name_dup); PANIC (awk, XP_AWK_ELPAREN); } - /* bfn->handler... */ - nde = __parse_funcall (awk, name_dup); - if (nde == XP_NULL) xp_free (name_dup); + nde = __parse_fncall (awk, XP_NULL, bfn); return (xp_awk_nde_t*)nde; } - /* TODO: user-defined functions */ - /* - if (__is_ufname (name_dup)) - { - } - */ - /* now we know that name_dup is a normal identifier. */ if (MATCH(awk,TOKEN_LBRACK)) { @@ -2076,7 +2068,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk) { /* function call */ xp_awk_nde_t* nde; - nde = __parse_funcall (awk, name_dup); + nde = __parse_fncall (awk, name_dup, XP_NULL); if (nde == XP_NULL) xp_free (name_dup); return (xp_awk_nde_t*)nde; } @@ -2271,7 +2263,8 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name) PANIC (awk, XP_AWK_EUNDEF); } -static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name) +static xp_awk_nde_t* __parse_fncall ( + xp_awk_t* awk, xp_char_t* name, xp_awk_bfn_t* bfn) { xp_awk_nde_t* head, * curr, * nde; xp_awk_nde_call_t* call; @@ -2336,11 +2329,22 @@ static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name) PANIC (awk, XP_AWK_ENOMEM); } - call->type = XP_AWK_NDE_CALL; - call->next = XP_NULL; - call->name = name; - call->args = head; - call->nargs = nargs; + if (bfn != XP_NULL) + { + call->type = XP_AWK_NDE_BFN; + call->next = XP_NULL; + call->what.bfn = bfn; + call->args = head; + call->nargs = nargs; + } + else + { + call->type = XP_AWK_NDE_UFN; + call->next = XP_NULL; + call->what.name = name; + call->args = head; + call->nargs = nargs; + } return (xp_awk_nde_t*)call; } diff --git a/ase/awk/run.c b/ase/awk/run.c index e4fe395c..4e480653 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.99 2006-06-19 09:08:50 bacon Exp $ + * $Id: run.c,v 1.100 2006-06-19 15:43:27 bacon Exp $ */ #include @@ -120,7 +120,8 @@ static xp_awk_val_t* __eval_unary (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_incpre (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_incpst (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_cnd (xp_awk_run_t* run, xp_awk_nde_t* nde); -static xp_awk_val_t* __eval_call (xp_awk_run_t* run, xp_awk_nde_t* nde); +static xp_awk_val_t* __eval_bfn (xp_awk_run_t* run, xp_awk_nde_t* nde); +static xp_awk_val_t* __eval_ufn (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_int (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_real (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_str (xp_awk_run_t* run, xp_awk_nde_t* nde); @@ -315,15 +316,15 @@ static int __run_main (xp_awk_run_t* run) }; static xp_awk_nde_call_t nde = { - XP_AWK_NDE_CALL, /* type */ - XP_NULL, /* next */ - m_a_i_n, /* name */ - XP_NULL /* args */ + XP_AWK_NDE_UFN, /* type */ + XP_NULL, /* next */ + m_a_i_n, /* name */ + XP_NULL /* args */ }; run->exit_level = EXIT_NONE; - v = __eval_call(run,(xp_awk_nde_t*)&nde); + v = __eval_ufn (run, (xp_awk_nde_t*)&nde); if (v == XP_NULL) n = -1; else { @@ -1000,7 +1001,7 @@ static int __run_return_statement (xp_awk_run_t* run, xp_awk_nde_return_t* nde) xp_awk_refdownval (run, STACK_RETVAL(run)); STACK_RETVAL(run) = val; - xp_awk_refupval (val); /* see __eval_call for the trick */ + xp_awk_refupval (val); /* see __eval_ufn for the trick */ /*xp_printf (XP_T("set return value....\n"));*/ } @@ -1065,7 +1066,8 @@ static xp_awk_val_t* __eval_expression (xp_awk_run_t* run, xp_awk_nde_t* nde) __eval_incpre, __eval_incpst, __eval_cnd, - __eval_call, + __eval_bfn, + __eval_ufn, __eval_int, __eval_real, __eval_str, @@ -2528,7 +2530,13 @@ static xp_awk_val_t* __eval_cnd (xp_awk_run_t* run, xp_awk_nde_t* nde) return v; } -static xp_awk_val_t* __eval_call (xp_awk_run_t* run, xp_awk_nde_t* nde) +static xp_awk_val_t* __eval_bfn (xp_awk_run_t* run, xp_awk_nde_t* nde) +{ + xp_printf (XP_T("__eval_bfn not implemented properly....\n")); + PANIC (run, XP_AWK_EINTERNAL); +} + +static xp_awk_val_t* __eval_ufn (xp_awk_run_t* run, xp_awk_nde_t* nde) { xp_awk_func_t* func; xp_awk_pair_t* pair; @@ -2540,7 +2548,7 @@ static xp_awk_val_t* __eval_call (xp_awk_run_t* run, xp_awk_nde_t* nde) int n; /*xp_printf (XP_T(".....__eval_call\n"));*/ - pair = xp_awk_map_get (&run->awk->tree.funcs, call->name); + pair = xp_awk_map_get (&run->awk->tree.funcs, call->what.name); if (pair == XP_NULL) PANIC (run, XP_AWK_ENOSUCHFUNC); func = (xp_awk_func_t*)pair->val; diff --git a/ase/awk/tree.c b/ase/awk/tree.c index a17380bf..0131eb15 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c,v 1.54 2006-06-18 10:53:06 bacon Exp $ + * $Id: tree.c,v 1.55 2006-06-19 15:43:27 bacon Exp $ */ #include @@ -339,10 +339,19 @@ static int __print_expression (xp_awk_nde_t* nde) break; } - case XP_AWK_NDE_CALL: + case XP_AWK_NDE_BFN: { xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)nde; - xp_printf (XP_T("%s ("), px->name); + xp_printf (XP_T("%s ("), px->what.bfn->name); + if (__print_expression_list (px->args) == -1) return -1; + xp_printf (XP_T(")")); + break; + } + + case XP_AWK_NDE_UFN: + { + xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)nde; + xp_printf (XP_T("%s ("), px->what.name); if (__print_expression_list (px->args) == -1) return -1; xp_printf (XP_T(")")); break; @@ -912,10 +921,19 @@ void xp_awk_clrpt (xp_awk_nde_t* tree) break; } - case XP_AWK_NDE_CALL: + case XP_AWK_NDE_BFN: { xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)p; - xp_free (px->name); + /* xp_free (px->what.bfn); */ + xp_awk_clrpt (px->args); + xp_free (p); + break; + } + + case XP_AWK_NDE_UFN: + { + xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)p; + xp_free (px->what.name); xp_awk_clrpt (px->args); xp_free (p); break; diff --git a/ase/awk/tree.h b/ase/awk/tree.h index 25d73448..ea4e9ad0 100644 --- a/ase/awk/tree.h +++ b/ase/awk/tree.h @@ -1,5 +1,5 @@ /* - * $Id: tree.h,v 1.45 2006-06-18 10:53:06 bacon Exp $ + * $Id: tree.h,v 1.46 2006-06-19 15:43:27 bacon Exp $ */ #ifndef _XP_AWK_TREE_H_ @@ -39,7 +39,8 @@ enum XP_AWK_NDE_EXP_INCPRE, XP_AWK_NDE_EXP_INCPST, XP_AWK_NDE_CND, - XP_AWK_NDE_CALL, + XP_AWK_NDE_BFN, + XP_AWK_NDE_UFN, XP_AWK_NDE_INT, XP_AWK_NDE_REAL, XP_AWK_NDE_STR, @@ -209,11 +210,15 @@ struct xp_awk_nde_var_t xp_awk_nde_t* idx; /* XP_NULL for XXXIDX */ }; -/* XP_AWK_NDE_CALL */ +/* XP_AWK_NDE_BFN, XP_AWK_NDE_UFN */ struct xp_awk_nde_call_t { XP_AWK_NDE_HDR; - xp_char_t* name; + union + { + xp_char_t* name; + xp_awk_bfn_t* bfn; + } what; xp_awk_nde_t* args; xp_size_t nargs; }; diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index 266168a8..70ab45c1 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.38 2006-06-19 09:08:50 bacon Exp $ + * $Id: awk.c,v 1.39 2006-06-19 15:43:27 bacon Exp $ */ #include @@ -176,8 +176,12 @@ static xp_ssize_t process_extio_pipe ( { return -1; } - } + default: + { + return -1; + } + } } static xp_ssize_t process_extio_file ( @@ -222,6 +226,11 @@ static xp_ssize_t process_extio_file ( { return -1; } + + default: + { + return -1; + } } }