*** empty log message ***

This commit is contained in:
hyung-hwan 2006-08-03 05:05:48 +00:00
parent 160edf1c46
commit 4cf885ab9a
12 changed files with 281 additions and 212 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: extio.c,v 1.24 2006-08-02 11:26:10 bacon Exp $ * $Id: extio.c,v 1.25 2006-08-03 05:05:46 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -255,7 +255,8 @@ int xp_awk_writeextio (
} }
/* convert the value to string representation first */ /* convert the value to string representation first */
if (xp_awk_valtostr(v, errnum, &buf, XP_NULL) == XP_NULL) if (xp_awk_valtostr (
v, errnum, xp_true, &buf, XP_NULL) == XP_NULL)
{ {
xp_str_close (&buf); xp_str_close (&buf);
return -1; return -1;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: func.c,v 1.15 2006-08-02 11:26:11 bacon Exp $ * $Id: func.c,v 1.16 2006-08-03 05:05:47 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -27,12 +27,12 @@ static xp_awk_bfn_t __sys_bfn[] =
{ {
/* ensure that this matches XP_AWK_BNF_XXX in func.h */ /* ensure that this matches XP_AWK_BNF_XXX in func.h */
{ XP_T("close"), XP_AWK_EXTIO, 1, 1, __bfn_close }, { XP_T("close"), 5, XP_AWK_EXTIO, 1, 1, __bfn_close },
{ XP_T("system"), 0, 1, 1, __bfn_system }, { XP_T("system"), 6, 0, 1, 1, __bfn_system },
{ XP_T("sin"), 0, 1, 1, __bfn_sin }, { XP_T("sin"), 3, 0, 1, 1, __bfn_sin },
{ XP_NULL, 0, 0, 0, XP_NULL } { XP_NULL, 0, 0, 0, 0, XP_NULL }
}; };
xp_awk_bfn_t* xp_awk_addbfn ( xp_awk_bfn_t* xp_awk_addbfn (
@ -150,7 +150,8 @@ static int __bfn_close (void* run)
return -1; return -1;
} }
if (xp_awk_valtostr (a0, &errnum, &buf, XP_NULL) == XP_NULL) if (xp_awk_valtostr (
a0, &errnum, xp_true, &buf, XP_NULL) == XP_NULL)
{ {
xp_str_close (&buf); xp_str_close (&buf);
xp_awk_seterrnum (run, errnum); xp_awk_seterrnum (run, errnum);
@ -223,7 +224,7 @@ static int __bfn_system (void* run)
xp_assert (nargs == 1); xp_assert (nargs == 1);
cmd = xp_awk_valtostr ( cmd = xp_awk_valtostr (
xp_awk_getarg(run, 0), &errnum, XP_NULL, XP_NULL); xp_awk_getarg(run, 0), &errnum, xp_true, XP_NULL, XP_NULL);
if (cmd == XP_NULL) if (cmd == XP_NULL)
{ {
xp_awk_seterrnum (run, XP_AWK_ENOMEM); xp_awk_seterrnum (run, XP_AWK_ENOMEM);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: func.h,v 1.7 2006-07-17 04:17:40 bacon Exp $ * $Id: func.h,v 1.8 2006-08-03 05:05:47 bacon Exp $
*/ */
#ifndef _XP_AWK_FUNC_H_ #ifndef _XP_AWK_FUNC_H_
@ -14,6 +14,7 @@ typedef struct xp_awk_bfn_t xp_awk_bfn_t;
struct xp_awk_bfn_t struct xp_awk_bfn_t
{ {
const xp_char_t* name; const xp_char_t* name;
xp_size_t name_len;
int valid; /* the entry is valid when this option is set */ int valid; /* the entry is valid when this option is set */
xp_size_t min_args; xp_size_t min_args;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: map.c,v 1.20 2006-07-10 14:28:45 bacon Exp $ * $Id: map.c,v 1.21 2006-08-03 05:05:47 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -13,7 +13,7 @@
/* TODO: improve the entire map routines. /* TODO: improve the entire map routines.
support automatic bucket resizing and remaping, etc. */ support automatic bucket resizing and remaping, etc. */
static xp_size_t __hash (const xp_char_t* key); static xp_size_t __hash (const xp_char_t* key, xp_size_t key_len);
#define FREE_PAIR(map,pair) \ #define FREE_PAIR(map,pair) \
do { \ do { \
@ -81,45 +81,52 @@ void xp_awk_map_clear (xp_awk_map_t* map)
xp_assert (map->size == 0); xp_assert (map->size == 0);
} }
xp_awk_pair_t* xp_awk_map_get (xp_awk_map_t* map, const xp_char_t* key) xp_awk_pair_t* xp_awk_map_get (
xp_awk_map_t* map, const xp_char_t* key, xp_size_t key_len)
{ {
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
xp_size_t hc; xp_size_t hc;
hc = __hash(key) % map->capa; hc = __hash(key,key_len) % map->capa;
pair = map->buck[hc]; pair = map->buck[hc];
while (pair != XP_NULL) while (pair != XP_NULL)
{ {
if (xp_strcmp(pair->key,key) == 0) return pair;
if (xp_strxncmp (
pair->key, pair->key_len,
key, key_len) == 0) return pair;
pair = pair->next; pair = pair->next;
} }
return XP_NULL; return XP_NULL;
} }
xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* val) xp_awk_pair_t* xp_awk_map_put (
xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len, void* val)
{ {
int n; int n;
xp_awk_pair_t* px; xp_awk_pair_t* px;
n = xp_awk_map_putx (map, key, val, &px); n = xp_awk_map_putx (map, key, key_len, val, &px);
if (n < 0) return XP_NULL; if (n < 0) return XP_NULL;
return px; return px;
} }
int xp_awk_map_putx ( int xp_awk_map_putx (
xp_awk_map_t* map, xp_char_t* key, void* val, xp_awk_pair_t** px) xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len,
void* val, xp_awk_pair_t** px)
{ {
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
xp_size_t hc; xp_size_t hc;
hc = __hash(key) % map->capa; hc = __hash(key,key_len) % map->capa;
pair = map->buck[hc]; pair = map->buck[hc];
while (pair != XP_NULL) while (pair != XP_NULL)
{ {
if (xp_strcmp(pair->key,key) == 0) if (xp_strxncmp (pair->key, pair->key_len, key, key_len) == 0)
{ {
if (px != XP_NULL) if (px != XP_NULL)
*px = xp_awk_map_setpair (map, pair, val); *px = xp_awk_map_setpair (map, pair, val);
@ -134,13 +141,17 @@ int xp_awk_map_putx (
pair = (xp_awk_pair_t*) xp_malloc (xp_sizeof(xp_awk_pair_t)); pair = (xp_awk_pair_t*) xp_malloc (xp_sizeof(xp_awk_pair_t));
if (pair == XP_NULL) return -1; /* error */ if (pair == XP_NULL) return -1; /* error */
/*pair->key = key;*/ /*pair->key = key;*/
pair->key = xp_strdup (key); /* duplicate the key if it is new */
/* duplicate the key if it is new */
pair->key = xp_strxdup (key, key_len);
if (pair->key == XP_NULL) if (pair->key == XP_NULL)
{ {
xp_free (pair); xp_free (pair);
return -1; /* error */ return -1; /* error */
} }
pair->key_len = key_len;
pair->val = val; pair->val = val;
pair->next = map->buck[hc]; pair->next = map->buck[hc];
map->buck[hc] = pair; map->buck[hc] = pair;
@ -150,17 +161,18 @@ int xp_awk_map_putx (
return 1; /* new key added */ return 1; /* new key added */
} }
xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* val) xp_awk_pair_t* xp_awk_map_set (
xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len, void* val)
{ {
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
xp_size_t hc; xp_size_t hc;
hc = __hash(key) % map->capa; hc = __hash(key,key_len) % map->capa;
pair = map->buck[hc]; pair = map->buck[hc];
while (pair != XP_NULL) while (pair != XP_NULL)
{ {
if (xp_strcmp(pair->key,key) == 0) if (xp_strxncmp (pair->key, pair->key_len, key, key_len) == 0)
{ {
return xp_awk_map_setpair (map, pair, val); return xp_awk_map_setpair (map, pair, val);
} }
@ -171,11 +183,11 @@ xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* val)
} }
xp_awk_pair_t* xp_awk_map_getpair ( xp_awk_pair_t* xp_awk_map_getpair (
xp_awk_map_t* map, const xp_char_t* key, void** val) xp_awk_map_t* map, const xp_char_t* key, xp_size_t key_len, void** val)
{ {
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
pair = xp_awk_map_get (map, key); pair = xp_awk_map_get (map, key, key_len);
if (pair == XP_NULL) return XP_NULL; if (pair == XP_NULL) return XP_NULL;
*val = pair->val; *val = pair->val;
@ -198,18 +210,18 @@ xp_awk_pair_t* xp_awk_map_setpair (
return pair; return pair;
} }
int xp_awk_map_remove (xp_awk_map_t* map, xp_char_t* key) int xp_awk_map_remove (xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len)
{ {
xp_awk_pair_t* pair, * prev; xp_awk_pair_t* pair, * prev;
xp_size_t hc; xp_size_t hc;
hc = __hash(key) % map->capa; hc = __hash(key,key_len) % map->capa;
pair = map->buck[hc]; pair = map->buck[hc];
prev = XP_NULL; prev = XP_NULL;
while (pair != XP_NULL) while (pair != XP_NULL)
{ {
if (xp_strcmp(pair->key,key) == 0) if (xp_strxncmp (pair->key, pair->key_len, key, key_len) == 0)
{ {
if (prev == XP_NULL) if (prev == XP_NULL)
map->buck[hc] = pair->next; map->buck[hc] = pair->next;
@ -249,11 +261,12 @@ int xp_awk_map_walk (xp_awk_map_t* map,
return 0; return 0;
} }
static xp_size_t __hash (const xp_char_t* key) static xp_size_t __hash (const xp_char_t* key, xp_size_t key_len)
{ {
xp_size_t n = 0, i; xp_size_t n = 0, i;
const xp_char_t* end = key + key_len;
while (*key != XP_T('\0')) while (key < end)
{ {
xp_byte_t* bp = (xp_byte_t*)key; xp_byte_t* bp = (xp_byte_t*)key;
for (i = 0; i < xp_sizeof(*key); i++) n = n * 31 + *bp++; for (i = 0; i < xp_sizeof(*key); i++) n = n * 31 + *bp++;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: map.h,v 1.13 2006-07-10 14:28:45 bacon Exp $ * $Id: map.h,v 1.14 2006-08-03 05:05:47 bacon Exp $
*/ */
#ifndef _XP_AWK_MAP_H_ #ifndef _XP_AWK_MAP_H_
@ -15,6 +15,7 @@ typedef struct xp_awk_pair_t xp_awk_pair_t;
struct xp_awk_pair_t struct xp_awk_pair_t
{ {
xp_char_t* key; xp_char_t* key;
xp_size_t key_len;
void* val; void* val;
xp_awk_pair_t* next; xp_awk_pair_t* next;
}; };
@ -35,21 +36,32 @@ extern "C" {
xp_awk_map_t* xp_awk_map_open (xp_awk_map_t* map, xp_awk_map_t* xp_awk_map_open (xp_awk_map_t* map,
void* owner, xp_size_t capa, void(*freeval)(void*,void*)); void* owner, xp_size_t capa, void(*freeval)(void*,void*));
void xp_awk_map_close (xp_awk_map_t* map); void xp_awk_map_close (xp_awk_map_t* map);
void xp_awk_map_clear (xp_awk_map_t* map); void xp_awk_map_clear (xp_awk_map_t* map);
xp_awk_pair_t* xp_awk_map_get (xp_awk_map_t* map, const xp_char_t* key); xp_awk_pair_t* xp_awk_map_get (
xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* val); xp_awk_map_t* map, const xp_char_t* key, xp_size_t key_len);
int xp_awk_map_putx (xp_awk_map_t* map, xp_char_t* key, void* val, xp_awk_pair_t** px);
xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* val); xp_awk_pair_t* xp_awk_map_put (
xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len, void* val);
int xp_awk_map_putx (
xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len,
void* val, xp_awk_pair_t** px);
xp_awk_pair_t* xp_awk_map_set (
xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len, void* val);
xp_awk_pair_t* xp_awk_map_getpair ( xp_awk_pair_t* xp_awk_map_getpair (
xp_awk_map_t* map, const xp_char_t* key, void** val); xp_awk_map_t* map, const xp_char_t* key, xp_size_t key_len, void** val);
xp_awk_pair_t* xp_awk_map_setpair ( xp_awk_pair_t* xp_awk_map_setpair (
xp_awk_map_t* map, xp_awk_pair_t* pair, void* val); xp_awk_map_t* map, xp_awk_pair_t* pair, void* val);
int xp_awk_map_remove (xp_awk_map_t* map, xp_char_t* key); int xp_awk_map_remove (xp_awk_map_t* map, xp_char_t* key, xp_size_t key_len);
int xp_awk_map_walk (xp_awk_map_t* map, int xp_awk_map_walk (xp_awk_map_t* map,
int (*walker)(xp_awk_pair_t*,void*), void* arg); int (*walker)(xp_awk_pair_t*,void*), void* arg);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.150 2006-08-02 14:36:23 bacon Exp $ * $Id: parse.c,v 1.151 2006-08-03 05:05:47 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -125,13 +125,14 @@ struct __binmap_t
static xp_awk_t* __parse_progunit (xp_awk_t* awk); static xp_awk_t* __parse_progunit (xp_awk_t* awk);
static xp_awk_t* __collect_globals (xp_awk_t* awk); static xp_awk_t* __collect_globals (xp_awk_t* awk);
static xp_awk_t* __add_builtin_globals (xp_awk_t* awk); static xp_awk_t* __add_builtin_globals (xp_awk_t* awk);
static xp_awk_t* __add_global (xp_awk_t* awk, const xp_char_t* name); static xp_awk_t* __add_global (
xp_awk_t* awk, const xp_char_t* name, xp_size_t name_len);
static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals); static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals);
static xp_awk_nde_t* __parse_function (xp_awk_t* awk); static xp_awk_nde_t* __parse_function (xp_awk_t* awk);
static xp_awk_nde_t* __parse_begin (xp_awk_t* awk); static xp_awk_nde_t* __parse_begin (xp_awk_t* awk);
static xp_awk_nde_t* __parse_end (xp_awk_t* awk); static xp_awk_nde_t* __parse_end (xp_awk_t* awk);
static xp_awk_nde_t* __parse_ptnblock (xp_awk_t* awk, xp_awk_nde_t* ptn); static xp_awk_nde_t* __parse_pattern_block (xp_awk_t* awk, xp_awk_nde_t* ptn);
static xp_awk_nde_t* __parse_action (xp_awk_t* awk); static xp_awk_nde_t* __parse_action (xp_awk_t* awk);
static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top); static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top);
@ -165,9 +166,10 @@ static xp_awk_nde_t* __parse_increment (xp_awk_t* awk);
static xp_awk_nde_t* __parse_primary (xp_awk_t* awk); static xp_awk_nde_t* __parse_primary (xp_awk_t* awk);
static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk); static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk);
static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name); static xp_awk_nde_t* __parse_hashidx (
xp_awk_t* awk, xp_char_t* name, xp_size_t name_len);
static xp_awk_nde_t* __parse_fncall ( static xp_awk_nde_t* __parse_fncall (
xp_awk_t* awk, xp_char_t* name, xp_awk_bfn_t* bfn); xp_awk_t* awk, xp_char_t* name, xp_size_t name_len, xp_awk_bfn_t* bfn);
static xp_awk_nde_t* __parse_if (xp_awk_t* awk); static xp_awk_nde_t* __parse_if (xp_awk_t* awk);
static xp_awk_nde_t* __parse_while (xp_awk_t* awk); static xp_awk_nde_t* __parse_while (xp_awk_t* awk);
static xp_awk_nde_t* __parse_for (xp_awk_t* awk); static xp_awk_nde_t* __parse_for (xp_awk_t* awk);
@ -245,33 +247,34 @@ static struct __kwent __kwtab[] =
struct __bvent struct __bvent
{ {
const xp_char_t* name; const xp_char_t* name;
xp_size_t name_len;
int valid; int valid;
}; };
static struct __bvent __bvtab[] = static struct __bvent __bvtab[] =
{ {
{ XP_T("ARGC"), 0 }, { XP_T("ARGC"), 4, 0 },
{ XP_T("ARGIND"), 0 }, { XP_T("ARGIND"), 6, 0 },
{ XP_T("ARGV"), 0 }, { XP_T("ARGV"), 4, 0 },
{ XP_T("CONVFMT"), 0 }, { XP_T("CONVFMT"), 7, 0 },
{ XP_T("FIELDWIDTHS"), 0 }, { XP_T("FIELDWIDTHS"), 11, 0 },
{ XP_T("ENVIRON"), 0 }, { XP_T("ENVIRON"), 7, 0 },
{ XP_T("ERRNO"), 0 }, { XP_T("ERRNO"), 5, 0 },
{ XP_T("FILENAME"), 0 }, { XP_T("FILENAME"), 8, 0 },
{ XP_T("FNR"), 0 }, { XP_T("FNR"), 3, 0 },
{ XP_T("FS"), 0 }, { XP_T("FS"), 2, 0 },
{ XP_T("IGNORECASE"), 0 }, { XP_T("IGNORECASE"), 10, 0 },
{ XP_T("NF"), 0 }, { XP_T("NF"), 2, 0 },
{ XP_T("NR"), 0 }, { XP_T("NR"), 2, 0 },
{ XP_T("OFMT"), 0 }, { XP_T("OFMT"), 4, 0 },
{ XP_T("OFS"), 0 }, { XP_T("OFS"), 3, 0 },
{ XP_T("ORS"), 0 }, { XP_T("ORS"), 3, 0 },
{ XP_T("RS"), 0 }, { XP_T("RS"), 2, 0 },
{ XP_T("RT"), 0 }, { XP_T("RT"), 2, 0 },
{ XP_T("RSTART"), 0 }, { XP_T("RSTART"), 6, 0 },
{ XP_T("RLENGTH"), 0 }, { XP_T("RLENGTH"), 7, 0 },
{ XP_T("SUBSEP"), 0 }, { XP_T("SUBSEP"), 6, 0 },
{ XP_NULL, 0 } { XP_NULL, 0, 0 }
}; };
#define GET_CHAR(awk) \ #define GET_CHAR(awk) \
@ -470,7 +473,8 @@ static xp_awk_t* __parse_progunit (xp_awk_t* awk)
{ {
/* pattern less block */ /* pattern less block */
awk->parse.id.block = PARSE_BLOCK_PATTERN; awk->parse.id.block = PARSE_BLOCK_PATTERN;
if (__parse_ptnblock(awk,XP_NULL) == XP_NULL) return XP_NULL; if (__parse_pattern_block (
awk, XP_NULL) == XP_NULL) return XP_NULL;
} }
else else
{ {
@ -510,7 +514,7 @@ static xp_awk_t* __parse_progunit (xp_awk_t* awk)
if (MATCH(awk,TOKEN_LBRACE)) if (MATCH(awk,TOKEN_LBRACE))
{ {
if (__parse_ptnblock (awk,ptn) == XP_NULL) if (__parse_pattern_block (awk,ptn) == XP_NULL)
{ {
xp_awk_clrpt (ptn); xp_awk_clrpt (ptn);
return XP_NULL; return XP_NULL;
@ -533,6 +537,7 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk)
{ {
xp_char_t* name; xp_char_t* name;
xp_char_t* name_dup; xp_char_t* name_dup;
xp_size_t name_len;
xp_awk_nde_t* body; xp_awk_nde_t* body;
xp_awk_afn_t* afn; xp_awk_afn_t* afn;
xp_size_t nargs; xp_size_t nargs;
@ -550,7 +555,8 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk)
} }
name = XP_STR_BUF(&awk->token.name); name = XP_STR_BUF(&awk->token.name);
if (xp_awk_map_get(&awk->tree.afns, name) != XP_NULL) name_len = XP_STR_LEN(&awk->token.name);
if (xp_awk_map_get(&awk->tree.afns, name, name_len) != XP_NULL)
{ {
/* the function is defined previously */ /* the function is defined previously */
PANIC (awk, XP_AWK_EDUPFUNC); PANIC (awk, XP_AWK_EDUPFUNC);
@ -566,7 +572,7 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk)
} }
/* clone the function name before it is overwritten */ /* clone the function name before it is overwritten */
name_dup = xp_strdup (name); name_dup = xp_strxdup (name, name_len);
if (name_dup == XP_NULL) PANIC (awk, XP_AWK_ENOMEM); if (name_dup == XP_NULL) PANIC (awk, XP_AWK_ENOMEM);
/* get the next token */ /* get the next token */
@ -609,6 +615,7 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk)
while (1) while (1)
{ {
xp_char_t* param; xp_char_t* param;
xp_size_t param_len;
if (!MATCH(awk,TOKEN_IDENT)) if (!MATCH(awk,TOKEN_IDENT))
{ {
@ -618,12 +625,13 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk)
} }
param = XP_STR_BUF(&awk->token.name); param = XP_STR_BUF(&awk->token.name);
param_len = XP_STR_LEN(&awk->token.name);
if (awk->opt.parse & XP_AWK_UNIQUE) if (awk->opt.parse & XP_AWK_UNIQUE)
{ {
/* check if a parameter conflicts with a function */ /* check if a parameter conflicts with a function */
if (xp_strcmp(name_dup, param) == 0 || if (xp_strxncmp(name_dup, name_len, param, param_len) == 0 ||
xp_awk_map_get(&awk->tree.afns, param) != XP_NULL) xp_awk_map_get(&awk->tree.afns, param, param_len) != XP_NULL)
{ {
xp_free (name_dup); xp_free (name_dup);
xp_awk_tab_clear (&awk->parse.params); xp_awk_tab_clear (&awk->parse.params);
@ -726,7 +734,7 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk)
afn->nargs = nargs; afn->nargs = nargs;
afn->body = body; afn->body = body;
n = xp_awk_map_putx (&awk->tree.afns, name_dup, afn, &pair); n = xp_awk_map_putx (&awk->tree.afns, name_dup, name_len, afn, &pair);
if (n < 0) if (n < 0)
{ {
xp_free (name_dup); xp_free (name_dup);
@ -772,7 +780,7 @@ static xp_awk_nde_t* __parse_end (xp_awk_t* awk)
return nde; return nde;
} }
static xp_awk_nde_t* __parse_ptnblock (xp_awk_t* awk, xp_awk_nde_t* ptn) static xp_awk_nde_t* __parse_pattern_block (xp_awk_t* awk, xp_awk_nde_t* ptn)
{ {
xp_awk_nde_t* nde; xp_awk_nde_t* nde;
xp_awk_chain_t* chain; xp_awk_chain_t* chain;
@ -942,19 +950,21 @@ static xp_awk_t* __add_builtin_globals (xp_awk_t* awk)
while (p->name != XP_NULL) while (p->name != XP_NULL)
{ {
if (__add_global (awk, p->name) == XP_NULL) return XP_NULL; if (__add_global (awk,
p->name, p->name_len) == XP_NULL) return XP_NULL;
p++; p++;
} }
return awk; return awk;
} }
static xp_awk_t* __add_global (xp_awk_t* awk, const xp_char_t* name) static xp_awk_t* __add_global (
xp_awk_t* awk, const xp_char_t* name, xp_size_t len)
{ {
if (awk->opt.parse & XP_AWK_UNIQUE) if (awk->opt.parse & XP_AWK_UNIQUE)
{ {
/* check if it conflict with a function name */ /* check if it conflict with a function name */
if (xp_awk_map_get(&awk->tree.afns, name) != XP_NULL) if (xp_awk_map_get(&awk->tree.afns, name, len) != XP_NULL)
{ {
PANIC (awk, XP_AWK_EDUPNAME); PANIC (awk, XP_AWK_EDUPNAME);
} }
@ -976,8 +986,6 @@ static xp_awk_t* __add_global (xp_awk_t* awk, const xp_char_t* name)
static xp_awk_t* __collect_globals (xp_awk_t* awk) static xp_awk_t* __collect_globals (xp_awk_t* awk)
{ {
xp_char_t* global;
while (1) while (1)
{ {
if (!MATCH(awk,TOKEN_IDENT)) if (!MATCH(awk,TOKEN_IDENT))
@ -985,9 +993,9 @@ static xp_awk_t* __collect_globals (xp_awk_t* awk)
PANIC (awk, XP_AWK_EIDENT); PANIC (awk, XP_AWK_EIDENT);
} }
global = XP_STR_BUF(&awk->token.name); if (__add_global (awk,
XP_STR_BUF(&awk->token.name),
if (__add_global (awk, global) == XP_NULL) return XP_NULL; XP_STR_LEN(&awk->token.name)) == XP_NULL) return XP_NULL;
if (__get_token(awk) == -1) return XP_NULL; if (__get_token(awk) == -1) return XP_NULL;
@ -1010,6 +1018,7 @@ static xp_awk_t* __collect_globals (xp_awk_t* awk)
static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals) static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals)
{ {
xp_char_t* local; xp_char_t* local;
xp_size_t local_len;
while (1) while (1)
{ {
@ -1019,13 +1028,15 @@ static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals)
} }
local = XP_STR_BUF(&awk->token.name); local = XP_STR_BUF(&awk->token.name);
local_len = XP_STR_LEN(&awk->token.name);
/* NOTE: it is not checked againt globals names */ /* NOTE: it is not checked againt globals names */
if (awk->opt.parse & XP_AWK_UNIQUE) if (awk->opt.parse & XP_AWK_UNIQUE)
{ {
/* check if it conflict with a function name */ /* check if it conflict with a function name */
if (xp_awk_map_get(&awk->tree.afns, local) != XP_NULL) if (xp_awk_map_get (
&awk->tree.afns, local, local_len) != XP_NULL)
{ {
PANIC (awk, XP_AWK_EDUPNAME); PANIC (awk, XP_AWK_EDUPNAME);
} }
@ -2166,12 +2177,15 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk)
static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk) static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
{ {
xp_char_t* name_dup; xp_char_t* name_dup;
xp_size_t name_len;
xp_awk_bfn_t* bfn; xp_awk_bfn_t* bfn;
xp_assert (MATCH(awk,TOKEN_IDENT)); xp_assert (MATCH(awk,TOKEN_IDENT));
name_dup = (xp_char_t*)xp_strdup(XP_STR_BUF(&awk->token.name)); name_dup = xp_strxdup (
XP_STR_BUF(&awk->token.name), XP_STR_LEN(&awk->token.name));
if (name_dup == XP_NULL) PANIC (awk, XP_AWK_ENOMEM); if (name_dup == XP_NULL) PANIC (awk, XP_AWK_ENOMEM);
name_len = XP_STR_LEN(&awk->token.name);
if (__get_token(awk) == -1) if (__get_token(awk) == -1)
{ {
@ -2193,7 +2207,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
PANIC (awk, XP_AWK_ELPAREN); PANIC (awk, XP_AWK_ELPAREN);
} }
nde = __parse_fncall (awk, XP_NULL, bfn); nde = __parse_fncall (awk, XP_NULL, 0, bfn);
return (xp_awk_nde_t*)nde; return (xp_awk_nde_t*)nde;
} }
@ -2201,7 +2215,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
if (MATCH(awk,TOKEN_LBRACK)) if (MATCH(awk,TOKEN_LBRACK))
{ {
xp_awk_nde_t* nde; xp_awk_nde_t* nde;
nde = __parse_hashidx (awk, name_dup); nde = __parse_hashidx (awk, name_dup, name_len);
if (nde == XP_NULL) xp_free (name_dup); if (nde == XP_NULL) xp_free (name_dup);
return (xp_awk_nde_t*)nde; return (xp_awk_nde_t*)nde;
} }
@ -2209,7 +2223,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
{ {
/* function call */ /* function call */
xp_awk_nde_t* nde; xp_awk_nde_t* nde;
nde = __parse_fncall (awk, name_dup, XP_NULL); nde = __parse_fncall (awk, name_dup, name_len, XP_NULL);
if (nde == XP_NULL) xp_free (name_dup); if (nde == XP_NULL) xp_free (name_dup);
return (xp_awk_nde_t*)nde; return (xp_awk_nde_t*)nde;
} }
@ -2235,6 +2249,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
nde->next = XP_NULL; nde->next = XP_NULL;
/*nde->id.name = XP_NULL;*/ /*nde->id.name = XP_NULL;*/
nde->id.name = name_dup; nde->id.name = name_dup;
nde->id.name_len = name_len;
nde->id.idxa = idxa; nde->id.idxa = idxa;
nde->idx = XP_NULL; nde->idx = XP_NULL;
@ -2249,6 +2264,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
nde->next = XP_NULL; nde->next = XP_NULL;
/*nde->id.name = XP_NULL;*/ /*nde->id.name = XP_NULL;*/
nde->id.name = name_dup; nde->id.name = name_dup;
nde->id.name_len = name_len;
nde->id.idxa = idxa; nde->id.idxa = idxa;
nde->idx = XP_NULL; nde->idx = XP_NULL;
@ -2263,6 +2279,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
nde->next = XP_NULL; nde->next = XP_NULL;
/*nde->id.name = XP_NULL;*/ /*nde->id.name = XP_NULL;*/
nde->id.name = name_dup; nde->id.name = name_dup;
nde->id.name_len = name_len;
nde->id.idxa = idxa; nde->id.idxa = idxa;
nde->idx = XP_NULL; nde->idx = XP_NULL;
@ -2274,6 +2291,7 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
nde->type = XP_AWK_NDE_NAMED; nde->type = XP_AWK_NDE_NAMED;
nde->next = XP_NULL; nde->next = XP_NULL;
nde->id.name = name_dup; nde->id.name = name_dup;
nde->id.name_len = name_len;
nde->id.idxa = (xp_size_t)-1; nde->id.idxa = (xp_size_t)-1;
nde->idx = XP_NULL; nde->idx = XP_NULL;
@ -2287,7 +2305,8 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk)
} }
} }
static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name) static xp_awk_nde_t* __parse_hashidx (
xp_awk_t* awk, xp_char_t* name, xp_size_t name_len)
{ {
xp_awk_nde_t* idx, * tmp, * last; xp_awk_nde_t* idx, * tmp, * last;
xp_awk_nde_var_t* nde; xp_awk_nde_var_t* nde;
@ -2353,6 +2372,7 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name)
nde->next = XP_NULL; nde->next = XP_NULL;
/*nde->id.name = XP_NULL; */ /*nde->id.name = XP_NULL; */
nde->id.name = name; nde->id.name = name;
nde->id.name_len = name_len;
nde->id.idxa = idxa; nde->id.idxa = idxa;
nde->idx = idx; nde->idx = idx;
@ -2367,6 +2387,7 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name)
nde->next = XP_NULL; nde->next = XP_NULL;
/*nde->id.name = XP_NULL; */ /*nde->id.name = XP_NULL; */
nde->id.name = name; nde->id.name = name;
nde->id.name_len = name_len;
nde->id.idxa = idxa; nde->id.idxa = idxa;
nde->idx = idx; nde->idx = idx;
@ -2381,6 +2402,7 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name)
nde->next = XP_NULL; nde->next = XP_NULL;
/*nde->id.name = XP_NULL;*/ /*nde->id.name = XP_NULL;*/
nde->id.name = name; nde->id.name = name;
nde->id.name_len = name_len;
nde->id.idxa = idxa; nde->id.idxa = idxa;
nde->idx = idx; nde->idx = idx;
@ -2392,6 +2414,7 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name)
nde->type = XP_AWK_NDE_NAMEDIDX; nde->type = XP_AWK_NDE_NAMEDIDX;
nde->next = XP_NULL; nde->next = XP_NULL;
nde->id.name = name; nde->id.name = name;
nde->id.name_len = name_len;
nde->id.idxa = (xp_size_t)-1; nde->id.idxa = (xp_size_t)-1;
nde->idx = idx; nde->idx = idx;
@ -2405,7 +2428,7 @@ static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name)
} }
static xp_awk_nde_t* __parse_fncall ( static xp_awk_nde_t* __parse_fncall (
xp_awk_t* awk, xp_char_t* name, xp_awk_bfn_t* bfn) xp_awk_t* awk, xp_char_t* name, xp_size_t name_len, xp_awk_bfn_t* bfn)
{ {
xp_awk_nde_t* head, * curr, * nde; xp_awk_nde_t* head, * curr, * nde;
xp_awk_nde_call_t* call; xp_awk_nde_call_t* call;
@ -2477,6 +2500,7 @@ static xp_awk_nde_t* __parse_fncall (
/*call->what.bfn = bfn; */ /*call->what.bfn = bfn; */
call->what.bfn.name = bfn->name; call->what.bfn.name = bfn->name;
call->what.bfn.name_len = bfn->name_len;
call->what.bfn.min_args = bfn->min_args; call->what.bfn.min_args = bfn->min_args;
call->what.bfn.max_args = bfn->max_args; call->what.bfn.max_args = bfn->max_args;
call->what.bfn.handler = bfn->handler; call->what.bfn.handler = bfn->handler;
@ -2488,7 +2512,8 @@ static xp_awk_nde_t* __parse_fncall (
{ {
call->type = XP_AWK_NDE_AFN; call->type = XP_AWK_NDE_AFN;
call->next = XP_NULL; call->next = XP_NULL;
call->what.name = name; call->what.afn.name = name;
call->what.afn.name_len = name_len;
call->args = head; call->args = head;
call->nargs = nargs; call->nargs = nargs;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.156 2006-08-02 14:36:23 bacon Exp $ * $Id: run.c,v 1.157 2006-08-03 05:05:47 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -173,7 +173,8 @@ static void __clear_record (xp_awk_run_t* run, xp_bool_t noline);
static int __recomp_record_fields (xp_awk_run_t* run, static int __recomp_record_fields (xp_awk_run_t* run,
xp_size_t lv, xp_char_t* str, xp_size_t len, int* errnum); xp_size_t lv, xp_char_t* str, xp_size_t len, int* errnum);
static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_char_t* __idxnde_to_str (
xp_awk_run_t* run, xp_awk_nde_t* nde, xp_size_t* len);
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);
@ -384,24 +385,17 @@ static int __run_main (xp_awk_run_t* run)
if (run->opt & XP_AWK_RUNMAIN) if (run->opt & XP_AWK_RUNMAIN)
{ {
/* TODO: should the main function be user-specifiable? */ /* TODO: should the main function be user-specifiable? */
static xp_char_t m_a_i_n[] = xp_awk_nde_call_t nde;
{
XP_T('m'),
XP_T('a'),
XP_T('i'),
XP_T('n'),
XP_T('\0')
};
static xp_awk_nde_call_t nde =
{
XP_AWK_NDE_AFN, /* type */
XP_NULL, /* next */
m_a_i_n, /* name */
XP_NULL /* args */
};
run->exit_level = EXIT_NONE; run->exit_level = EXIT_NONE;
nde.type = XP_AWK_NDE_AFN;
nde.next = XP_NULL;
nde.what.afn.name = XP_T("main");
nde.what.afn.name_len = 4;
nde.args = XP_NULL;
nde.nargs = 0;
v = __eval_afn (run, (xp_awk_nde_t*)&nde); v = __eval_afn (run, (xp_awk_nde_t*)&nde);
if (v == XP_NULL) n = -1; if (v == XP_NULL) n = -1;
else else
@ -1247,7 +1241,8 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
(var->type == XP_AWK_NDE_NAMEDIDX && (var->type == XP_AWK_NDE_NAMEDIDX &&
var->idx != XP_NULL)); var->idx != XP_NULL));
pair = xp_awk_map_get (&run->named, var->id.name); pair = xp_awk_map_get (
&run->named, var->id.name, var->id.name_len);
if (pair == XP_NULL) if (pair == XP_NULL)
{ {
xp_awk_val_t* tmp; xp_awk_val_t* tmp;
@ -1258,7 +1253,8 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
tmp = xp_awk_makemapval (run); tmp = xp_awk_makemapval (run);
if (tmp == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM); if (tmp == XP_NULL) PANIC_I (run, XP_AWK_ENOMEM);
if (xp_awk_map_put (&run->named, var->id.name, tmp) == XP_NULL) if (xp_awk_map_put (&run->named,
var->id.name, var->id.name_len, tmp) == XP_NULL)
{ {
xp_awk_refupval (tmp); xp_awk_refupval (tmp);
xp_awk_refdownval (run, tmp); xp_awk_refdownval (run, tmp);
@ -1282,6 +1278,7 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
if (var->type == XP_AWK_NDE_NAMEDIDX) if (var->type == XP_AWK_NDE_NAMEDIDX)
{ {
xp_char_t* key; xp_char_t* key;
xp_size_t key_len;
xp_awk_val_t* idx; xp_awk_val_t* idx;
int errnum; int errnum;
@ -1291,13 +1288,13 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
if (idx == XP_NULL) return -1; if (idx == XP_NULL) return -1;
xp_awk_refupval (idx); xp_awk_refupval (idx);
key = xp_awk_valtostr ( key = xp_awk_valtostr (idx,
idx, &errnum, XP_NULL, XP_NULL); &errnum, xp_true, XP_NULL, &key_len);
xp_awk_refdownval (run, idx); xp_awk_refdownval (run, idx);
if (key == XP_NULL) PANIC_I (run, errnum); if (key == XP_NULL) PANIC_I (run, errnum);
xp_awk_map_remove (map, key); xp_awk_map_remove (map, key, key_len);
xp_free (key); xp_free (key);
} }
else else
@ -1360,6 +1357,7 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
var->type == XP_AWK_NDE_ARGIDX) var->type == XP_AWK_NDE_ARGIDX)
{ {
xp_char_t* key; xp_char_t* key;
xp_size_t key_len;
xp_awk_val_t* idx; xp_awk_val_t* idx;
int errnum; int errnum;
@ -1369,13 +1367,13 @@ static int __run_delete (xp_awk_run_t* run, xp_awk_nde_delete_t* nde)
if (idx == XP_NULL) return -1; if (idx == XP_NULL) return -1;
xp_awk_refupval (idx); xp_awk_refupval (idx);
key = xp_awk_valtostr ( key = xp_awk_valtostr (idx,
idx, &errnum, XP_NULL, XP_NULL); &errnum, xp_true, XP_NULL, &key_len);
xp_awk_refdownval (run, idx); xp_awk_refdownval (run, idx);
if (key == XP_NULL) PANIC_I (run, errnum); if (key == XP_NULL) PANIC_I (run, errnum);
xp_awk_map_remove (map, key); xp_awk_map_remove (map, key, key_len);
xp_free (key); xp_free (key);
} }
else else
@ -1417,7 +1415,7 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde)
if (v == XP_NULL) return -1; if (v == XP_NULL) return -1;
xp_awk_refupval (v); xp_awk_refupval (v);
out = xp_awk_valtostr (v, &errnum, XP_NULL, &len); out = xp_awk_valtostr (v, &errnum, xp_true, XP_NULL, &len);
if (out == XP_NULL) if (out == XP_NULL)
{ {
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
@ -1733,7 +1731,8 @@ static xp_awk_val_t* __do_assignment_scalar (
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
int n; int n;
pair = xp_awk_map_get (&run->named, var->id.name); pair = xp_awk_map_get (
&run->named, var->id.name, var->id.name_len);
if (pair != XP_NULL && if (pair != XP_NULL &&
((xp_awk_val_t*)pair->val)->type == XP_AWK_VAL_MAP) ((xp_awk_val_t*)pair->val)->type == XP_AWK_VAL_MAP)
{ {
@ -1742,8 +1741,8 @@ static xp_awk_val_t* __do_assignment_scalar (
PANIC (run, XP_AWK_ENOTSCALARIZABLE); PANIC (run, XP_AWK_ENOTSCALARIZABLE);
} }
n = xp_awk_map_putx ( n = xp_awk_map_putx (&run->named,
&run->named, var->id.name, val, XP_NULL); var->id.name, var->id.name_len, val, XP_NULL);
if (n < 0) PANIC (run, XP_AWK_ENOMEM); if (n < 0) PANIC (run, XP_AWK_ENOMEM);
xp_awk_refupval (val); xp_awk_refupval (val);
@ -1800,6 +1799,7 @@ static xp_awk_val_t* __do_assignment_map (
{ {
xp_awk_val_map_t* map; xp_awk_val_map_t* map;
xp_char_t* str; xp_char_t* str;
xp_size_t len;
int n; int n;
xp_assert ( xp_assert (
@ -1812,7 +1812,8 @@ static xp_awk_val_t* __do_assignment_map (
if (var->type == XP_AWK_NDE_NAMEDIDX) if (var->type == XP_AWK_NDE_NAMEDIDX)
{ {
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
pair = xp_awk_map_get (&run->named, var->id.name); pair = xp_awk_map_get (
&run->named, var->id.name, var->id.name_len);
map = (pair == XP_NULL)? map = (pair == XP_NULL)?
(xp_awk_val_map_t*)xp_awk_val_nil: (xp_awk_val_map_t*)xp_awk_val_nil:
(xp_awk_val_map_t*)pair->val; (xp_awk_val_map_t*)pair->val;
@ -1839,8 +1840,8 @@ static xp_awk_val_t* __do_assignment_map (
/* doesn't have to decrease the reference count /* doesn't have to decrease the reference count
* of the previous value here as it is done by * of the previous value here as it is done by
* xp_awk_map_put */ * xp_awk_map_put */
if (xp_awk_map_put ( if (xp_awk_map_put (&run->named,
&run->named, var->id.name, tmp) == XP_NULL) var->id.name, var->id.name_len, tmp) == XP_NULL)
{ {
xp_awk_refupval (tmp); xp_awk_refupval (tmp);
xp_awk_refdownval (run, tmp); xp_awk_refdownval (run, tmp);
@ -1874,13 +1875,13 @@ static xp_awk_val_t* __do_assignment_map (
PANIC (run, XP_AWK_ENOTINDEXABLE); PANIC (run, XP_AWK_ENOTINDEXABLE);
} }
str = __idxnde_to_str (run, var->idx); str = __idxnde_to_str (run, var->idx, &len);
if (str == XP_NULL) return XP_NULL; if (str == XP_NULL) return XP_NULL;
/* /*
xp_printf (XP_T("**** index str=>%s, map->ref=%d, map->type=%d\n"), str, map->ref, map->type); xp_printf (XP_T("**** 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, str, len, val, XP_NULL);
if (n < 0) if (n < 0)
{ {
xp_free (str); xp_free (str);
@ -1915,7 +1916,7 @@ static xp_awk_val_t* __do_assignment_pos (
if (lv < 0) PANIC (run, XP_AWK_EPOSIDX); if (lv < 0) PANIC (run, XP_AWK_EPOSIDX);
/* convert the value to the string */ /* convert the value to the string */
str = xp_awk_valtostr (val, &errnum, XP_NULL, &len); str = xp_awk_valtostr (val, &errnum, xp_true, XP_NULL, &len);
if (str == XP_NULL) PANIC (run, errnum); if (str == XP_NULL) PANIC (run, errnum);
if (lv == 0) if (lv == 0)
@ -2181,6 +2182,7 @@ static xp_awk_val_t* __eval_binop_in (
{ {
xp_awk_val_t* rv, * res; xp_awk_val_t* rv, * res;
xp_char_t* str; xp_char_t* str;
xp_size_t len;
if (right->type != XP_AWK_NDE_GLOBAL && if (right->type != XP_AWK_NDE_GLOBAL &&
right->type != XP_AWK_NDE_LOCAL && right->type != XP_AWK_NDE_LOCAL &&
@ -2195,8 +2197,8 @@ static xp_awk_val_t* __eval_binop_in (
/* evaluate the left-hand side of the operator */ /* evaluate the left-hand side of the operator */
str = (left->type == XP_AWK_NDE_GRP)? str = (left->type == XP_AWK_NDE_GRP)?
__idxnde_to_str (run, ((xp_awk_nde_grp_t*)left)->body): __idxnde_to_str (run, ((xp_awk_nde_grp_t*)left)->body, &len):
__idxnde_to_str (run, left); __idxnde_to_str (run, left, &len);
if (str == XP_NULL) return XP_NULL; if (str == XP_NULL) return XP_NULL;
/* evaluate the right-hand side of the operator */ /* evaluate the right-hand side of the operator */
@ -2228,7 +2230,7 @@ static xp_awk_val_t* __eval_binop_in (
{ {
xp_long_t r; xp_long_t r;
r = xp_awk_map_get(((xp_awk_val_map_t*)rv)->map,str) != XP_NULL; r = (xp_long_t)(xp_awk_map_get(((xp_awk_val_map_t*)rv)->map,str,len) != XP_NULL);
res = xp_awk_makeintval (run, r); res = xp_awk_makeintval (run, r);
if (res == XP_NULL) if (res == XP_NULL)
@ -2244,7 +2246,8 @@ static xp_awk_val_t* __eval_binop_in (
} }
/* need an array */ /* need an array */
PANIC (run, XP_AWK_EOPERAND); /* TODO: change the error code to make it clearer */
PANIC (run, XP_AWK_EOPERAND);
return XP_NULL; return XP_NULL;
} }
@ -2856,47 +2859,31 @@ static xp_awk_val_t* __eval_binop_exp (
static xp_awk_val_t* __eval_binop_concat ( static xp_awk_val_t* __eval_binop_concat (
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)
{ {
xp_str_t lv, rv; xp_char_t* strl, * strr;
xp_size_t strl_len, strr_len;
xp_awk_val_t* res; xp_awk_val_t* res;
int errnum; int errnum;
if (xp_str_open (&lv, DEF_BUF_CAPA) == XP_NULL) strl = xp_awk_valtostr (left, &errnum, xp_true, XP_NULL, &strl_len);
{ if (strl == XP_NULL) PANIC (run, errnum);
PANIC (run, XP_AWK_ENOMEM);
}
if (xp_str_open (&rv, DEF_BUF_CAPA) == XP_NULL) strr = xp_awk_valtostr (right, &errnum, xp_true, XP_NULL, &strr_len);
if (strr == XP_NULL)
{ {
xp_str_close (&lv); xp_free (strl);
PANIC (run, XP_AWK_ENOMEM);
}
if (xp_awk_valtostr (left, &errnum, &lv, XP_NULL) == XP_NULL)
{
xp_str_close (&lv);
xp_str_close (&rv);
PANIC (run, errnum); PANIC (run, errnum);
} }
if (xp_awk_valtostr (right, &errnum, &rv, XP_NULL) == XP_NULL) res = xp_awk_makestrval2 (strl, strl_len, strr, strr_len);
{
xp_str_close (&lv);
xp_str_close (&rv);
PANIC (run, errnum);
}
res = xp_awk_makestrval2 (
XP_STR_BUF(&lv), XP_STR_LEN(&lv),
XP_STR_BUF(&rv), XP_STR_LEN(&rv));
if (res == XP_NULL) if (res == XP_NULL)
{ {
xp_str_close (&lv); xp_free (strl);
xp_str_close (&rv); xp_free (strr);
PANIC (run, XP_AWK_ENOMEM); PANIC (run, XP_AWK_ENOMEM);
} }
xp_str_close (&lv); xp_free (strl);
xp_str_close (&rv); xp_free (strr);
return res; return res;
} }
@ -2984,7 +2971,7 @@ static xp_awk_val_t* __eval_binop_match0 (
} }
else else
{ {
str = xp_awk_valtostr (right, &errnum, XP_NULL, &len); str = xp_awk_valtostr (right, &errnum, xp_true, XP_NULL, &len);
if (str == XP_NULL) PANIC (run, errnum); if (str == XP_NULL) PANIC (run, errnum);
rex_code = xp_awk_buildrex (str, len, &errnum); rex_code = xp_awk_buildrex (str, len, &errnum);
@ -3019,7 +3006,7 @@ static xp_awk_val_t* __eval_binop_match0 (
} }
else else
{ {
str = xp_awk_valtostr (right, &errnum, XP_NULL, &len); str = xp_awk_valtostr (right, &errnum, xp_true, XP_NULL, &len);
if (str == XP_NULL) if (str == XP_NULL)
{ {
if (right->type != XP_AWK_VAL_REX) xp_free (rex_code); if (right->type != XP_AWK_VAL_REX) xp_free (rex_code);
@ -3547,7 +3534,8 @@ static xp_awk_val_t* __eval_afn (xp_awk_run_t* run, xp_awk_nde_t* nde)
xp_awk_afn_t* afn; xp_awk_afn_t* afn;
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
pair = xp_awk_map_get (&run->awk->tree.afns, call->what.name); pair = xp_awk_map_get (&run->awk->tree.afns,
call->what.afn.name, call->what.afn.name_len);
if (pair == XP_NULL) PANIC (run, XP_AWK_ENOSUCHFUNC); if (pair == XP_NULL) PANIC (run, XP_AWK_ENOSUCHFUNC);
afn = (xp_awk_afn_t*)pair->val; afn = (xp_awk_afn_t*)pair->val;
@ -3827,7 +3815,7 @@ static xp_awk_val_t* __eval_named (xp_awk_run_t* run, xp_awk_nde_t* nde)
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde; xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde;
pair = xp_awk_map_get(&run->named,tgt->id.name); pair = xp_awk_map_get (&run->named, tgt->id.name, tgt->id.name_len);
return (pair == XP_NULL)? xp_awk_val_nil: pair->val; return (pair == XP_NULL)? xp_awk_val_nil: pair->val;
} }
@ -3855,6 +3843,7 @@ static xp_awk_val_t* __eval_indexed (
xp_awk_val_t* res; xp_awk_val_t* res;
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
xp_char_t* str; xp_char_t* str;
xp_size_t len;
/* 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)
@ -3864,11 +3853,11 @@ static xp_awk_val_t* __eval_indexed (
xp_assert (nde->idx != XP_NULL); xp_assert (nde->idx != XP_NULL);
str = __idxnde_to_str (run, nde->idx); str = __idxnde_to_str (run, nde->idx, &len);
if (str == XP_NULL) return XP_NULL; if (str == XP_NULL) return XP_NULL;
/* TODO: check this out........ */ /* 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, str, len);
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_free (str); xp_free (str);
@ -3880,7 +3869,7 @@ static xp_awk_val_t* __eval_namedidx (xp_awk_run_t* run, xp_awk_nde_t* nde)
xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde; xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde;
xp_awk_pair_t* pair; xp_awk_pair_t* pair;
pair = xp_awk_map_get (&run->named, tgt->id.name); pair = xp_awk_map_get (&run->named, tgt->id.name, tgt->id.name_len);
return __eval_indexed (run, tgt, return __eval_indexed (run, tgt,
(pair == XP_NULL)? xp_awk_val_nil: pair->val); (pair == XP_NULL)? xp_awk_val_nil: pair->val);
} }
@ -3959,7 +3948,7 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
* v->type == XP_AWK_VAL_STR, xp_awk_refdownval(v) * v->type == XP_AWK_VAL_STR, xp_awk_refdownval(v)
* should not be called immediately below */ * should not be called immediately below */
xp_awk_refupval (v); xp_awk_refupval (v);
in = xp_awk_valtostr (v, &errnum, XP_NULL, &len); in = xp_awk_valtostr (v, &errnum, xp_true, XP_NULL, &len);
if (in == XP_NULL) if (in == XP_NULL)
{ {
xp_awk_refdownval (run, v); xp_awk_refdownval (run, v);
@ -4292,7 +4281,8 @@ static int __recomp_record_fields (xp_awk_run_t* run,
v = STACK_GLOBAL(run, XP_AWK_GLOBAL_OFS); v = STACK_GLOBAL(run, XP_AWK_GLOBAL_OFS);
if (v != xp_awk_val_nil) if (v != xp_awk_val_nil)
{ {
ofsp = xp_awk_valtostr (v, errnum, XP_NULL, &ofs_len); ofsp = xp_awk_valtostr (
v, errnum, xp_true, XP_NULL, &ofs_len);
if (ofsp == XP_NULL) return -1; if (ofsp == XP_NULL) return -1;
ofs = ofsp; ofs = ofsp;
@ -4414,7 +4404,8 @@ static int __recomp_record_fields (xp_awk_run_t* run,
return 0; return 0;
} }
static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde) static xp_char_t* __idxnde_to_str (
xp_awk_run_t* run, xp_awk_nde_t* nde, xp_size_t* len)
{ {
xp_char_t* str; xp_char_t* str;
xp_awk_val_t* idx; xp_awk_val_t* idx;
@ -4430,7 +4421,7 @@ static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde)
xp_awk_refupval (idx); xp_awk_refupval (idx);
str = xp_awk_valtostr (idx, &errnum, XP_NULL, XP_NULL); str = xp_awk_valtostr (idx, &errnum, xp_true, XP_NULL, len);
if (str == XP_NULL) if (str == XP_NULL)
{ {
xp_awk_refdownval (run, idx); xp_awk_refdownval (run, idx);
@ -4469,8 +4460,8 @@ static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde)
PANIC (run, XP_AWK_ENOMEM); PANIC (run, XP_AWK_ENOMEM);
} }
if (xp_awk_valtostr (idx, if (xp_awk_valtostr (idx, &errnum,
&errnum, &idxstr, XP_NULL) == XP_NULL) xp_false, &idxstr, XP_NULL) == XP_NULL)
{ {
xp_awk_refdownval (run, idx); xp_awk_refdownval (run, idx);
xp_str_close (&idxstr); xp_str_close (&idxstr);
@ -4482,6 +4473,7 @@ static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde)
} }
str = XP_STR_BUF(&idxstr); str = XP_STR_BUF(&idxstr);
*len = XP_STR_LEN(&idxstr);
xp_str_forfeit (&idxstr); xp_str_forfeit (&idxstr);
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tab.c,v 1.8 2006-04-16 04:31:38 bacon Exp $ * $Id: tab.c,v 1.9 2006-08-03 05:05:47 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -95,13 +95,13 @@ void xp_awk_tab_clear (xp_awk_tab_t* tab)
xp_size_t xp_awk_tab_insert ( xp_size_t xp_awk_tab_insert (
xp_awk_tab_t* tab, xp_size_t index, const xp_char_t* value) xp_awk_tab_t* tab, xp_size_t index, const xp_char_t* str)
{ {
xp_size_t i; xp_size_t i;
xp_char_t* value_dup; xp_char_t* str_dup;
value_dup = xp_strdup(value); str_dup = xp_strdup(str);
if (value_dup == XP_NULL) return (xp_size_t)-1; if (str_dup == XP_NULL) return (xp_size_t)-1;
if (index >= tab->capa) if (index >= tab->capa)
{ {
@ -115,13 +115,13 @@ xp_size_t xp_awk_tab_insert (
if (xp_awk_tab_setcapa(tab,capa) == XP_NULL) if (xp_awk_tab_setcapa(tab,capa) == XP_NULL)
{ {
xp_free (value_dup); xp_free (str_dup);
return (xp_size_t)-1; return (xp_size_t)-1;
} }
} }
for (i = tab->size; i > index; i--) tab->buf[i] = tab->buf[i-1]; for (i = tab->size; i > index; i--) tab->buf[i] = tab->buf[i-1];
tab->buf[index] = value_dup; tab->buf[index] = str_dup;
if (index > tab->size) tab->size = index + 1; if (index > tab->size) tab->size = index + 1;
else tab->size++; else tab->size++;
@ -161,47 +161,50 @@ xp_size_t xp_awk_tab_remove (
return count; return count;
} }
xp_size_t xp_awk_tab_add (xp_awk_tab_t* tab, const xp_char_t* value) xp_size_t xp_awk_tab_add (xp_awk_tab_t* tab, const xp_char_t* str)
{ {
return xp_awk_tab_insert (tab, tab->size, value); return xp_awk_tab_insert (tab, tab->size, str);
} }
xp_size_t xp_awk_tab_find ( xp_size_t xp_awk_tab_find (
xp_awk_tab_t* tab, const xp_char_t* value, xp_size_t index) xp_awk_tab_t* tab, const xp_char_t* str, xp_size_t index)
{ {
xp_size_t i; xp_size_t i;
for (i = index; i < tab->size; i++) { for (i = index; i < tab->size; i++)
if (xp_strcmp(tab->buf[i], value) == 0) return i; {
if (xp_strcmp(tab->buf[i], str) == 0) return i;
} }
return (xp_size_t)-1; return (xp_size_t)-1;
} }
xp_size_t xp_awk_tab_rfind ( xp_size_t xp_awk_tab_rfind (
xp_awk_tab_t* tab, const xp_char_t* value, xp_size_t index) xp_awk_tab_t* tab, const xp_char_t* str, xp_size_t index)
{ {
xp_size_t i; xp_size_t i;
if (index >= tab->size) return (xp_size_t)-1; if (index >= tab->size) return (xp_size_t)-1;
for (i = index + 1; i-- > 0; ) { for (i = index + 1; i-- > 0; )
if (xp_strcmp(tab->buf[i], value) == 0) return i; {
if (xp_strcmp(tab->buf[i], str) == 0) return i;
} }
return (xp_size_t)-1; return (xp_size_t)-1;
} }
xp_size_t xp_awk_tab_rrfind ( xp_size_t xp_awk_tab_rrfind (
xp_awk_tab_t* tab, const xp_char_t* value, xp_size_t index) xp_awk_tab_t* tab, const xp_char_t* str, xp_size_t index)
{ {
xp_size_t i; xp_size_t i;
if (index >= tab->size) return (xp_size_t)-1; if (index >= tab->size) return (xp_size_t)-1;
for (i = tab->size - index; i-- > 0; ) { for (i = tab->size - index; i-- > 0; )
if (xp_strcmp(tab->buf[i], value) == 0) return i; {
if (xp_strcmp(tab->buf[i], str) == 0) return i;
} }
return (xp_size_t)-1; return (xp_size_t)-1;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tree.c,v 1.68 2006-07-26 15:00:00 bacon Exp $ * $Id: tree.c,v 1.69 2006-08-03 05:05:47 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -358,8 +358,9 @@ static int __print_expression (xp_awk_nde_t* nde)
case XP_AWK_NDE_AFN: case XP_AWK_NDE_AFN:
{ {
/* TODO: use px->what.afn.name_len */
xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)nde; xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)nde;
xp_printf (XP_T("%s ("), px->what.name); xp_printf (XP_T("%s ("), px->what.afn.name);
if (__print_expression_list (px->args) == -1) return -1; if (__print_expression_list (px->args) == -1) return -1;
xp_printf (XP_T(")")); xp_printf (XP_T(")"));
break; break;
@ -966,7 +967,7 @@ void xp_awk_clrpt (xp_awk_nde_t* tree)
case XP_AWK_NDE_AFN: case XP_AWK_NDE_AFN:
{ {
xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)p; xp_awk_nde_call_t* px = (xp_awk_nde_call_t*)p;
xp_free (px->what.name); xp_free (px->what.afn.name);
xp_awk_clrpt (px->args); xp_awk_clrpt (px->args);
xp_free (p); xp_free (p);
break; break;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tree.h,v 1.64 2006-07-31 04:25:17 bacon Exp $ * $Id: tree.h,v 1.65 2006-08-03 05:05:48 bacon Exp $
*/ */
#ifndef _XP_AWK_TREE_H_ #ifndef _XP_AWK_TREE_H_
@ -222,9 +222,10 @@ struct xp_awk_nde_rex_t
struct xp_awk_nde_var_t struct xp_awk_nde_var_t
{ {
XP_AWK_NDE_HDR; XP_AWK_NDE_HDR;
struct /* could it be union? */ struct
{ {
xp_char_t* name; xp_char_t* name;
xp_size_t name_len;
xp_size_t idxa; xp_size_t idxa;
} id; } id;
xp_awk_nde_t* idx; /* XP_NULL for non-XXXXIDX */ xp_awk_nde_t* idx; /* XP_NULL for non-XXXXIDX */
@ -236,13 +237,18 @@ struct xp_awk_nde_call_t
XP_AWK_NDE_HDR; XP_AWK_NDE_HDR;
union union
{ {
xp_char_t* name; struct
{
xp_char_t* name;
xp_size_t name_len;
} afn;
/* minimum information of a built-in function /* minimum information of a built-in function
* needed during run-time. */ * needed during run-time. */
struct struct
{ {
const xp_char_t* name; const xp_char_t* name;
xp_size_t name_len;
xp_size_t min_args; xp_size_t min_args;
xp_size_t max_args; xp_size_t max_args;
int (*handler) (void* run); int (*handler) (void* run);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: val.c,v 1.48 2006-07-26 16:43:35 bacon Exp $ * $Id: val.c,v 1.49 2006-08-03 05:05:48 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -325,7 +325,8 @@ xp_bool_t xp_awk_valtobool (xp_awk_val_t* val)
} }
xp_char_t* xp_awk_valtostr ( xp_char_t* xp_awk_valtostr (
xp_awk_val_t* v, int* errnum, xp_str_t* buf, xp_size_t* len) xp_awk_val_t* v, int* errnum,
xp_bool_t clear_buf, xp_str_t* buf, xp_size_t* len)
{ {
if (v->type == XP_AWK_VAL_NIL) if (v->type == XP_AWK_VAL_NIL)
{ {
@ -344,7 +345,8 @@ xp_char_t* xp_awk_valtostr (
} }
else else
{ {
xp_str_clear (buf); if (clear_buf) xp_str_clear (buf);
if (len != XP_NULL) *len = XP_STR_LEN(buf); if (len != XP_NULL) *len = XP_STR_LEN(buf);
return XP_STR_BUF(buf); return XP_STR_BUF(buf);
} }
@ -376,7 +378,7 @@ xp_char_t* xp_awk_valtostr (
} }
else else
{ {
xp_str_clear (buf); if (clear_buf) xp_str_clear (buf);
if (xp_str_cat (buf, XP_T("0")) == (xp_size_t)-1) if (xp_str_cat (buf, XP_T("0")) == (xp_size_t)-1)
{ {
*errnum = XP_AWK_ENOMEM; *errnum = XP_AWK_ENOMEM;
@ -402,13 +404,14 @@ xp_char_t* xp_awk_valtostr (
} }
tmp[l] = XP_T('\0'); tmp[l] = XP_T('\0');
if (len != XP_NULL) *len = l;
} }
else else
{ {
/* clear the buffer */ /* clear the buffer */
xp_str_clear (buf); if (clear_buf) xp_str_clear (buf);
tmp = XP_STR_BUF(buf); tmp = XP_STR_BUF(buf) + XP_STR_LEN(buf);
/* extend the buffer */ /* extend the buffer */
if (xp_str_nccat ( if (xp_str_nccat (
@ -419,8 +422,6 @@ xp_char_t* xp_awk_valtostr (
} }
} }
if (len != XP_NULL) *len = l;
t = ((xp_awk_val_int_t*)v)->val; t = ((xp_awk_val_int_t*)v)->val;
if (t < 0) t = -t; if (t < 0) t = -t;
@ -432,13 +433,18 @@ xp_char_t* xp_awk_valtostr (
if (((xp_awk_val_int_t*)v)->val < 0) tmp[--l] = XP_T('-'); if (((xp_awk_val_int_t*)v)->val < 0) tmp[--l] = XP_T('-');
if (buf != XP_NULL)
{
tmp = XP_STR_BUF(buf);
if (len != XP_NULL) *len = XP_STR_LEN(buf);
}
return tmp; return tmp;
} }
if (v->type == XP_AWK_VAL_REAL) if (v->type == XP_AWK_VAL_REAL)
{ {
/* TODO: change the code */ /* TODO: change the code */
xp_char_t tbuf[256], * tmp; xp_char_t tbuf[256], * tmp;
#if (XP_SIZEOF_LONG_DOUBLE != 0) #if (XP_SIZEOF_LONG_DOUBLE != 0)
@ -466,7 +472,8 @@ xp_char_t* xp_awk_valtostr (
} }
else else
{ {
xp_str_clear (buf); if (clear_buf) xp_str_clear (buf);
if (xp_str_cat (buf, tbuf) == (xp_size_t)-1) if (xp_str_cat (buf, tbuf) == (xp_size_t)-1)
{ {
*errnum = XP_AWK_ENOMEM; *errnum = XP_AWK_ENOMEM;
@ -489,24 +496,30 @@ xp_char_t* xp_awk_valtostr (
tmp = xp_strxdup ( tmp = xp_strxdup (
((xp_awk_val_str_t*)v)->buf, ((xp_awk_val_str_t*)v)->buf,
((xp_awk_val_str_t*)v)->len); ((xp_awk_val_str_t*)v)->len);
if (tmp == XP_NULL)
{
*errnum = XP_AWK_ENOMEM;
return XP_NULL;
}
if (tmp == XP_NULL) *errnum = XP_AWK_ENOMEM; if (len != XP_NULL) *len = ((xp_awk_val_str_t*)v)->len;
} }
else else
{ {
xp_str_clear (buf); if (clear_buf) xp_str_clear (buf);
tmp = XP_STR_BUF(buf);
if (xp_str_ncat (buf, if (xp_str_ncat (buf,
((xp_awk_val_str_t*)v)->buf, ((xp_awk_val_str_t*)v)->buf,
((xp_awk_val_str_t*)v)->len) == (xp_size_t)-1) ((xp_awk_val_str_t*)v)->len) == (xp_size_t)-1)
{ {
*errnum = XP_AWK_ENOMEM; *errnum = XP_AWK_ENOMEM;
tmp = XP_NULL; return XP_NULL;
} }
tmp = XP_STR_BUF(buf);
if (len != XP_NULL) *len = XP_STR_LEN(buf);
} }
if (len != XP_NULL) *len = ((xp_awk_val_str_t*)v)->len;
return tmp; return tmp;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: val.h,v 1.34 2006-07-26 15:00:00 bacon Exp $ * $Id: val.h,v 1.35 2006-08-03 05:05:48 bacon Exp $
*/ */
#ifndef _XP_AWK_VAL_H_ #ifndef _XP_AWK_VAL_H_
@ -118,7 +118,8 @@ void xp_awk_refdownval_nofree (xp_awk_run_t* run, xp_awk_val_t* val);
xp_bool_t xp_awk_valtobool (xp_awk_val_t* val); xp_bool_t xp_awk_valtobool (xp_awk_val_t* val);
xp_char_t* xp_awk_valtostr ( xp_char_t* xp_awk_valtostr (
xp_awk_val_t* val, int* errnum, xp_str_t* buf, xp_size_t* len); xp_awk_val_t* val, int* errnum,
xp_bool_t clear_buf, xp_str_t* buf, xp_size_t* len);
int xp_awk_valtonum (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r); int xp_awk_valtonum (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r);
void xp_awk_printval (xp_awk_val_t* val); void xp_awk_printval (xp_awk_val_t* val);