From 976c12d2bfd4d126c5b08220d6215e71827c3a8c Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 1 Jul 2006 07:57:10 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.dsp | 8 +- ase/awk/makefile.cl | 2 +- ase/awk/run.c | 150 ++++++++++++++++++++++--------------- ase/awk/tree.c | 12 ++- ase/awk/tree.h | 9 ++- ase/test/awk/t13.awk | 4 +- ase/test/awk/xptestawk.dsp | 1 + 7 files changed, 111 insertions(+), 75 deletions(-) diff --git a/ase/awk/awk.dsp b/ase/awk/awk.dsp index 2ddb6ff6..162e6b90 100644 --- a/ase/awk/awk.dsp +++ b/ase/awk/awk.dsp @@ -47,7 +47,7 @@ MTL=midl.exe # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "XP_AWK_STAND_ALONE" /FD /c +# ADD CPP /nologo /MT /Za /W3 /GX /O2 /I "..\.." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "XP_AWK_STAND_ALONE" /FD /c # SUBTRACT CPP /YX /Yc /Yu RSC=rc.exe # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -77,7 +77,7 @@ MTL=midl.exe # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "XP_AWK_STAND_ALONE" /FD /GZ /c +# ADD CPP /nologo /MTd /Za /W3 /Gm /GX /ZI /Od /I "..\.." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "XP_AWK_STAND_ALONE" /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu RSC=rc.exe # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -106,7 +106,7 @@ LIB32=link.exe -lib CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /GZ /c # SUBTRACT BASE CPP /YX /Yc /Yu -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /GZ /c +# ADD CPP /nologo /MTd /Za /W3 /Gm /GX /ZI /Od /I "..\.." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu MTL=midl.exe # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 @@ -140,7 +140,7 @@ LINK32=link.exe CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\.." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /c # SUBTRACT BASE CPP /YX /Yc /Yu -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /c +# ADD CPP /nologo /MT /Za /W3 /GX /O2 /I "..\.." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /c # SUBTRACT CPP /YX /Yc /Yu MTL=midl.exe # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 diff --git a/ase/awk/makefile.cl b/ase/awk/makefile.cl index 1e691db9..f3b3bf28 100644 --- a/ase/awk/makefile.cl +++ b/ase/awk/makefile.cl @@ -4,7 +4,7 @@ OUT = xpawk CC = cl #CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../.. -CFLAGS = /nologo /O2 /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../.. -DXP_AWK_STAND_ALONE -DXP_CHAR_IS_WCHAR +CFLAGS = /nologo /O2 /MT /W3 /GR- /Za /D_WIN32_WINNT=0x0400 -I../.. -DXP_AWK_STAND_ALONE -DXP_CHAR_IS_WCHAR all: lib diff --git a/ase/awk/run.c b/ase/awk/run.c index 6dbc0bce..e3702669 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.119 2006-06-30 17:07:52 bacon Exp $ + * $Id: run.c,v 1.120 2006-07-01 07:57:10 bacon Exp $ */ #include @@ -1095,20 +1095,17 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde) 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); - xp_printf (XP_T("********** __run_delete **************\n")); - if (var->type == XP_AWK_NDE_NAMED) + if (var->type == XP_AWK_NDE_NAMED || + var->type == XP_AWK_NDE_NAMEDIDX) { xp_awk_pair_t* pair; + xp_assert ((var->type == XP_AWK_NDE_NAMED && + var->idx == XP_NULL) || + (var->type == XP_AWK_NDE_NAMEDIDX && + var->idx != XP_NULL)); + pair = xp_awk_map_get (&run->named, var->id.name); if (pair == XP_NULL) { @@ -1131,26 +1128,61 @@ xp_printf (XP_T("********** __run_delete **************\n")); } else { - xp_awk_val_t* val = (xp_awk_val_t*)pair->val; + xp_awk_val_t* val; + xp_awk_map_t* map; + val = (xp_awk_val_t*)pair->val; xp_assert (val != XP_NULL); - if (val->type == XP_AWK_VAL_MAP) - { + + if (val->type != XP_AWK_VAL_MAP) + PANIC_I (run, XP_AWK_ENOTDELETABLE); + xp_printf (XP_T("clearing map...\n")); - xp_awk_map_clear (((xp_awk_val_map_t*)val)->map); + map = ((xp_awk_val_map_t*)val)->map; + if (var->type == XP_AWK_NDE_NAMEDIDX) + { + xp_char_t* key; + xp_awk_val_t* idx; + int errnum; + + xp_assert (var->idx != XP_NULL); + + idx = __eval_expression (run, var->idx); + if (idx == XP_NULL) return -1; + + xp_awk_refupval (idx); + key = xp_awk_valtostr (idx, &errnum, XP_NULL); + xp_awk_refdownval (run, idx); + + if (key == XP_NULL) PANIC_I (run, errnum); + + xp_awk_map_remove (map, key); + xp_free (key); } else { - PANIC_I (run, XP_AWK_ENOTDELETABLE); + xp_awk_map_clear (map); } } } - else if (var->type == XP_AWK_NDE_GLOBAL) + else if (var->type == XP_AWK_NDE_GLOBAL || + var->type == XP_AWK_NDE_LOCAL || + var->type == XP_AWK_NDE_ARG || + var->type == XP_AWK_NDE_GLOBALIDX || + var->type == XP_AWK_NDE_LOCALIDX || + var->type == XP_AWK_NDE_ARGIDX) { xp_awk_val_t* val; -xp_printf (XP_T("clearing global...\n")); - val = STACK_GLOBAL (run,var->id.idxa); +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); + else if (var->type == XP_AWK_NDE_LOCAL || + var->type == XP_AWK_NDE_LOCALIDX) + val = STACK_LOCAL (run,var->id.idxa); + else val = STACK_ARG (run,var->id.idxa); + xp_assert (val != XP_NULL); if (val->type == XP_AWK_VAL_NIL) @@ -1165,62 +1197,56 @@ xp_printf (XP_T("clearing global...\n")); /* no need to reduce the reference count of * the previous value because it was nil. */ - STACK_GLOBAL (run,var->id.idxa) = tmp; + if (var->type == XP_AWK_NDE_GLOBAL || + var->type == XP_AWK_NDE_GLOBALIDX) + STACK_GLOBAL(run,var->id.idxa) = tmp; + else if (var->type == XP_AWK_NDE_LOCAL || + var->type == XP_AWK_NDE_LOCALIDX) + STACK_LOCAL(run,var->id.idxa) = tmp; + else STACK_ARG(run,var->id.idxa) = tmp; + xp_awk_refupval (tmp); } else { - if (val->type == XP_AWK_VAL_MAP) + xp_awk_map_t* map; + + 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 || + var->type == XP_AWK_NDE_ARGIDX) { -xp_printf (XP_TEXT("clearning....\n")); - xp_awk_map_clear (((xp_awk_val_map_t*)val)->map); + xp_char_t* key; + xp_awk_val_t* idx; + int errnum; + + xp_assert (var->idx != XP_NULL); + + idx = __eval_expression (run, var->idx); + if (idx == XP_NULL) return -1; + + xp_awk_refupval (idx); + key = xp_awk_valtostr (idx, &errnum, XP_NULL); + xp_awk_refdownval (run, idx); + + if (key == XP_NULL) PANIC_I (run, errnum); + + xp_awk_map_remove (map, key); + xp_free (key); } else { - PANIC_I (run, XP_AWK_ENOTDELETABLE); + xp_awk_map_clear (map); } } } - else if (var->type == XP_AWK_NDE_LOCAL) - { - xp_awk_val_t* val; - -xp_printf (XP_T("clearing lcoal...\n")); - val = STACK_LOCAL (run,var->id.idxa); - xp_assert (val != XP_NULL); - - if (val->type == XP_AWK_VAL_NIL) - { - xp_awk_val_t* tmp; - - /* value not set for the named variable. - * create a map and assign it to the variable */ - - tmp = xp_awk_makemapval (run); - if (tmp == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM); - - /* no need to reduce the reference count of - * the previous value because it was nil. */ - STACK_LOCAL (run,var->id.idxa) = tmp; - xp_awk_refupval (tmp); - } - else - { - if (val->type == XP_AWK_VAL_MAP) - { -xp_printf (XP_TEXT("clearning....\n")); - 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")); + xp_assert (!"should never happen - wrong variable type for delete"); PANIC_I (run, XP_AWK_EINTERNAL); } diff --git a/ase/awk/tree.c b/ase/awk/tree.c index e350dd05..08883f83 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c,v 1.61 2006-06-29 15:40:30 bacon Exp $ + * $Id: tree.c,v 1.62 2006-07-01 07:57:10 bacon Exp $ */ #include @@ -93,8 +93,11 @@ static void __print_statements (xp_awk_nde_t* tree, int depth); static void __print_tabs (int depth) { - int i; - for (i = 0; i < depth; i++) xp_printf (XP_T("\t")); + while (depth > 0) + { + xp_printf (XP_T("\t")); + depth--; + } } static int __print_expression (xp_awk_nde_t* nde) @@ -106,7 +109,8 @@ static int __print_expression (xp_awk_nde_t* nde) xp_awk_nde_t* p = ((xp_awk_nde_grp_t*)nde)->body; xp_printf (XP_T("(")); - while (p != XP_NULL) { + while (p != XP_NULL) + { __print_expression (p); if (p->next != XP_NULL) xp_printf (XP_T(",")); p = p->next; diff --git a/ase/awk/tree.h b/ase/awk/tree.h index f1eab2b3..5973d69e 100644 --- a/ase/awk/tree.h +++ b/ase/awk/tree.h @@ -1,5 +1,5 @@ /* - * $Id: tree.h,v 1.55 2006-06-29 14:38:01 bacon Exp $ + * $Id: tree.h,v 1.56 2006-07-01 07:57:10 bacon Exp $ */ #ifndef _XP_AWK_TREE_H_ @@ -209,7 +209,10 @@ struct xp_awk_nde_rex_t xp_size_t len; }; -/* XP_AWK_NDE_ARG, XP_AWK_NDE_VAR, ... */ +/* XP_AWK_NDE_NAMED, XP_AWK_NDE_GLOBAL, + * XP_AWK_NDE_LOCAL, XP_AWK_NDE_ARG + * XP_AWK_NDE_NAMEDIDX, XP_AWK_NDE_GLOBALIDX, + * XP_AWK_NDE_LOCALIDX, XP_AWK_NDE_ARGIDX */ struct xp_awk_nde_var_t { XP_AWK_NDE_HDR; @@ -218,7 +221,7 @@ struct xp_awk_nde_var_t xp_char_t* name; xp_size_t idxa; } id; - xp_awk_nde_t* idx; /* XP_NULL for XXXIDX */ + xp_awk_nde_t* idx; /* XP_NULL for non-XXXXIDX */ }; /* XP_AWK_NDE_BFN, XP_AWK_NDE_UFN */ diff --git a/ase/test/awk/t13.awk b/ase/test/awk/t13.awk index 3a47728f..624f7177 100644 --- a/ase/test/awk/t13.awk +++ b/ase/test/awk/t13.awk @@ -9,8 +9,10 @@ BEGIN b["xxx"] = 20; b["yyy"] = 30; + b[1] = 30; + b["2"] = 30; delete a; - delete b; + delete b["1"]; } diff --git a/ase/test/awk/xptestawk.dsp b/ase/test/awk/xptestawk.dsp index 27e2f290..6b042cd9 100644 --- a/ase/test/awk/xptestawk.dsp +++ b/ase/test/awk/xptestawk.dsp @@ -67,6 +67,7 @@ LINK32=link.exe # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "__STAND_ALONE" /FR /YX /FD /GZ /c +# SUBTRACT CPP /FA # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe