From 66869c87cfd2c973195ae6e60211509141c7e4fb Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 3 May 2006 15:40:19 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/run.c | 198 +++++++++++++++++++++++++------------------------- 1 file changed, 98 insertions(+), 100 deletions(-) diff --git a/ase/awk/run.c b/ase/awk/run.c index c08c45cf..c8871555 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.82 2006-05-02 15:43:10 bacon Exp $ + * $Id: run.c,v 1.83 2006-05-03 15:40:19 bacon Exp $ */ #include @@ -139,6 +139,7 @@ static void __raw_pop_times (xp_awk_run_t* run, xp_size_t times); static int __read_text_input (xp_awk_run_t* run); static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r); static xp_char_t* __val_to_str (xp_awk_val_t* v, int* errnum); +static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde); typedef xp_awk_val_t* (*binop_func_t) ( xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right); @@ -1086,7 +1087,7 @@ static xp_awk_val_t* __do_assignment_map ( { xp_awk_val_map_t* map; xp_awk_nde_t* nde; - xp_str_t idxstr; + xp_char_t* str; int n; xp_assert ( @@ -1160,63 +1161,20 @@ static xp_awk_val_t* __do_assignment_map ( PANIC (run, XP_AWK_ENOTINDEXABLE); } - /* compose a map index */ - if (xp_str_open (&idxstr, 256) == XP_NULL) PANIC (run, XP_AWK_ENOMEM); - - for (nde = var->idx; nde != XP_NULL; nde = nde->next) - { - xp_awk_val_t* tmp; - xp_char_t* str; - int errnum; - - tmp = __eval_expression (run, nde); - if (tmp == XP_NULL) - { - xp_str_close (&idxstr); - return XP_NULL; - } - - xp_awk_refupval (tmp); - - str = __val_to_str (tmp, &errnum); - if (str == XP_NULL) - { - xp_awk_refdownval (run, tmp); - xp_str_close (&idxstr); - PANIC (run, errnum); - } - xp_awk_refdownval (run, tmp); - -/* TODO: configurable index seperator */ - if (XP_STR_LEN(&idxstr) > 0 && - xp_str_cat (&idxstr, XP_TEXT(",")) == (xp_size_t)-1) - { - xp_free (str); - xp_str_close (&idxstr); - PANIC (run, XP_AWK_ENOMEM); - } - - if (xp_str_cat (&idxstr, str) == (xp_size_t)-1) - { - xp_free (str); - xp_str_close (&idxstr); - PANIC (run, XP_AWK_ENOMEM); - } - - xp_free (str); - } + str = __idxnde_to_str (run, var->idx); + if (str == XP_NULL) return XP_NULL; /* xp_printf (XP_TEXT("**** index str=>%s, map->ref=%d, map->type=%d\n"), str, map->ref, map->type); */ - n = xp_awk_map_putx (map->map, XP_STR_BUF(&idxstr), val, XP_NULL); + n = xp_awk_map_putx (map->map, str, val, XP_NULL); if (n < 0) { - xp_str_close (&idxstr); + xp_free (str); PANIC (run, XP_AWK_ENOMEM); } - xp_str_close (&idxstr); + xp_free (str); xp_awk_refupval (val); return val; } @@ -2700,7 +2658,7 @@ static xp_awk_val_t* __eval_indexed ( xp_awk_val_t* idx, *res; xp_awk_pair_t* pair; xp_awk_nde_t* tmp; - xp_str_t idxstr; + xp_char_t* str; /* TODO: should it be an error? should it return nil? */ if (map->type != XP_AWK_VAL_MAP) @@ -2710,59 +2668,14 @@ static xp_awk_val_t* __eval_indexed ( xp_assert (nde->idx != XP_NULL); - /* compose an array/hash index */ - if (xp_str_open (&idxstr, 256) == XP_NULL) PANIC (run, XP_AWK_ENOMEM); - - for (tmp = nde->idx; tmp != XP_NULL; tmp = tmp->next) - { - xp_char_t* str; - int errnum; - - idx = __eval_expression (run, tmp); - if (idx == XP_NULL) - { - xp_str_close (&idxstr); - return XP_NULL; - } - - xp_awk_refupval (idx); - - str = __val_to_str (idx, &errnum); - if (str == XP_NULL) - { - xp_awk_refdownval (run, idx); - xp_str_close (&idxstr); - PANIC (run, errnum); - } - - xp_awk_refdownval (run, idx); - -/* TODO: configurable index seperator */ - if (XP_STR_LEN(&idxstr) > 0 && - xp_str_cat (&idxstr, XP_TEXT(",")) == (xp_size_t)-1) - { - xp_free (str); - xp_str_close (&idxstr); - PANIC (run, XP_AWK_ENOMEM); - } - - if (xp_str_cat (&idxstr, str) == (xp_size_t)-1) - { - xp_free (str); - xp_str_close (&idxstr); - PANIC (run, XP_AWK_ENOMEM); - } - - xp_free (str); - } + str = __idxnde_to_str (run, nde->idx); + if (str == XP_NULL) return XP_NULL; /* TODO: check this out........ */ - pair = xp_awk_map_get ( - ((xp_awk_val_map_t*)map)->map, XP_STR_BUF(&idxstr)); + pair = xp_awk_map_get (((xp_awk_val_map_t*)map)->map, str); res = (pair == XP_NULL)? xp_awk_val_nil: (xp_awk_val_t*)pair->val; - xp_str_close (&idxstr); - + xp_free (str); return res; } @@ -2983,3 +2896,88 @@ static xp_char_t* __val_to_str (xp_awk_val_t* v, int* errnum) *errnum = XP_AWK_EWRONGINDEX; return XP_NULL; } + +static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde) +{ + xp_char_t* str; + xp_awk_val_t* idx; + int errnum; + + xp_assert (nde != XP_NULL); + + if (nde->next == XP_NULL) + { + /* single node index */ + + idx = __eval_expression (run, nde); + if (idx == XP_NULL) return XP_NULL; + + xp_awk_refupval (idx); + + str = __val_to_str (idx, &errnum); + if (str == XP_NULL) + { + xp_awk_refdownval (run, idx); + PANIC (run, errnum); + } + + xp_awk_refdownval (run, idx); + } + else + { + /* multidimensional index */ + xp_str_t idxstr; + + if (xp_str_open (&idxstr, 256) == XP_NULL) + { + PANIC (run, XP_AWK_ENOMEM); + } + + while (nde != XP_NULL) + { + idx = __eval_expression (run, nde); + if (idx == XP_NULL) + { + xp_str_close (&idxstr); + return XP_NULL; + } + + xp_awk_refupval (idx); + + str = __val_to_str (idx, &errnum); + if (str == XP_NULL) + { + xp_awk_refdownval (run, idx); + xp_str_close (&idxstr); + PANIC (run, errnum); + } + + xp_awk_refdownval (run, idx); + +/* TODO: configurable index seperator */ + if (XP_STR_LEN(&idxstr) > 0 && + xp_str_cat (&idxstr, XP_TEXT(",")) == (xp_size_t)-1) + { + xp_free (str); + xp_str_close (&idxstr); + PANIC (run, XP_AWK_ENOMEM); + } + + if (xp_str_cat (&idxstr, str) == (xp_size_t)-1) + { + xp_free (str); + xp_str_close (&idxstr); + PANIC (run, XP_AWK_ENOMEM); + } + + xp_free (str); + + nde = nde->next; + } + + str = XP_STR_BUF(&idxstr); + xp_str_forfeit (&idxstr); + } + + return str; +}