diff --git a/ase/awk/awk.h b/ase/awk/awk.h index 6d1bf9c2..bd3867ee 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.74 2006-06-28 14:19:01 bacon Exp $ + * $Id: awk.h,v 1.75 2006-06-30 11:31:50 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -133,6 +133,7 @@ enum 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 */ diff --git a/ase/awk/err.c b/ase/awk/err.c index 882df682..f9bf7041 100644 --- a/ase/awk/err.c +++ b/ase/awk/err.c @@ -1,5 +1,5 @@ /* - * $Id: err.c,v 1.23 2006-06-26 15:09:28 bacon Exp $ + * $Id: err.c,v 1.24 2006-06-30 11:31:50 bacon Exp $ */ #include @@ -65,6 +65,7 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk) XP_T("no such function"), XP_T("value not assignable"), XP_T("value not indexable"), + XP_T("value not deletable"), XP_T("wrong value type"), XP_T("pipe operation error"), XP_T("wrong implementation of user-defined io handler"), diff --git a/ase/awk/run.c b/ase/awk/run.c index 8de281f9..f0a43fe0 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.116 2006-06-30 03:53:16 bacon Exp $ + * $Id: run.c,v 1.117 2006-06-30 11:31:50 bacon Exp $ */ #include @@ -649,93 +649,93 @@ static int __run_statement (xp_awk_run_t* run, xp_awk_nde_t* nde) case XP_AWK_NDE_BLK: { - if (__run_block ( - run, (xp_awk_nde_blk_t*)nde) == -1) return -1; + if (__run_block (run, + (xp_awk_nde_blk_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_IF: { - if (__run_if ( - run, (xp_awk_nde_if_t*)nde) == -1) return -1; + if (__run_if (run, + (xp_awk_nde_if_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_WHILE: case XP_AWK_NDE_DOWHILE: { - if (__run_while ( - run, (xp_awk_nde_while_t*)nde) == -1) return -1; + if (__run_while (run, + (xp_awk_nde_while_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_FOR: { - if (__run_for ( - run, (xp_awk_nde_for_t*)nde) == -1) return -1; + if (__run_for (run, + (xp_awk_nde_for_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_FOREACH: { - if (__run_foreach ( - run, (xp_awk_nde_foreach_t*)nde) == -1) return -1; + if (__run_foreach (run, + (xp_awk_nde_foreach_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_BREAK: { - if (__run_break ( - run, (xp_awk_nde_break_t*)nde) == -1) return -1; + if (__run_break (run, + (xp_awk_nde_break_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_CONTINUE: { - if (__run_continue ( - run, (xp_awk_nde_continue_t*)nde) == -1) return -1; + if (__run_continue (run, + (xp_awk_nde_continue_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_RETURN: { - if (__run_return ( - run, (xp_awk_nde_return_t*)nde) == -1) return -1; + if (__run_return (run, + (xp_awk_nde_return_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_EXIT: { - if (__run_exit ( - run, (xp_awk_nde_exit_t*)nde) == -1) return -1; + if (__run_exit (run, + (xp_awk_nde_exit_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_NEXT: { - if (__run_next ( - run, (xp_awk_nde_next_t*)nde) == -1) return -1; + if (__run_next (run, + (xp_awk_nde_next_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_NEXTFILE: { - if (__run_nextfile ( - run, (xp_awk_nde_nextfile_t*)nde) == -1) return -1; + if (__run_nextfile (run, + (xp_awk_nde_nextfile_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_DELETE: { - if (__run_delete ( - run, (xp_awk_nde_delete_t*)nde) == -1) return -1; + if (__run_delete (run, + (xp_awk_nde_delete_t*)nde) == -1) return -1; break; } case XP_AWK_NDE_PRINT: { - if (__run_print ( - run, (xp_awk_nde_print_t*)nde) == -1) return -1; + if (__run_print (run, + (xp_awk_nde_print_t*)nde) == -1) return -1; break; } @@ -1091,9 +1091,54 @@ static int __run_nextfile (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde) static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde) { - /* TODO */ -xp_printf (XP_T("**** delete NOT IMPLEMENTED...\n")); - return -1; + xp_awk_nde_var_t* var; + + var = (xp_awk_nde_var_t*) nde->var; + + xp_assert (var->type == XP_AWK_NDE_NAMED || + var->type == XP_AWK_NDE_GLOBAL || + var->type == XP_AWK_NDE_LOCAL || + var->type == XP_AWK_NDE_ARG || + var->type == XP_AWK_NDE_NAMEDIDX || + var->type == XP_AWK_NDE_GLOBALIDX || + var->type == XP_AWK_NDE_LOCALIDX || + var->type == XP_AWK_NDE_ARGIDX); + + if (var->type == XP_AWK_NDE_NAMED) + { + xp_awk_pair_t* pair; + + pair = xp_awk_map_get (&run->named, var->id.name); + if (pair != XP_NULL) + { + if (pair == XP_NULL) + { + /* value not set */ + // TODO: create a map here... + } + else + { + xp_awk_val_t* val = (xp_awk_val_t*)pair->val; + + xp_assert (val != XP_NULL); + if (val->type == XP_AWK_VAL_MAP) + { + xp_awk_map_clear (((xp_awk_val_map_t*)val)->map); + } + else + { + PANIC_I (run, XP_AWK_ENOTDELETABLE); + } + } + } + } + else + { +xp_printf (XP_T("**** delete NOT IMPLEMENTED not implemented for this type of variable...\n")); + PANIC_I (run, XP_AWK_EINTERNAL); + } + + return 0; } static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde) diff --git a/ase/test/awk/t12.awk b/ase/test/awk/t12.awk index e3ff76f5..2acfa865 100644 --- a/ase/test/awk/t12.awk +++ b/ase/test/awk/t12.awk @@ -29,6 +29,6 @@ BEGIN getline x < "abc"; print x > "abc"; - print 1 2 getline j j; + print (1 (2 getline j) j); print "abc" 1 + 2 3 + 49 2 / 3; } diff --git a/ase/test/awk/t13.awk b/ase/test/awk/t13.awk new file mode 100644 index 00000000..d8f2a55c --- /dev/null +++ b/ase/test/awk/t13.awk @@ -0,0 +1,8 @@ +BEGIN +{ + a = 20; + /*a[1] = 20; + a[2] = 30;*/ + delete a; +} +