From 6a1b12bb44264604e54b5833efe4551877acd263 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 2 May 2006 15:43:11 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/parse.c | 4 +-- ase/awk/run.c | 83 ++++++++++++++++++++++++++++++++++++------------- ase/awk/tree.c | 10 +++--- 3 files changed, 69 insertions(+), 28 deletions(-) diff --git a/ase/awk/parse.c b/ase/awk/parse.c index d98cde2b..51f3e4a9 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.99 2006-05-02 15:06:01 bacon Exp $ + * $Id: parse.c,v 1.100 2006-05-02 15:43:10 bacon Exp $ */ #include @@ -1922,7 +1922,7 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name) } else { - tmp->next = last; + last->next = tmp; last = tmp; } } diff --git a/ase/awk/run.c b/ase/awk/run.c index 370b52db..c08c45cf 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.81 2006-05-02 15:06:01 bacon Exp $ + * $Id: run.c,v 1.82 2006-05-02 15:43:10 bacon Exp $ */ #include @@ -1086,7 +1086,7 @@ static xp_awk_val_t* __do_assignment_map ( { xp_awk_val_map_t* map; xp_awk_nde_t* nde; - xp_char_t* str; + xp_str_t idxstr; int n; xp_assert ( @@ -1161,16 +1161,18 @@ static xp_awk_val_t* __do_assignment_map ( } /* compose a map index */ - nde = var->idx; -/* TODO: while (nde != XP_NULL) -> multidimensional array 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) { - /* TODO: clearing previous idx values... */ + xp_str_close (&idxstr); return XP_NULL; } @@ -1180,24 +1182,41 @@ static xp_awk_val_t* __do_assignment_map ( if (str == XP_NULL) { xp_awk_refdownval (run, tmp); + xp_str_close (&idxstr); PANIC (run, errnum); } - xp_awk_refdownval (run, tmp); - /* TODO: nde = nde->next; */ + +/* 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); } /* 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, str, val, XP_NULL); + n = xp_awk_map_putx (map->map, XP_STR_BUF(&idxstr), val, XP_NULL); if (n < 0) { - xp_free (str); + xp_str_close (&idxstr); PANIC (run, XP_AWK_ENOMEM); } - xp_free (str); + xp_str_close (&idxstr); xp_awk_refupval (val); return val; } @@ -2681,7 +2700,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_char_t* str; + xp_str_t idxstr; /* TODO: should it be an error? should it return nil? */ if (map->type != XP_AWK_VAL_MAP) @@ -2691,15 +2710,20 @@ static xp_awk_val_t* __eval_indexed ( xp_assert (nde->idx != XP_NULL); - tmp = nde->idx; - /* TODO: multidimensional array - while (tmp != 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) return XP_NULL; + if (idx == XP_NULL) + { + xp_str_close (&idxstr); + return XP_NULL; + } xp_awk_refupval (idx); @@ -2707,20 +2731,37 @@ static xp_awk_val_t* __eval_indexed ( if (str == XP_NULL) { xp_awk_refdownval (run, idx); + xp_str_close (&idxstr); PANIC (run, errnum); } xp_awk_refdownval (run, idx); - /* TODO: - tmp = tmp->next; - */ + +/* 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); } /* TODO: check this out........ */ - pair = xp_awk_map_get (((xp_awk_val_map_t*)map)->map, str); + pair = xp_awk_map_get ( + ((xp_awk_val_map_t*)map)->map, XP_STR_BUF(&idxstr)); res = (pair == XP_NULL)? xp_awk_val_nil: (xp_awk_val_t*)pair->val; - xp_free (str); + xp_str_close (&idxstr); return res; } diff --git a/ase/awk/tree.c b/ase/awk/tree.c index ad800c92..c9f3fa2b 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c,v 1.45 2006-04-30 17:10:30 bacon Exp $ + * $Id: tree.c,v 1.46 2006-05-02 15:43:11 bacon Exp $ */ #include @@ -203,7 +203,7 @@ static int __print_expression (xp_awk_nde_t* nde) xp_printf (XP_TEXT("__arg%lu["), (unsigned long)((xp_awk_nde_var_t*)nde)->id.idxa); xp_assert (((xp_awk_nde_var_t*)nde)->idx != XP_NULL); - __print_expression (((xp_awk_nde_var_t*)nde)->idx); + __print_expression_list (((xp_awk_nde_var_t*)nde)->idx); xp_printf (XP_TEXT("]")); break; @@ -217,7 +217,7 @@ static int __print_expression (xp_awk_nde_t* nde) xp_assert (((xp_awk_nde_var_t*)nde)->id.idxa == (xp_size_t)-1); xp_printf (XP_TEXT("%s["), ((xp_awk_nde_var_t*)nde)->id.name); xp_assert (((xp_awk_nde_var_t*)nde)->idx != XP_NULL); - __print_expression (((xp_awk_nde_var_t*)nde)->idx); + __print_expression_list (((xp_awk_nde_var_t*)nde)->idx); xp_printf (XP_TEXT("]")); break; @@ -245,7 +245,7 @@ static int __print_expression (xp_awk_nde_t* nde) xp_printf (XP_TEXT("%s["), ((xp_awk_nde_var_t*)nde)->id.name); } xp_assert (((xp_awk_nde_var_t*)nde)->idx != XP_NULL); - __print_expression (((xp_awk_nde_var_t*)nde)->idx); + __print_expression_list (((xp_awk_nde_var_t*)nde)->idx); xp_printf (XP_TEXT("]")); break; @@ -273,7 +273,7 @@ static int __print_expression (xp_awk_nde_t* nde) xp_printf (XP_TEXT("%s["), ((xp_awk_nde_var_t*)nde)->id.name); } xp_assert (((xp_awk_nde_var_t*)nde)->idx != XP_NULL); - __print_expression (((xp_awk_nde_var_t*)nde)->idx); + __print_expression_list (((xp_awk_nde_var_t*)nde)->idx); xp_printf (XP_TEXT("]")); break;