This commit is contained in:
hyung-hwan 2008-02-13 02:55:11 +00:00
parent f858485661
commit 0626a467d1

View File

@ -3079,22 +3079,44 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
ase_size_t name_len; ase_size_t name_len;
ase_awk_bfn_t* bfn; ase_awk_bfn_t* bfn;
ase_size_t idxa; ase_size_t idxa;
ase_char_t name_dup_buf[32];
ASE_ASSERT (MATCH(awk,TOKEN_IDENT)); ASE_ASSERT (MATCH(awk,TOKEN_IDENT));
name_dup = ase_awk_strxdup (awk, if (ASE_STR_LEN(&awk->token.name) < ASE_COUNTOF(name_dup_buf))
ASE_STR_BUF(&awk->token.name),
ASE_STR_LEN(&awk->token.name));
if (name_dup == ASE_NULL)
{ {
SETERRLIN (awk, ASE_AWK_ENOMEM, line); ase_strxncpy (
return ASE_NULL; name_dup_buf,
ASE_COUNTOF(name_dup_buf),
ASE_STR_BUF(&awk->token.name),
ASE_STR_LEN(&awk->token.name));
name_dup = name_dup_buf;
// TODO: dup on acutal node creationg........
} }
else
{
name_dup = ase_awk_strxdup (awk,
ASE_STR_BUF(&awk->token.name),
ASE_STR_LEN(&awk->token.name));
if (name_dup == ASE_NULL)
{
SETERRLIN (awk, ASE_AWK_ENOMEM, line);
return ASE_NULL;
}
}
name_len = ASE_STR_LEN(&awk->token.name); name_len = ASE_STR_LEN(&awk->token.name);
#define FREE_DUP_NAME(awk) \
do { \
if (name_dup != name_dup_buf) \
ASE_AWK_FREE (awk, name_dup); \
} while (0)
if (get_token(awk) == -1) if (get_token(awk) == -1)
{ {
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME(awk);
return ASE_NULL; return ASE_NULL;
} }
@ -3108,13 +3130,13 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
{ {
/* an intrinsic function should be in the form /* an intrinsic function should be in the form
* of the function call */ * of the function call */
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME(awk);
SETERRTOK (awk, ASE_AWK_ELPAREN); SETERRTOK (awk, ASE_AWK_ELPAREN);
return ASE_NULL; return ASE_NULL;
} }
nde = parse_fncall (awk, name_dup, name_len, bfn, line); nde = parse_fncall (awk, name_dup, name_len, bfn, line);
if (nde == ASE_NULL) ASE_AWK_FREE (awk, name_dup); if (nde == ASE_NULL) FREE_DUP_NAME(awk);
return (ase_awk_nde_t*)nde; return (ase_awk_nde_t*)nde;
} }
@ -3123,7 +3145,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
{ {
ase_awk_nde_t* nde; ase_awk_nde_t* nde;
nde = parse_hashidx (awk, name_dup, name_len, line); nde = parse_hashidx (awk, name_dup, name_len, line);
if (nde == ASE_NULL) ASE_AWK_FREE (awk, name_dup); if (nde == ASE_NULL) FREE_DUP_NAME(awk);
return (ase_awk_nde_t*)nde; return (ase_awk_nde_t*)nde;
} }
else if ((idxa = ase_awk_tab_rrfind ( else if ((idxa = ase_awk_tab_rrfind (
@ -3137,7 +3159,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
{ {
/* a local variable is not a function */ /* a local variable is not a function */
SETERRARG (awk, ASE_AWK_EFNNAME, line, name_dup, name_len); SETERRARG (awk, ASE_AWK_EFNNAME, line, name_dup, name_len);
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
return ASE_NULL; return ASE_NULL;
} }
@ -3145,7 +3167,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
awk, ASE_SIZEOF(ase_awk_nde_var_t)); awk, ASE_SIZEOF(ase_awk_nde_var_t));
if (nde == ASE_NULL) if (nde == ASE_NULL)
{ {
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
SETERRLIN (awk, ASE_AWK_ENOMEM, line); SETERRLIN (awk, ASE_AWK_ENOMEM, line);
return ASE_NULL; return ASE_NULL;
} }
@ -3172,7 +3194,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
{ {
/* a parameter is not a function */ /* a parameter is not a function */
SETERRARG (awk, ASE_AWK_EFNNAME, line, name_dup, name_len); SETERRARG (awk, ASE_AWK_EFNNAME, line, name_dup, name_len);
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
return ASE_NULL; return ASE_NULL;
} }
@ -3180,7 +3202,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
awk, ASE_SIZEOF(ase_awk_nde_var_t)); awk, ASE_SIZEOF(ase_awk_nde_var_t));
if (nde == ASE_NULL) if (nde == ASE_NULL)
{ {
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
SETERRLIN (awk, ASE_AWK_ENOMEM, line); SETERRLIN (awk, ASE_AWK_ENOMEM, line);
return ASE_NULL; return ASE_NULL;
} }
@ -3207,7 +3229,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
{ {
/* a global variable is not a function */ /* a global variable is not a function */
SETERRARG (awk, ASE_AWK_EFNNAME, line, name_dup, name_len); SETERRARG (awk, ASE_AWK_EFNNAME, line, name_dup, name_len);
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
return ASE_NULL; return ASE_NULL;
} }
@ -3215,7 +3237,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
awk, ASE_SIZEOF(ase_awk_nde_var_t)); awk, ASE_SIZEOF(ase_awk_nde_var_t));
if (nde == ASE_NULL) if (nde == ASE_NULL)
{ {
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
SETERRLIN (awk, ASE_AWK_ENOMEM, line); SETERRLIN (awk, ASE_AWK_ENOMEM, line);
return ASE_NULL; return ASE_NULL;
} }
@ -3242,13 +3264,16 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
{ {
/* a function call conflicts with a named variable */ /* a function call conflicts with a named variable */
SETERRARG (awk, ASE_AWK_EVARRED, line, name_dup, name_len); SETERRARG (awk, ASE_AWK_EVARRED, line, name_dup, name_len);
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
return ASE_NULL; return ASE_NULL;
} }
} }
nde = parse_fncall (awk, name_dup, name_len, ASE_NULL, line); nde = parse_fncall (awk, name_dup, name_len, ASE_NULL, line);
if (nde == ASE_NULL) ASE_AWK_FREE (awk, name_dup); if (nde == ASE_NULL)
{
FREE_DUP_NAME (awk);
}
return (ase_awk_nde_t*)nde; return (ase_awk_nde_t*)nde;
} }
else else
@ -3260,7 +3285,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
awk, ASE_SIZEOF(ase_awk_nde_var_t)); awk, ASE_SIZEOF(ase_awk_nde_var_t));
if (nde == ASE_NULL) if (nde == ASE_NULL)
{ {
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
SETERRLIN (awk, ASE_AWK_ENOMEM, line); SETERRLIN (awk, ASE_AWK_ENOMEM, line);
return ASE_NULL; return ASE_NULL;
} }
@ -3329,11 +3354,13 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
SETERRARG (awk, ASE_AWK_EUNDEF, line, name_dup, name_len); SETERRARG (awk, ASE_AWK_EUNDEF, line, name_dup, name_len);
exit_func: exit_func:
ASE_AWK_FREE (awk, name_dup); FREE_DUP_NAME (awk);
ASE_AWK_FREE (awk, nde); ASE_AWK_FREE (awk, nde);
return ASE_NULL; return ASE_NULL;
} }
#undef FREE_DUP_NAME
} }
static ase_awk_nde_t* parse_hashidx ( static ase_awk_nde_t* parse_hashidx (