*** empty log message ***
This commit is contained in:
parent
6a1b12bb44
commit
66869c87cf
198
ase/awk/run.c
198
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 <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -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 __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 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* __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) (
|
typedef xp_awk_val_t* (*binop_func_t) (
|
||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right);
|
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_val_map_t* map;
|
||||||
xp_awk_nde_t* nde;
|
xp_awk_nde_t* nde;
|
||||||
xp_str_t idxstr;
|
xp_char_t* str;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
xp_assert (
|
xp_assert (
|
||||||
@ -1160,63 +1161,20 @@ static xp_awk_val_t* __do_assignment_map (
|
|||||||
PANIC (run, XP_AWK_ENOTINDEXABLE);
|
PANIC (run, XP_AWK_ENOTINDEXABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compose a map index */
|
str = __idxnde_to_str (run, var->idx);
|
||||||
if (xp_str_open (&idxstr, 256) == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
|
if (str == XP_NULL) return XP_NULL;
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
xp_printf (XP_TEXT("**** index str=>%s, map->ref=%d, map->type=%d\n"), str, map->ref, map->type);
|
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)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
xp_str_close (&idxstr);
|
xp_free (str);
|
||||||
PANIC (run, XP_AWK_ENOMEM);
|
PANIC (run, XP_AWK_ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_str_close (&idxstr);
|
xp_free (str);
|
||||||
xp_awk_refupval (val);
|
xp_awk_refupval (val);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
@ -2700,7 +2658,7 @@ static xp_awk_val_t* __eval_indexed (
|
|||||||
xp_awk_val_t* idx, *res;
|
xp_awk_val_t* idx, *res;
|
||||||
xp_awk_pair_t* pair;
|
xp_awk_pair_t* pair;
|
||||||
xp_awk_nde_t* tmp;
|
xp_awk_nde_t* tmp;
|
||||||
xp_str_t idxstr;
|
xp_char_t* str;
|
||||||
|
|
||||||
/* TODO: should it be an error? should it return nil? */
|
/* TODO: should it be an error? should it return nil? */
|
||||||
if (map->type != XP_AWK_VAL_MAP)
|
if (map->type != XP_AWK_VAL_MAP)
|
||||||
@ -2710,59 +2668,14 @@ static xp_awk_val_t* __eval_indexed (
|
|||||||
|
|
||||||
xp_assert (nde->idx != XP_NULL);
|
xp_assert (nde->idx != XP_NULL);
|
||||||
|
|
||||||
/* compose an array/hash index */
|
str = __idxnde_to_str (run, nde->idx);
|
||||||
if (xp_str_open (&idxstr, 256) == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
|
if (str == XP_NULL) return XP_NULL;
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: check this out........ */
|
/* TODO: check this out........ */
|
||||||
pair = xp_awk_map_get (
|
pair = xp_awk_map_get (((xp_awk_val_map_t*)map)->map, str);
|
||||||
((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;
|
res = (pair == XP_NULL)? xp_awk_val_nil: (xp_awk_val_t*)pair->val;
|
||||||
|
|
||||||
xp_str_close (&idxstr);
|
xp_free (str);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2983,3 +2896,88 @@ static xp_char_t* __val_to_str (xp_awk_val_t* v, int* errnum)
|
|||||||
*errnum = XP_AWK_EWRONGINDEX;
|
*errnum = XP_AWK_EWRONGINDEX;
|
||||||
return XP_NULL;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user