diff --git a/ase/awk/parse.c b/ase/awk/parse.c index e38218f8..489cf2d9 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.151 2006-08-03 05:05:47 bacon Exp $ + * $Id: parse.c,v 1.152 2006-08-03 06:06:27 bacon Exp $ */ #include @@ -565,7 +565,8 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk) if (awk->opt.parse & XP_AWK_UNIQUE) { /* check if it coincides to be a global variable name */ - if (xp_awk_tab_find(&awk->parse.globals, name, 0) != (xp_size_t)-1) + if (xp_awk_tab_find ( + &awk->parse.globals, 0, name, name_len) != (xp_size_t)-1) { PANIC (awk, XP_AWK_EDUPNAME); } @@ -630,8 +631,8 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk) if (awk->opt.parse & XP_AWK_UNIQUE) { /* check if a parameter conflicts with a function */ - if (xp_strxncmp(name_dup, name_len, param, param_len) == 0 || - xp_awk_map_get(&awk->tree.afns, param, param_len) != XP_NULL) + if (xp_strxncmp (name_dup, name_len, param, param_len) == 0 || + xp_awk_map_get (&awk->tree.afns, param, param_len) != XP_NULL) { xp_free (name_dup); xp_awk_tab_clear (&awk->parse.params); @@ -646,7 +647,7 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk) } /* check if a parameter conflicts with other parameters */ - if (xp_awk_tab_find(&awk->parse.params, param, 0) != (xp_size_t)-1) + if (xp_awk_tab_find (&awk->parse.params, 0, param, param_len) != (xp_size_t)-1) { xp_free (name_dup); xp_awk_tab_clear (&awk->parse.params); @@ -654,14 +655,14 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk) } /* push the parameter to the parameter list */ - if (xp_awk_tab_add(&awk->parse.params, param) == (xp_size_t)-1) + if (xp_awk_tab_add (&awk->parse.params, param, param_len) == (xp_size_t)-1) { xp_free (name_dup); xp_awk_tab_clear (&awk->parse.params); PANIC (awk, XP_AWK_ENOMEM); } - if (__get_token(awk) == -1) + if (__get_token (awk) == -1) { xp_free (name_dup); xp_awk_tab_clear (&awk->parse.params); @@ -971,12 +972,12 @@ static xp_awk_t* __add_global ( } /* check if it conflicts with other global variable names */ - if (xp_awk_tab_find(&awk->parse.globals, name, 0) != (xp_size_t)-1) + if (xp_awk_tab_find (&awk->parse.globals, 0, name, len) != (xp_size_t)-1) { PANIC (awk, XP_AWK_EDUPVAR); } - if (xp_awk_tab_add(&awk->parse.globals, name) == (xp_size_t)-1) + if (xp_awk_tab_add (&awk->parse.globals, name, len) == (xp_size_t)-1) { PANIC (awk, XP_AWK_ENOMEM); } @@ -1043,19 +1044,20 @@ static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals) } /* check if it conflicts with a paremeter name */ - if (xp_awk_tab_find(&awk->parse.params, local, 0) != (xp_size_t)-1) + if (xp_awk_tab_find (&awk->parse.params, 0, local, local_len) != (xp_size_t)-1) { PANIC (awk, XP_AWK_EDUPNAME); } /* check if it conflicts with other local variable names */ - if (xp_awk_tab_find(&awk->parse.locals, local, - ((awk->opt.parse & XP_AWK_SHADING)? nlocals: 0)) != (xp_size_t)-1) + if (xp_awk_tab_find (&awk->parse.locals, + ((awk->opt.parse & XP_AWK_SHADING)? nlocals: 0), + local, local_len) != (xp_size_t)-1) { PANIC (awk, XP_AWK_EDUPVAR); } - if (xp_awk_tab_add(&awk->parse.locals, local) == (xp_size_t)-1) + if (xp_awk_tab_add (&awk->parse.locals, local, local_len) == (xp_size_t)-1) { PANIC (awk, XP_AWK_ENOMEM); } @@ -2242,7 +2244,8 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk) } /* search the parameter name list */ - idxa = xp_awk_tab_find(&awk->parse.params, name_dup, 0); + idxa = xp_awk_tab_find ( + &awk->parse.params, 0, name_dup, name_len); if (idxa != (xp_size_t)-1) { nde->type = XP_AWK_NDE_ARG; @@ -2257,7 +2260,8 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk) } /* search the local variable list */ - idxa = xp_awk_tab_rrfind(&awk->parse.locals, name_dup, 0); + idxa = xp_awk_tab_rrfind ( + &awk->parse.locals, 0, name_dup, name_len); if (idxa != (xp_size_t)-1) { nde->type = XP_AWK_NDE_LOCAL; @@ -2272,7 +2276,8 @@ static xp_awk_nde_t* __parse_primary_ident (xp_awk_t* awk) } /* search the global variable list */ - idxa = xp_awk_tab_rrfind(&awk->parse.globals, name_dup, 0); + idxa = xp_awk_tab_rrfind ( + &awk->parse.globals, 0, name_dup, name_len); if (idxa != (xp_size_t)-1) { nde->type = XP_AWK_NDE_GLOBAL; @@ -2365,7 +2370,7 @@ static xp_awk_nde_t* __parse_hashidx ( } /* search the parameter name list */ - idxa = xp_awk_tab_find (&awk->parse.params, name, 0); + idxa = xp_awk_tab_find (&awk->parse.params, 0, name, name_len); if (idxa != (xp_size_t)-1) { nde->type = XP_AWK_NDE_ARGIDX; @@ -2380,7 +2385,7 @@ static xp_awk_nde_t* __parse_hashidx ( } /* search the local variable list */ - idxa = xp_awk_tab_rrfind(&awk->parse.locals, name, 0); + idxa = xp_awk_tab_rrfind(&awk->parse.locals, 0, name, name_len); if (idxa != (xp_size_t)-1) { nde->type = XP_AWK_NDE_LOCALIDX; @@ -2395,7 +2400,7 @@ static xp_awk_nde_t* __parse_hashidx ( } /* search the global variable list */ - idxa = xp_awk_tab_rrfind(&awk->parse.globals, name, 0); + idxa = xp_awk_tab_rrfind(&awk->parse.globals, 0, name, name_len); if (idxa != (xp_size_t)-1) { nde->type = XP_AWK_NDE_GLOBALIDX; @@ -2465,7 +2470,8 @@ static xp_awk_nde_t* __parse_fncall ( { if (__get_token(awk) == -1) { - if (head != XP_NULL) xp_awk_clrpt (head); + if (head != XP_NULL) + xp_awk_clrpt (head); return XP_NULL; } break; diff --git a/ase/awk/tab.c b/ase/awk/tab.c index 88101974..0912d7d7 100644 --- a/ase/awk/tab.c +++ b/ase/awk/tab.c @@ -1,5 +1,5 @@ /* - * $Id: tab.c,v 1.9 2006-08-03 05:05:47 bacon Exp $ + * $Id: tab.c,v 1.10 2006-08-03 06:06:27 bacon Exp $ */ #include @@ -52,7 +52,7 @@ xp_size_t xp_awk_tab_getcapa (xp_awk_tab_t* tab) xp_awk_tab_t* xp_awk_tab_setcapa (xp_awk_tab_t* tab, xp_size_t capa) { - xp_char_t** tmp; + void* tmp; if (tab->size > capa) { @@ -62,8 +62,7 @@ xp_awk_tab_t* xp_awk_tab_setcapa (xp_awk_tab_t* tab, xp_size_t capa) if (capa > 0) { - tmp = (xp_char_t**)xp_realloc ( - tab->buf, xp_sizeof(xp_char_t*) * capa); + tmp = xp_realloc (tab->buf, xp_sizeof(*tab->buf) * capa); if (tmp == XP_NULL) return XP_NULL; } else @@ -86,8 +85,9 @@ void xp_awk_tab_clear (xp_awk_tab_t* tab) for (i = 0; i < tab->size; i++) { - xp_free (tab->buf[i]); - tab->buf[i] = XP_NULL; + xp_free (tab->buf[i].name); + tab->buf[i].name = XP_NULL; + tab->buf[i].name_len = 0; } tab->size = 0; @@ -95,12 +95,13 @@ void xp_awk_tab_clear (xp_awk_tab_t* tab) xp_size_t xp_awk_tab_insert ( - xp_awk_tab_t* tab, xp_size_t index, const xp_char_t* str) + xp_awk_tab_t* tab, xp_size_t index, + const xp_char_t* str, xp_size_t len) { xp_size_t i; xp_char_t* str_dup; - str_dup = xp_strdup(str); + str_dup = xp_strxdup(str, len); if (str_dup == XP_NULL) return (xp_size_t)-1; if (index >= tab->capa) @@ -121,7 +122,8 @@ xp_size_t xp_awk_tab_insert ( } for (i = tab->size; i > index; i--) tab->buf[i] = tab->buf[i-1]; - tab->buf[index] = str_dup; + tab->buf[index].name = str_dup; + tab->buf[index].name_len = len; if (index > tab->size) tab->size = index + 1; else tab->size++; @@ -143,16 +145,18 @@ xp_size_t xp_awk_tab_remove ( while (i < k) { - xp_free (tab->buf[i]); + xp_free (tab->buf[i].name); if (j >= tab->size) { - tab->buf[i] = XP_NULL; + tab->buf[i].name = XP_NULL; + tab->buf[i].name_len = 0; i++; } else { - tab->buf[i] = tab->buf[j]; + tab->buf[i].name = tab->buf[j].name; + tab->buf[i].name_len = tab->buf[j].name_len; i++; j++; } } @@ -161,27 +165,31 @@ xp_size_t xp_awk_tab_remove ( return count; } -xp_size_t xp_awk_tab_add (xp_awk_tab_t* tab, const xp_char_t* str) +xp_size_t xp_awk_tab_add ( + xp_awk_tab_t* tab, const xp_char_t* str, xp_size_t len) { - return xp_awk_tab_insert (tab, tab->size, str); + return xp_awk_tab_insert (tab, tab->size, str, len); } - xp_size_t xp_awk_tab_find ( - xp_awk_tab_t* tab, const xp_char_t* str, xp_size_t index) + xp_awk_tab_t* tab, xp_size_t index, + const xp_char_t* str, xp_size_t len) { xp_size_t i; for (i = index; i < tab->size; i++) { - if (xp_strcmp(tab->buf[i], str) == 0) return i; + if (xp_strxncmp ( + tab->buf[i].name, tab->buf[i].name_len, + str, len) == 0) return i; } return (xp_size_t)-1; } xp_size_t xp_awk_tab_rfind ( - xp_awk_tab_t* tab, const xp_char_t* str, xp_size_t index) + xp_awk_tab_t* tab, xp_size_t index, + const xp_char_t* str, xp_size_t len) { xp_size_t i; @@ -189,14 +197,17 @@ xp_size_t xp_awk_tab_rfind ( for (i = index + 1; i-- > 0; ) { - if (xp_strcmp(tab->buf[i], str) == 0) return i; + if (xp_strxncmp ( + tab->buf[i].name, tab->buf[i].name_len, + str, len) == 0) return i; } return (xp_size_t)-1; } xp_size_t xp_awk_tab_rrfind ( - xp_awk_tab_t* tab, const xp_char_t* str, xp_size_t index) + xp_awk_tab_t* tab, xp_size_t index, + const xp_char_t* str, xp_size_t len) { xp_size_t i; @@ -204,7 +215,9 @@ xp_size_t xp_awk_tab_rrfind ( for (i = tab->size - index; i-- > 0; ) { - if (xp_strcmp(tab->buf[i], str) == 0) return i; + if (xp_strxncmp ( + tab->buf[i].name, tab->buf[i].name_len, + str, len) == 0) return i; } return (xp_size_t)-1; diff --git a/ase/awk/tab.h b/ase/awk/tab.h index 3928716b..58190775 100644 --- a/ase/awk/tab.h +++ b/ase/awk/tab.h @@ -1,5 +1,5 @@ /* - * $Id: tab.h,v 1.9 2006-06-29 09:11:38 bacon Exp $ + * $Id: tab.h,v 1.10 2006-08-03 06:06:27 bacon Exp $ */ #ifndef _XP_AWK_TAB_H_ @@ -16,7 +16,12 @@ typedef struct xp_awk_tab_t xp_awk_tab_t; struct xp_awk_tab_t { - xp_char_t** buf; + struct + { + xp_char_t* name; + xp_size_t name_len; + }* buf; + //xp_char_t** buf; xp_size_t size; xp_size_t capa; xp_bool_t __dynamic; @@ -36,18 +41,24 @@ xp_awk_tab_t* xp_awk_tab_setcapa (xp_awk_tab_t* tab, xp_size_t capa); void xp_awk_tab_clear (xp_awk_tab_t* tab); 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 len); + xp_size_t xp_awk_tab_remove ( xp_awk_tab_t* tab, xp_size_t index, xp_size_t 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, xp_size_t len); 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, xp_size_t index, + const xp_char_t* str, xp_size_t len); 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, xp_size_t index, + const xp_char_t* str, xp_size_t len); 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, xp_size_t index, + const xp_char_t* str, xp_size_t len); #ifdef __cplusplus }