*** empty log message ***

This commit is contained in:
hyung-hwan 2006-05-02 15:43:11 +00:00
parent b145e38f97
commit 6a1b12bb44
3 changed files with 69 additions and 28 deletions

View File

@ -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 <xp/awk/awk_i.h>
@ -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;
}
}

View File

@ -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 <xp/awk/awk_i.h>
@ -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;
}

View File

@ -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 <xp/awk/awk_i.h>
@ -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;