From ea31037b6d72d78b69cfa0712e124ba52438a17a Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 1 Jul 2006 16:07:06 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.h | 23 +++++---- ase/awk/awk_i.h | 6 +-- ase/awk/err.c | 7 +-- ase/awk/extio.c | 5 +- ase/awk/parse.c | 47 ++++++++--------- ase/awk/run.c | 117 ++++++++++++++++++++++++++++--------------- ase/awk/tree.c | 3 +- ase/awk/tree.h | 4 +- ase/awk/val.c | 31 ++---------- ase/awk/val.h | 4 +- ase/test/awk/t13.awk | 5 ++ ase/test/awk/t14.awk | 12 +++++ 12 files changed, 148 insertions(+), 116 deletions(-) create mode 100644 ase/test/awk/t14.awk diff --git a/ase/awk/awk.h b/ase/awk/awk.h index bd3867ee..99604566 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.75 2006-06-30 11:31:50 bacon Exp $ + * $Id: awk.h,v 1.76 2006-07-01 16:07:06 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -128,16 +128,17 @@ enum XP_AWK_EGETLINE, /* getline expected */ /* run time error */ - XP_AWK_EDIVBYZERO, /* divide by zero */ - XP_AWK_EOPERAND, /* invalid operand */ - XP_AWK_ENOSUCHFUNC, /* no such function */ - XP_AWK_ENOTASSIGNABLE, /* value not assignable */ - XP_AWK_ENOTINDEXABLE, /* not indexable value */ - XP_AWK_ENOTDELETABLE, /* not deletable value */ - XP_AWK_EVALTYPE, /* wrong value type */ - XP_AWK_EPIPE, /* pipe operation error */ - XP_AWK_EIOIMPL, /* wrong implementation of user io handler */ - XP_AWK_EINTERNAL /* internal error */ + XP_AWK_EDIVBYZERO, /* divide by zero */ + XP_AWK_EOPERAND, /* invalid operand */ + XP_AWK_ENOSUCHFUNC, /* no such function */ + XP_AWK_ENOTASSIGNABLE, /* value not assignable */ + XP_AWK_ENOTINDEXABLE, /* not indexable variable */ + XP_AWK_ENOTDELETABLE, /* not deletable variable */ + XP_AWK_ENOTSCALARIZABLE, /* not scalarizable variable */ + XP_AWK_EVALTYPE, /* wrong value type */ + XP_AWK_EPIPE, /* pipe operation error */ + XP_AWK_EIOIMPL, /* wrong implementation of user io handler */ + XP_AWK_EINTERNAL /* internal error */ }; /* extio types */ diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index 162c1308..fa1ca0d5 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.23 2006-06-30 04:18:47 bacon Exp $ + * $Id: awk_i.h,v 1.24 2006-07-01 16:07:06 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -151,8 +151,8 @@ struct xp_awk_run_t xp_size_t stack_limit; int exit_level; - xp_awk_val_int_t* icache[100]; /* TODO: ... */ - xp_awk_val_real_t* rcache[100]; /* TODO: ... */ + xp_awk_val_int_t* icache[100]; /* TODO: choose the optimal size */ + xp_awk_val_real_t* rcache[100]; /* TODO: choose the optimal size */ xp_size_t icache_count; xp_size_t rcache_count; diff --git a/ase/awk/err.c b/ase/awk/err.c index f9bf7041..66f75f42 100644 --- a/ase/awk/err.c +++ b/ase/awk/err.c @@ -1,5 +1,5 @@ /* - * $Id: err.c,v 1.24 2006-06-30 11:31:50 bacon Exp $ + * $Id: err.c,v 1.25 2006-07-01 16:07:06 bacon Exp $ */ #include @@ -64,8 +64,9 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk) XP_T("invalid operand"), XP_T("no such function"), XP_T("value not assignable"), - XP_T("value not indexable"), - XP_T("value not deletable"), + XP_T("variable not indexable"), + XP_T("variable not deletable"), + XP_T("variable not scalarizable"), XP_T("wrong value type"), XP_T("pipe operation error"), XP_T("wrong implementation of user-defined io handler"), diff --git a/ase/awk/extio.c b/ase/awk/extio.c index d60a8d8c..a66738a7 100644 --- a/ase/awk/extio.c +++ b/ase/awk/extio.c @@ -1,5 +1,5 @@ /* - * $Id: extio.c,v 1.16 2006-06-29 14:38:01 bacon Exp $ + * $Id: extio.c,v 1.17 2006-07-01 16:07:06 bacon Exp $ */ #include @@ -240,7 +240,8 @@ int xp_awk_writeextio ( return -1; } - /* TODO: optimize the buffer management. each xp_awk_run_t have a buffer for this operation??? */ + /* TODO: optimize the buffer management. + * each xp_awk_run_t may have a buffer for this. */ if (xp_str_open (&buf, 256) == XP_NULL) { *errnum = XP_AWK_ENOMEM; diff --git a/ase/awk/parse.c b/ase/awk/parse.c index dcc84707..da9a1872 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.130 2006-06-30 03:53:16 bacon Exp $ + * $Id: parse.c,v 1.131 2006-07-01 16:07:06 bacon Exp $ */ #include @@ -81,9 +81,9 @@ enum TOKEN_CONTINUE, TOKEN_RETURN, TOKEN_EXIT, - TOKEN_DELETE, TOKEN_NEXT, TOKEN_NEXTFILE, + TOKEN_DELETE, TOKEN_PRINT, TOKEN_PRINTF, @@ -157,11 +157,11 @@ static xp_awk_nde_t* __parse_break (xp_awk_t* awk); static xp_awk_nde_t* __parse_continue (xp_awk_t* awk); static xp_awk_nde_t* __parse_return (xp_awk_t* awk); static xp_awk_nde_t* __parse_exit (xp_awk_t* awk); +static xp_awk_nde_t* __parse_next (xp_awk_t* awk); +static xp_awk_nde_t* __parse_nextfile (xp_awk_t* awk); static xp_awk_nde_t* __parse_delete (xp_awk_t* awk); static xp_awk_nde_t* __parse_print (xp_awk_t* awk); static xp_awk_nde_t* __parse_printf (xp_awk_t* awk); -static xp_awk_nde_t* __parse_next (xp_awk_t* awk); -static xp_awk_nde_t* __parse_nextfile (xp_awk_t* awk); static int __get_token (xp_awk_t* awk); static int __get_number (xp_awk_t* awk); @@ -208,9 +208,9 @@ static struct __kwent __kwtab[] = { XP_T("continue"), TOKEN_CONTINUE, 0 }, { XP_T("return"), TOKEN_RETURN, 0 }, { XP_T("exit"), TOKEN_EXIT, 0 }, - { XP_T("delete"), TOKEN_DELETE, 0 }, { XP_T("next"), TOKEN_NEXT, 0 }, { XP_T("nextfile"), TOKEN_NEXTFILE, 0 }, + { XP_T("delete"), TOKEN_DELETE, 0 }, { XP_T("print"), TOKEN_PRINT, XP_AWK_EXTIO }, { XP_T("printf"), TOKEN_PRINTF, XP_AWK_EXTIO }, @@ -667,7 +667,8 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk) return XP_NULL; } -/* TODO: consider if the parameter names should be saved for some reasons.. */ + /* TODO: study furthur if the parameter names should be saved + * for some reasons */ nargs = xp_awk_tab_getsize (&awk->parse.params); /* parameter names are not required anymore. clear them */ xp_awk_tab_clear (&awk->parse.params); @@ -1067,47 +1068,47 @@ static xp_awk_nde_t* __parse_statement_nb (xp_awk_t* awk) else if (MATCH(awk,TOKEN_BREAK)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_break(awk); + nde = __parse_break (awk); } else if (MATCH(awk,TOKEN_CONTINUE)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_continue(awk); + nde = __parse_continue (awk); } else if (MATCH(awk,TOKEN_RETURN)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_return(awk); + nde = __parse_return (awk); } else if (MATCH(awk,TOKEN_EXIT)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_exit(awk); - } - else if (MATCH(awk,TOKEN_DELETE)) - { - if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_delete(awk); + nde = __parse_exit (awk); } else if (MATCH(awk,TOKEN_NEXT)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_next(awk); + nde = __parse_next (awk); } else if (MATCH(awk,TOKEN_NEXTFILE)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_nextfile(awk); + nde = __parse_nextfile (awk); + } + else if (MATCH(awk,TOKEN_DELETE)) + { + if (__get_token(awk) == -1) return XP_NULL; + nde = __parse_delete (awk); } else if (MATCH(awk,TOKEN_PRINT)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_print(awk); + nde = __parse_print (awk); } else if (MATCH(awk,TOKEN_PRINTF)) { if (__get_token(awk) == -1) return XP_NULL; - nde = __parse_printf(awk); + nde = __parse_printf (awk); } else { @@ -1542,7 +1543,7 @@ static xp_awk_nde_t* __parse_bitwise_or_with_extio (xp_awk_t* awk) return XP_NULL; } - /* TODO: some constant folding */ + /* TODO: do constant folding */ nde = (xp_awk_nde_exp_t*) xp_malloc (xp_sizeof(xp_awk_nde_exp_t)); @@ -1635,7 +1636,7 @@ static xp_awk_nde_t* __parse_concat (xp_awk_t* awk) if (left == XP_NULL) return XP_NULL; /* TODO: write a better code to do this.... - * first of all, is the following check sufficient??? */ + * first of all, is the following check sufficient? */ while (MATCH(awk,TOKEN_LPAREN) || awk->token.type >= TOKEN_GETLINE) { right = __parse_additive (awk); @@ -2962,7 +2963,7 @@ static xp_awk_nde_t* __parse_print (xp_awk_t* awk) static xp_awk_nde_t* __parse_printf (xp_awk_t* awk) { -/* TODO: implement this... */ + /* TODO: implement this... */ return XP_NULL; } @@ -3492,7 +3493,7 @@ static int __get_string (xp_awk_t* awk) if (c == XP_T('n')) c = XP_T('\n'); else if (c == XP_T('r')) c = XP_T('\r'); else if (c == XP_T('t')) c = XP_T('\t'); - /* TODO: more escape characters */ + /* TODO: add more escape characters */ escaped = xp_false; } diff --git a/ase/awk/run.c b/ase/awk/run.c index e3702669..e1fe566f 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.120 2006-07-01 07:57:10 bacon Exp $ + * $Id: run.c,v 1.121 2006-07-01 16:07:06 bacon Exp $ */ #include @@ -26,12 +26,16 @@ /*#define STACK_RETVAL_GLOBAL(run) ((run)->stack[(run)->nglobals+2])*/ #define STACK_RETVAL_GLOBAL(run) ((run)->stack[(run)->awk->tree.nglobals+2]) -#define EXIT_NONE 0 -#define EXIT_BREAK 1 -#define EXIT_CONTINUE 2 -#define EXIT_FUNCTION 3 -#define EXIT_GLOBAL 4 -#define EXIT_ABORT 5 +enum +{ + EXIT_NONE, + EXIT_BREAK, + EXIT_CONTINUE, + EXIT_FUNCTION, + EXIT_NEXT, + EXIT_GLOBAL, + EXIT_ABORT, +}; #define PANIC(run,code) \ do { (run)->errnum = (code); return XP_NULL; } while (0) @@ -415,12 +419,13 @@ static int __run_main (xp_awk_run_t* run) /* stack set up properly. ready to exeucte statement blocks */ if (n == 0 && run->awk->tree.begin != XP_NULL) { - xp_assert (run->awk->tree.begin->type == XP_AWK_NDE_BLK); + xp_awk_nde_blk_t* blk; + + blk = (xp_awk_nde_blk_t*)run->awk->tree.begin; + xp_assert (blk->type == XP_AWK_NDE_BLK); run->exit_level = EXIT_NONE; - - if (__run_block (run, - (xp_awk_nde_blk_t*)run->awk->tree.begin) == -1) n = -1; + if (__run_block (run, blk) == -1) n = -1; } if (n == 0 && run->txtio != XP_NULL) @@ -430,12 +435,13 @@ static int __run_main (xp_awk_run_t* run) if (n == 0 && run->awk->tree.end != XP_NULL) { - xp_assert (run->awk->tree.end->type == XP_AWK_NDE_BLK); + xp_awk_nde_blk_t* blk; + + blk = (xp_awk_nde_blk_t*)run->awk->tree.end; + xp_assert (blk->type == XP_AWK_NDE_BLK); run->exit_level = EXIT_NONE; - - if (__run_block (run, - (xp_awk_nde_blk_t*)run->awk->tree.end) == -1) n = -1; + if (__run_block (run, blk) == -1) n = -1; } /* restore stack */ @@ -511,12 +517,6 @@ static int __run_pattern_blocks (xp_awk_run_t* run) if (x == 0) break; /* end of input */ - /* -xp_printf (XP_T("**** line [%s]\n"), XP_STR_BUF(&run->input.line)); - */ - /* for each block { run it } - * TODO: handle according if next and nextfile has been called - */ if (__run_pattern_block_chain (run, run->awk->tree.chain) == -1) { /* don't care about the result of input close */ @@ -536,14 +536,24 @@ static int __run_pattern_block_chain (xp_awk_run_t* run, xp_awk_chain_t* chain) { xp_awk_nde_t* ptn; - while (chain != XP_NULL) + while (run->exit_level != EXIT_GLOBAL && + run->exit_level != EXIT_ABORT && chain != XP_NULL) { + + if (run->exit_level == EXIT_NEXT) + { + run->exit_level = EXIT_NONE; + break; + } + ptn = chain->pattern; if (ptn == XP_NULL) { /* just execute the block */ - if (__run_block (run, (xp_awk_nde_blk_t*)chain->action) == -1) return -1; + xp_awk_nde_blk_t* blk; + blk = (xp_awk_nde_blk_t*)chain->action; + if (__run_block (run, blk) == -1) return -1; } else { @@ -558,7 +568,9 @@ static int __run_pattern_block_chain (xp_awk_run_t* run, xp_awk_chain_t* chain) { if (xp_awk_valtobool(v1)) { - if (__run_block (run, (xp_awk_nde_blk_t*)chain->action) == -1) + 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; @@ -1074,15 +1086,16 @@ static int __run_exit (xp_awk_run_t* run, xp_awk_nde_exit_t* nde) static int __run_next (xp_awk_run_t* run, xp_awk_nde_next_t* nde) { - /* TODO */ -xp_printf (XP_T("**** next NOT IMPLEMENTED...\n")); - return -1; + /* TODO: trigger an error if "next" is called from BEGIN or END */ + run->exit_level = EXIT_NEXT; + return 0; } static int __run_nextfile (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde) { xp_ssize_t n; + /* TODO: implement this properly */ /* TODO: how to pass opt properly for IO_NEXT??? -> READ? WRITE? */ n = run->txtio (XP_AWK_IO_NEXT, 0, run->txtio_arg, XP_NULL, 0); if (n == -1) PANIC_I (run, XP_AWK_ETXTINNEXT); @@ -1095,7 +1108,6 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde) var = (xp_awk_nde_var_t*) nde->var; -xp_printf (XP_T("********** __run_delete **************\n")); if (var->type == XP_AWK_NDE_NAMED || var->type == XP_AWK_NDE_NAMEDIDX) { @@ -1137,7 +1149,6 @@ xp_printf (XP_T("********** __run_delete **************\n")); if (val->type != XP_AWK_VAL_MAP) PANIC_I (run, XP_AWK_ENOTDELETABLE); -xp_printf (XP_T("clearing map...\n")); map = ((xp_awk_val_map_t*)val)->map; if (var->type == XP_AWK_NDE_NAMEDIDX) { @@ -1174,7 +1185,6 @@ xp_printf (XP_T("clearing map...\n")); { xp_awk_val_t* val; -xp_printf (XP_T("clearing global/local/arg...\n")); if (var->type == XP_AWK_NDE_GLOBAL || var->type == XP_AWK_NDE_GLOBALIDX) val = STACK_GLOBAL (run,var->id.idxa); @@ -1214,7 +1224,6 @@ xp_printf (XP_T("clearing global/local/arg...\n")); if (val->type != XP_AWK_VAL_MAP) PANIC_I (run, XP_AWK_ENOTDELETABLE); -xp_printf (XP_T("clearing map...\n")); map = ((xp_awk_val_map_t*)val)->map; if (var->type == XP_AWK_NDE_GLOBALIDX || var->type == XP_AWK_NDE_LOCALIDX || @@ -1494,9 +1503,18 @@ static xp_awk_val_t* __do_assignment ( if (var->type == XP_AWK_NDE_NAMED) { + xp_awk_pair_t* pair; int n; -/* TODO: need to check if the old value is a map?? prevent the assignment? */ + pair = xp_awk_map_get (&run->named, var->id.name); + if (pair != XP_NULL && + ((xp_awk_val_t*)pair->val)->type == XP_AWK_VAL_MAP) + { + /* once a variable becomes an array, + * it cannot be changed to a scalar variable */ + PANIC (run, XP_AWK_ENOTSCALARIZABLE); + } + n = xp_awk_map_putx ( &run->named, var->id.name, val, XP_NULL); if (n < 0) PANIC (run, XP_AWK_ENOMEM); @@ -1505,22 +1523,43 @@ static xp_awk_val_t* __do_assignment ( } else if (var->type == XP_AWK_NDE_GLOBAL) { -/* TODO: need to check if the old value is a map?? prevent the assignment? */ - xp_awk_refdownval (run, STACK_GLOBAL(run,var->id.idxa)); + xp_awk_val_t* old = STACK_GLOBAL(run,var->id.idxa); + if (old->type == XP_AWK_VAL_MAP) + { + /* once a variable becomes an array, + * it cannot be changed to a scalar variable */ + PANIC (run, XP_AWK_ENOTSCALARIZABLE); + } + + xp_awk_refdownval (run, old); STACK_GLOBAL(run,var->id.idxa) = val; xp_awk_refupval (val); } else if (var->type == XP_AWK_NDE_LOCAL) { -/* TODO: need to check if the old value is a map?? prevent the assignment? */ - xp_awk_refdownval (run, STACK_LOCAL(run,var->id.idxa)); + xp_awk_val_t* old = STACK_LOCAL(run,var->id.idxa); + if (old->type == XP_AWK_VAL_MAP) + { + /* once the variable becomes an array, + * it cannot be changed to a scalar variable */ + PANIC (run, XP_AWK_ENOTSCALARIZABLE); + } + + xp_awk_refdownval (run, old); STACK_LOCAL(run,var->id.idxa) = val; xp_awk_refupval (val); } else if (var->type == XP_AWK_NDE_ARG) { -/* TODO: need to check if the old value is a map?? prevent the assignment? */ - xp_awk_refdownval (run, STACK_ARG(run,var->id.idxa)); + xp_awk_val_t* old = STACK_ARG(run,var->id.idxa); + if (old->type == XP_AWK_VAL_MAP) + { + /* once the variable becomes an array, + * it cannot be changed to a scalar variable */ + PANIC (run, XP_AWK_ENOTSCALARIZABLE); + } + + xp_awk_refdownval (run, old); STACK_ARG(run,var->id.idxa) = val; xp_awk_refupval (val); } @@ -3306,7 +3345,7 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde) dst = (in == XP_NULL)? XP_T(""): in; - /* TODO: optimization in line buffer management */ + /* TODO: optimize the line buffer management */ if (xp_str_open (&buf, DEF_BUF_CAPA) == XP_NULL) { if (in != XP_NULL) xp_free (in); diff --git a/ase/awk/tree.c b/ase/awk/tree.c index 08883f83..94cafeec 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c,v 1.62 2006-07-01 07:57:10 bacon Exp $ + * $Id: tree.c,v 1.63 2006-07-01 16:07:06 bacon Exp $ */ #include @@ -367,7 +367,6 @@ static int __print_expression (xp_awk_nde_t* nde) case XP_AWK_NDE_GETLINE: { - /* TODO */ xp_awk_nde_getline_t* px = (xp_awk_nde_getline_t*)nde; if (px->in != XP_NULL && (px->in_type == XP_AWK_IN_PIPE || diff --git a/ase/awk/tree.h b/ase/awk/tree.h index 5973d69e..a4a82cc2 100644 --- a/ase/awk/tree.h +++ b/ase/awk/tree.h @@ -1,5 +1,5 @@ /* - * $Id: tree.h,v 1.56 2006-07-01 07:57:10 bacon Exp $ + * $Id: tree.h,v 1.57 2006-07-01 16:07:06 bacon Exp $ */ #ifndef _XP_AWK_TREE_H_ @@ -204,7 +204,7 @@ struct xp_awk_nde_str_t struct xp_awk_nde_rex_t { XP_AWK_NDE_HDR; -/* TODO: */ + /* TODO: implement the regular expression value node */ xp_char_t* buf; xp_size_t len; }; diff --git a/ase/awk/val.c b/ase/awk/val.c index 28812b62..8952c6f4 100644 --- a/ase/awk/val.c +++ b/ase/awk/val.c @@ -1,5 +1,5 @@ /* - * $Id: val.c,v 1.34 2006-06-30 16:46:34 bacon Exp $ + * $Id: val.c,v 1.35 2006-07-01 16:07:06 bacon Exp $ */ #include @@ -129,7 +129,7 @@ xp_awk_val_t* xp_awk_makerexval (const xp_char_t* str, xp_size_t len) { xp_awk_val_rex_t* val; -/* TDOO: XXXXXXXXXXXXXX */ +/* TDOO: implement the regular expression value */ val = (xp_awk_val_rex_t*) xp_malloc (xp_sizeof(xp_awk_val_rex_t)); if (val == XP_NULL) return XP_NULL; @@ -222,7 +222,7 @@ xp_printf (XP_T("\n"));*/ return; case XP_AWK_VAL_REX: -/* TODO: XXXX */ + /* TODO: implement the regular expression value properly */ xp_free (((xp_awk_val_rex_t*)val)->buf); xp_free (val); return; @@ -279,31 +279,6 @@ void xp_awk_refdownval_nofree (xp_awk_run_t* run, xp_awk_val_t* val) val->ref--; } -xp_awk_val_t* xp_awk_cloneval (xp_awk_run_t* run, xp_awk_val_t* val) -{ - if (val == XP_NULL) return xp_awk_val_nil; - - switch (val->type) - { - case XP_AWK_VAL_NIL: - return xp_awk_val_nil; - case XP_AWK_VAL_INT: - return xp_awk_makeintval (run, ((xp_awk_val_int_t*)val)->val); - case XP_AWK_VAL_REAL: - return xp_awk_makerealval (run, ((xp_awk_val_real_t*)val)->val); - case XP_AWK_VAL_STR: - return xp_awk_makestrval ( - ((xp_awk_val_str_t*)val)->buf, - ((xp_awk_val_str_t*)val)->len); - case XP_AWK_VAL_MAP: -/* TODO: .... */ - return XP_NULL; - } - - xp_assert (!"should never happen - invalid value type"); - return XP_NULL; -} - xp_bool_t xp_awk_valtobool (xp_awk_val_t* val) { if (val == XP_NULL) return xp_false; diff --git a/ase/awk/val.h b/ase/awk/val.h index 48807b4e..3b16963d 100644 --- a/ase/awk/val.h +++ b/ase/awk/val.h @@ -1,5 +1,5 @@ /* - * $Id: val.h,v 1.26 2006-06-30 16:46:34 bacon Exp $ + * $Id: val.h,v 1.27 2006-07-01 16:07:06 bacon Exp $ */ #ifndef _XP_AWK_VAL_H_ @@ -111,8 +111,6 @@ void xp_awk_refupval (xp_awk_val_t* val); void xp_awk_refdownval (xp_awk_run_t* run, xp_awk_val_t* val); void xp_awk_refdownval_nofree (xp_awk_run_t* run, xp_awk_val_t* val); -xp_awk_val_t* xp_awk_cloneval (xp_awk_run_t* run, xp_awk_val_t* val); - xp_bool_t xp_awk_valtobool (xp_awk_val_t* val); xp_char_t* xp_awk_valtostr (xp_awk_val_t* val, int* errnum, xp_str_t* buf); diff --git a/ase/test/awk/t13.awk b/ase/test/awk/t13.awk index 624f7177..c1d75f37 100644 --- a/ase/test/awk/t13.awk +++ b/ase/test/awk/t13.awk @@ -7,6 +7,7 @@ BEGIN //a[1] = 20; //a[2] = 30; + /* b["xxx"] = 20; b["yyy"] = 30; b[1] = 30; @@ -14,5 +15,9 @@ BEGIN delete a; delete b["1"]; + */ + c[1] = 20; + c[1] = "aaa"; + c = 30; } diff --git a/ase/test/awk/t14.awk b/ase/test/awk/t14.awk new file mode 100644 index 00000000..f163008a --- /dev/null +++ b/ase/test/awk/t14.awk @@ -0,0 +1,12 @@ +{ + print "1111111111111"; +} + +{ + print "22222222222222"; + next; +} + +{ + print "33333333333333333"; +}