diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index 347f4c58..492def48 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.36 2006-08-01 15:57:42 bacon Exp $ + * $Id: awk_i.h,v 1.37 2006-08-02 14:36:22 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -157,6 +157,7 @@ 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; }; diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 35aaef4d..217f6a9e 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.149 2006-08-01 15:59:27 bacon Exp $ + * $Id: parse.c,v 1.150 2006-08-02 14:36:23 bacon Exp $ */ #include @@ -788,6 +788,7 @@ static xp_awk_nde_t* __parse_ptnblock (xp_awk_t* awk, xp_awk_nde_t* ptn) } chain->pattern = ptn; + chain->pattern_range_state = 0; chain->action = nde; chain->next = XP_NULL; @@ -2226,14 +2227,6 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk) PANIC (awk, XP_AWK_ENOMEM); } - /* TODO: search in the builtin variable name list */ - /* - idxa = .... - if (idxa != (xp_size_t)-1) - { - } - */ - /* search the parameter name list */ idxa = xp_awk_tab_find(&awk->parse.params, name_dup, 0); if (idxa != (xp_size_t)-1) @@ -2352,14 +2345,6 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name) PANIC (awk, XP_AWK_ENOMEM); } - /* TODO: search in the builtin variable name list */ - /* - idxa = xp_awk_tab_find (&awk->parse.params, name, 0); - if (idxa != (xp_size_t)-1) - { - } - */ - /* search the parameter name list */ idxa = xp_awk_tab_find (&awk->parse.params, name, 0); if (idxa != (xp_size_t)-1) diff --git a/ase/awk/run.c b/ase/awk/run.c index 8da0c570..abc1c3bb 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.155 2006-08-02 11:27:07 bacon Exp $ + * $Id: run.c,v 1.156 2006-08-02 14:36:23 bacon Exp $ */ #include @@ -53,6 +53,7 @@ static void __close_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_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); @@ -530,11 +531,21 @@ 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) { @@ -562,13 +573,13 @@ static int __run_pattern_blocks (xp_awk_run_t* run) } } - /* In case of getline, the code would getline return -1, set ERRNO, - * and make this function return 0 after having checke if closextio - * has returned -1 and errnum has been set to XP_AWK_ENOERR. - * But this part of the code ends the input for the implicit - * pattern-block loop, which is totally different from getline. - * So it just returns -1 as long as closeextio returns -1 regardless - * of the value of errnum */ + /* In case of getline, the code would make getline return -1, + * set ERRNO, make this function return 0 after having checked + * if closextio has returned -1 and errnum has been set to + * XP_AWK_ENOERR. But this part of the code ends the input for + * the implicit pattern-block loop, which is totally different + * from getline. so it returns -1 as long as closeextio returns + * -1 regardless of the value of errnum. */ if (need_to_close) { n = xp_awk_closeextio_read ( @@ -587,8 +598,6 @@ 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_awk_nde_t* ptn; - while (run->exit_level != EXIT_GLOBAL && run->exit_level != EXIT_ABORT && chain != XP_NULL) { @@ -598,52 +607,95 @@ static int __run_pattern_block_chain (xp_awk_run_t* run, xp_awk_chain_t* chain) break; } - ptn = chain->pattern; + if (__run_pattern_block (run, chain) == -1) return -1; + chain = chain->next; + } - if (ptn == XP_NULL) - { - /* just execute the block */ - xp_awk_nde_blk_t* blk; - blk = (xp_awk_nde_blk_t*)chain->action; - if (__run_block (run, blk) == -1) return -1; - } - else + return 0; +} + +static int __run_pattern_block (xp_awk_run_t* run, xp_awk_chain_t* chain) +{ + xp_awk_nde_t* ptn; + xp_awk_nde_blk_t* blk; + + ptn = chain->pattern; + blk = (xp_awk_nde_blk_t*)chain->action; + + if (ptn == XP_NULL) + { + /* just execute the block */ + if (__run_block (run, blk) == -1) return -1; + } + else + { + if (ptn->next == XP_NULL) { + /* pattern { ... } */ xp_awk_val_t* v1; - + v1 = __eval_expression (run, ptn); if (v1 == XP_NULL) return -1; xp_awk_refupval (v1); - if (ptn->next == XP_NULL) + if (xp_awk_valtobool(v1)) { + if (__run_block (run, blk) == -1) + { + xp_awk_refdownval (run, v1); + return -1; + } + } + + xp_awk_refdownval (run, v1); + } + else + { + /* pattern, pattern { ... } */ + xp_assert (ptn->next->next == XP_NULL); + + if (chain->pattern_range_state == 0) + { + xp_awk_val_t* v1; + + v1 = __eval_expression (run, ptn); + if (v1 == XP_NULL) return -1; + xp_awk_refupval (v1); + if (xp_awk_valtobool(v1)) { - xp_awk_nde_blk_t* blk; - blk = (xp_awk_nde_blk_t*)chain->action; if (__run_block (run, blk) == -1) { xp_awk_refdownval (run, v1); return -1; } + + chain->pattern_range_state = 1; } xp_awk_refdownval (run, v1); } - else + else if (chain->pattern_range_state == 1) { - /* pattern, pattern { ... } */ - xp_assert (ptn->next->next == XP_NULL); + xp_awk_val_t* v2; - /* TODO: implement this */ - xp_awk_refdownval (run, v1); - xp_printf (XP_T("ERROR: pattern, pattern NOT OMPLEMENTED\n")); - PANIC_I (run, XP_AWK_EINTERNAL); + v2 = __eval_expression (run, ptn->next); + if (v2 == XP_NULL) return -1; + xp_awk_refupval (v2); + + if (__run_block (run, blk) == -1) + { + xp_awk_refdownval (run, v2); + return -1; + } + + if (xp_awk_valtobool(v2)) + chain->pattern_range_state = 0; + + xp_awk_refdownval (run, v2); } } - - chain = chain->next; } return 0; diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index 23d8b421..200e1bc2 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.60 2006-08-01 04:42:49 bacon Exp $ + * $Id: awk.c,v 1.61 2006-08-02 14:36:23 bacon Exp $ */ #include @@ -303,8 +303,8 @@ static int next_extio_console (xp_awk_extio_t* epa); static const xp_char_t* infiles[] = { - XP_T(""), - //XP_T("awk.in"), + //XP_T(""), + XP_T("awk.in"), XP_NULL };