diff --git a/ase/include/ase/macros.h b/ase/include/ase/macros.h index d1dc1bff..6d1b38d1 100644 --- a/ase/include/ase/macros.h +++ b/ase/include/ase/macros.h @@ -1,5 +1,5 @@ /* - * $Id: macros.h 354 2008-08-31 10:57:24Z baconevi $ + * $Id: macros.h 381 2008-09-24 11:07:24Z baconevi $ * * {License} */ @@ -66,8 +66,10 @@ } \ } while (0); -#define ASE_NCHARS_TO_NBYTES(x) ((x)*sizeof(ase_char_t)) -#define ASE_NBYTES_TO_NCHARS(x) ((x)/sizeof(ase_char_t)) +/* number of characters to number of bytes */ +#define ASE_NCTONB(x) ((x)*sizeof(ase_char_t)) +/* number of bytes to number of characters */ +#define ASE_NBTONC(x) ((x)/sizeof(ase_char_t)) #define ASE_MQ_I(val) #val #define ASE_MQ(val) ASE_MQ_I(val) diff --git a/ase/lib/awk/awk.c b/ase/lib/awk/awk.c index bf160a0e..58ca81c0 100644 --- a/ase/lib/awk/awk.c +++ b/ase/lib/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 380 2008-09-24 08:16:41Z baconevi $ + * $Id: awk.c 381 2008-09-24 11:07:24Z baconevi $ * * {License} */ @@ -61,7 +61,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ASE_MEMSET (awk, 0, ASE_SIZEOF(ase_awk_t) + ext); awk->mmgr = mmgr; - if (ase_str_open (&awk->token.name, 128, mmgr) == ASE_NULL) + if (ase_str_init (&awk->token.name, mmgr, 128) == ASE_NULL) { ASE_AWK_FREE (awk, awk); return ASE_NULL; @@ -82,7 +82,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) if (awk->rwtab == ASE_NULL) { ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } @@ -97,7 +97,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) { ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } @@ -111,11 +111,12 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ase_map_close (awk->tree.afns); ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } *(ase_awk_t**)ASE_MAP_EXTENSION(awk->parse.afns) = awk; + ase_map_setcopier (awk->parse.afns, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); /*awk->parse.named = ase_map_open (awk, 256, 70, ASE_NULL, ASE_NULL, mmgr);*/ awk->parse.named = ase_map_open (mmgr, ASE_SIZEOF(awk), 256, 70); @@ -125,11 +126,12 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ase_map_close (awk->tree.afns); ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } *(ase_awk_t**)ASE_MAP_EXTENSION(awk->parse.named) = awk; + ase_map_setcopier (awk->parse.named, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); if (ase_awk_tab_open (&awk->parse.globals, awk) == ASE_NULL) { @@ -138,7 +140,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ase_map_close (awk->tree.afns); ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } @@ -151,7 +153,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ase_map_close (awk->tree.afns); ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } @@ -165,7 +167,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ase_map_close (awk->tree.afns); ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } @@ -215,7 +217,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ase_map_close (awk->tree.afns); ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } @@ -246,7 +248,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) ase_map_close (awk->tree.afns); ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } @@ -273,7 +275,7 @@ int ase_awk_close (ase_awk_t* awk) ase_map_close (awk->rwtab); ase_map_close (awk->wtab); - ase_str_close (&awk->token.name); + ase_str_fini (&awk->token.name); for (i = 0; i < ASE_COUNTOF(awk->errstr); i++) { diff --git a/ase/lib/awk/parse.c b/ase/lib/awk/parse.c index 985d5bed..49aea884 100644 --- a/ase/lib/awk/parse.c +++ b/ase/lib/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c 372 2008-09-23 09:51:24Z baconevi $ + * $Id: parse.c 381 2008-09-24 11:07:24Z baconevi $ * * {License} */ @@ -226,7 +226,7 @@ static int is_plain_var (ase_awk_nde_t* nde); static int is_var (ase_awk_nde_t* nde); static int deparse (ase_awk_t* awk); -static int deparse_func (ase_map_pair_t* pair, void* arg); +static ase_map_walk_t deparse_func (ase_map_t* map, ase_map_pair_t* pair, void* arg); static int put_char (ase_awk_t* awk, ase_char_t c); static int flush_out (ase_awk_t* awk); @@ -464,11 +464,11 @@ ase_cstr_t* ase_awk_getkw (ase_awk_t* awk, int id, ase_cstr_t* s) s->ptr = kwtab[id].name; s->len = kwtab[id].name_len; - p = ase_map_search (awk->wtab, s->ptr, ASE_NCHARS_TO_NBYTES(s->len)); + p = ase_map_search (awk->wtab, s->ptr, ASE_NCTONB(s->len)); if (p != ASE_NULL) { s->ptr = ASE_MAP_VPTR(p); - s->len = ASE_NBYTES_TO_NCHARS(ASE_MAP_VLEN(p)); + s->len = ASE_MAP_VCLEN(p); } return s; @@ -555,12 +555,10 @@ static int parse (ase_awk_t* awk) ASE_MAP_KPTR(p), ASE_MAP_KLEN(p)) == ASE_NULL) { /* TODO: set better error no & line */ - /* this line number might be truncated as - * sizeof(line) could be > sizeof(void*) */ SETERRARG (awk, ASE_AWK_EFNNONE, - (ase_size_t)p->val, + *(ase_size_t*)ASE_MAP_VPTR(p), ASE_MAP_KPTR(p), - ASE_NBYTES_TO_NCHARS(ASE_MAP_KELN(p))); + ASE_MAP_KCLEN(p)); EXIT_PARSE(-1); } @@ -1077,8 +1075,8 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) return ASE_NULL; } - afn->name = ASE_NULL; /* function name set below */ - afn->name_len = 0; + afn->name.ptr = ASE_NULL; /* function name is set below */ + afn->name.len = 0; afn->nargs = nargs; afn->body = body; @@ -1096,12 +1094,14 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) /* duplicate functions should have been detected previously */ ASE_ASSERT (n != 0); - afn->name = ASE_PAIR_KEYPTR(pair); /* do some trick to save a string. */ - afn->name_len = ASE_PAIR_KEYLEN(pair); + /* do some trick to save a string. make it back-point at the key part + * of the pair */ + afn->name.ptr = ASE_MAP_KPTR(pair); + afn->name.len = ASE_MAP_KCLEN(pair); ASE_AWK_FREE (awk, name_dup); - /* remove the undefined function call entries from parse.afn table */ - ase_map_remove (awk->parse.afns, afn->name, name_len); + /* remove an undefined function call entry from the parse.afn table */ + ase_map_remove (awk->parse.afns, afn->name.ptr, ASE_NCTONB(name_len)); return body; } @@ -1487,7 +1487,7 @@ static int add_global ( /* check if it conflict with a function name * caught in the function call table */ - if (ase_map_search (awk->parse.afns, name, len) != ASE_NULL) + if (ase_map_search (awk->parse.afns, name, ASE_NCTONB(len)) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EAFNRED, line, @@ -1627,8 +1627,7 @@ static ase_awk_t* collect_globals (ase_awk_t* awk) static ase_awk_t* collect_locals ( ase_awk_t* awk, ase_size_t nlocals, ase_bool_t istop) { - ase_char_t* local; - ase_size_t local_len; + ase_xstr_t local; ase_size_t n; while (1) @@ -1639,8 +1638,8 @@ static ase_awk_t* collect_locals ( return ASE_NULL; } - local = ASE_STR_PTR(&awk->token.name); - local_len = ASE_STR_LEN(&awk->token.name); + local.ptr = ASE_STR_PTR(&awk->token.name); + local.len = ASE_STR_LEN(&awk->token.name); #if 0 if (awk->option & ASE_AWK_UNIQUEFN) @@ -1650,11 +1649,11 @@ static ase_awk_t* collect_locals ( /* check if it conflict with a builtin function name * function f() { local length; } */ - if (ase_awk_getbfn (awk, local, local_len) != ASE_NULL) + if (ase_awk_getbfn (awk, local.ptr, local.len) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EBFNRED, awk->token.line, - local, local_len); + local.ptr, local.len); return ASE_NULL; } @@ -1664,24 +1663,25 @@ static ase_awk_t* collect_locals ( { iscur = (ase_strxncmp ( awk->tree.cur_afn.ptr, awk->tree.cur_afn.len, - local, local_len) == 0); + local.ptr, local.len) == 0); } - if (iscur || ase_map_search (awk->tree.afns, local, local_len) != ASE_NULL) + if (iscur || ase_map_search (awk->tree.afns, local.ptr, local.len) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EAFNRED, awk->token.line, - local, local_len); + local.ptr, local.len); return ASE_NULL; } /* check if it conflict with a function name * caught in the function call table */ - if (ase_map_search (awk->parse.afns, local, local_len) != ASE_NULL) + if (ase_map_search (awk->parse.afns, + local.ptr, ASE_NCTONB(local.len)) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EAFNRED, awk->token.line, - local, local_len); + local.ptr, local.len); return ASE_NULL; } } @@ -1690,12 +1690,12 @@ static ase_awk_t* collect_locals ( if (istop) { /* check if it conflicts with a paremeter name */ - n = ase_awk_tab_find (&awk->parse.params, 0, local, local_len); + n = ase_awk_tab_find (&awk->parse.params, 0, local.ptr, local.len); if (n != (ase_size_t)-1) { SETERRARG ( awk, ASE_AWK_EPARRED, awk->token.line, - local, local_len); + local.ptr, local.len); return ASE_NULL; } } @@ -1704,17 +1704,17 @@ static ase_awk_t* collect_locals ( n = ase_awk_tab_find ( &awk->parse.locals, nlocals, /*((awk->option&ASE_AWK_SHADING)? nlocals:0)*/ - local, local_len); + local.ptr, local.len); if (n != (ase_size_t)-1) { SETERRARG ( awk, ASE_AWK_EDUPLCL, awk->token.line, - local, local_len); + local.ptr, local.len); return ASE_NULL; } /* check if it conflicts with global variable names */ - n = find_global (awk, local, local_len); + n = find_global (awk, local.ptr, local.len); if (n != (ase_size_t)-1) { if (n < awk->tree.nbglobals) @@ -1722,7 +1722,7 @@ static ase_awk_t* collect_locals ( /* conflicting with a static global variable */ SETERRARG ( awk, ASE_AWK_EDUPLCL, awk->token.line, - local, local_len); + local.ptr, local.len); return ASE_NULL; } @@ -1732,7 +1732,7 @@ static ase_awk_t* collect_locals ( /* conflicting with a normal global variable */ SETERRARG ( awk, ASE_AWK_EDUPLCL, awk->token.line, - local, local_len); + local.ptr, local.len); return ASE_NULL; } #endif @@ -1745,7 +1745,7 @@ static ase_awk_t* collect_locals ( } if (ase_awk_tab_add ( - &awk->parse.locals, local, local_len) == (ase_size_t)-1) + &awk->parse.locals, local.ptr, local.len) == (ase_size_t)-1) { SETERRLIN (awk, ASE_AWK_ENOMEM, awk->token.line); return ASE_NULL; @@ -3179,9 +3179,9 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) nde->type = ASE_AWK_NDE_LOCAL; nde->line = line; nde->next = ASE_NULL; - /*nde->id.name = ASE_NULL;*/ - nde->id.name = name_dup; - nde->id.name_len = name_len; + /*nde->id.name.ptr = ASE_NULL;*/ + nde->id.name.ptr = name_dup; + nde->id.name.len = name_len; nde->id.idxa = idxa; nde->idx = ASE_NULL; @@ -3215,8 +3215,8 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) nde->line = line; nde->next = ASE_NULL; /*nde->id.name = ASE_NULL;*/ - nde->id.name = name_dup; - nde->id.name_len = name_len; + nde->id.name.ptr = name_dup; + nde->id.name.len = name_len; nde->id.idxa = idxa; nde->idx = ASE_NULL; @@ -3250,8 +3250,8 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) nde->line = line; nde->next = ASE_NULL; /*nde->id.name = ASE_NULL;*/ - nde->id.name = name_dup; - nde->id.name_len = name_len; + nde->id.name.ptr = name_dup; + nde->id.name.len = name_len; nde->id.idxa = idxa; nde->idx = ASE_NULL; @@ -3264,7 +3264,8 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) if (awk->option & ASE_AWK_IMPLICIT) { - if (ase_map_search (awk->parse.named, name_dup, name_len) != ASE_NULL) + if (ase_map_search (awk->parse.named, + name_dup, ASE_NCTONB(name_len)) != ASE_NULL) { /* a function call conflicts with a named variable */ SETERRARG (awk, ASE_AWK_EVARRED, line, name_dup, name_len); @@ -3322,7 +3323,8 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) goto exit_func; } - if (ase_map_search (awk->parse.afns, name_dup, name_len) != ASE_NULL) + if (ase_map_search (awk->parse.afns, + name_dup, ASE_NCTONB(name_len)) != ASE_NULL) { /* is it one of the function calls found so far? */ SETERRARG (awk, ASE_AWK_EAFNRED, line, name_dup, name_len); @@ -3335,14 +3337,15 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) nde->type = ASE_AWK_NDE_NAMED; nde->line = line; nde->next = ASE_NULL; - nde->id.name = name_dup; - nde->id.name_len = name_len; + nde->id.name.ptr = name_dup; + nde->id.name.len = name_len; nde->id.idxa = (ase_size_t)-1; nde->idx = ASE_NULL; /* collect unique instances of a named variables for reference */ if (ase_map_upsert (awk->parse.named, - name_dup, name_len, (void*)line) == ASE_NULL) + name_dup, ASE_NCTONB(name_len), + &line, ASE_SIZEOF(line)) == ASE_NULL) { SETERRLIN (awk, ASE_AWK_ENOMEM, line); goto exit_func; @@ -3433,8 +3436,8 @@ static ase_awk_nde_t* parse_hashidx ( nde->line = line; nde->next = ASE_NULL; /*nde->id.name = ASE_NULL; */ - nde->id.name = name; - nde->id.name_len = name_len; + nde->id.name.ptr = name; + nde->id.name.len = name_len; nde->id.idxa = idxa; nde->idx = idx; @@ -3449,8 +3452,8 @@ static ase_awk_nde_t* parse_hashidx ( nde->line = line; nde->next = ASE_NULL; /*nde->id.name = ASE_NULL; */ - nde->id.name = name; - nde->id.name_len = name_len; + nde->id.name.ptr = name; + nde->id.name.len = name_len; nde->id.idxa = idxa; nde->idx = idx; @@ -3465,8 +3468,8 @@ static ase_awk_nde_t* parse_hashidx ( nde->line = line; nde->next = ASE_NULL; /*nde->id.name = ASE_NULL;*/ - nde->id.name = name; - nde->id.name_len = name_len; + nde->id.name.ptr = name; + nde->id.name.len = name_len; nde->id.idxa = idxa; nde->idx = idx; @@ -3503,7 +3506,9 @@ static ase_awk_nde_t* parse_hashidx ( goto exit_func; } - if (ase_map_search (awk->parse.afns, name, name_len) != ASE_NULL) + if (ase_map_search ( + awk->parse.afns, + name, ASE_NCTONB(name_len)) != ASE_NULL) { /* is it one of the function calls found so far? */ SETERRARG (awk, ASE_AWK_EAFNRED, line, name, name_len); @@ -3516,8 +3521,8 @@ static ase_awk_nde_t* parse_hashidx ( nde->type = ASE_AWK_NDE_NAMEDIDX; nde->line = line; nde->next = ASE_NULL; - nde->id.name = name; - nde->id.name_len = name_len; + nde->id.name.ptr = name; + nde->id.name.len = name_len; nde->id.idxa = (ase_size_t)-1; nde->idx = idx; @@ -3653,10 +3658,11 @@ static ase_awk_nde_t* parse_fncall ( { #endif - /* this line number might be truncated as - * sizeof(line) could be > sizeof(void*) */ - if (ase_map_upsert (awk->parse.afns, - name, name_len, (void*)line) == ASE_NULL) + /* store a non-builtin function call into the parse.afns table */ + if (ase_map_upsert ( + awk->parse.afns, + name, ASE_NCTONB(name_len), + &line, ASE_SIZEOF(line)) == ASE_NULL) { ASE_AWK_FREE (awk, call); if (head != ASE_NULL) ase_awk_clrpt (awk, head); @@ -5521,8 +5527,8 @@ static int deparse (ase_awk_t* awk) ASE_ASSERT (awk->tree.nglobals > 0); - ase_awk_getkw (ase, KW_GLOBAL, &kw); - if (ase_awk_putsrcstrx(awk,kw.ptr,kw.len)) == -1) + ase_awk_getkw (awk, KW_GLOBAL, &kw); + if (ase_awk_putsrcstrx(awk,kw.ptr,kw.len) == -1) { EXIT_DEPARSE (); } @@ -5610,8 +5616,11 @@ static int deparse (ase_awk_t* awk) for (nde = awk->tree.begin; nde != ASE_NULL; nde = nde->next) { - const ase_char_t* kw = ase_awk_getkw(awk,ASE_T("BEGIN")); - if (ase_awk_putsrcstr(awk,kw) == -1) EXIT_DEPARSE (); + ase_cstr_t kw; + + ase_awk_getkw (awk, KW_BEGIN, &kw); + + if (ase_awk_putsrcstrx (awk, kw.ptr, kw.len) == -1) EXIT_DEPARSE (); if (ase_awk_putsrcstr (awk, ASE_T(" ")) == -1) EXIT_DEPARSE (); if (ase_awk_prnnde (awk, nde) == -1) EXIT_DEPARSE (); @@ -5669,8 +5678,11 @@ static int deparse (ase_awk_t* awk) for (nde = awk->tree.end; nde != ASE_NULL; nde = nde->next) { - const ase_char_t* kw = ase_awk_getkw(awk,ASE_T("END")); - if (ase_awk_putsrcstr(awk,kw) == -1) EXIT_DEPARSE (); + ase_cstr_t kw; + + ase_awk_getkw (awk, KW_END, &kw); + + if (ase_awk_putsrcstrx (awk, kw.ptr, kw.len) == -1) EXIT_DEPARSE (); if (ase_awk_putsrcstr (awk, ASE_T(" ")) == -1) EXIT_DEPARSE (); if (ase_awk_prnnde (awk, nde) == -1) EXIT_DEPARSE (); @@ -5703,15 +5715,15 @@ exit_deparse: -static int deparse_func (ase_map_pair_t* pair, void* arg) +static ase_map_walk_t deparse_func (ase_map_t* map, ase_map_pair_t* pair, void* arg) { struct deparse_func_t* df = (struct deparse_func_t*)arg; /* CHECK: */ - ase_awk_afn_t* afn = (ase_awk_afn_t*)pair->vptr; + ase_awk_afn_t* afn = (ase_awk_afn_t*)ASE_MAP_VPTR(pair); ase_size_t i, n; ase_cstr_t kw; - ASE_ASSERT (ase_strxncmp (ASE_PAIR_KEYPTR(pair), ASE_PAIR_KEYLEN(pair), afn->name, afn->name_len) == 0); + ASE_ASSERT (ase_strxncmp (ASE_PAIR_KEYPTR(pair), ASE_PAIR_KEYLEN(pair), afn->name.ptr, afn->name.len) == 0); #define PUT_C(x,c) \ if (put_char(x->awk,c)==-1) { \ @@ -5729,10 +5741,10 @@ static int deparse_func (ase_map_pair_t* pair, void* arg) } ase_awk_getkw (df->awk, KW_FUNCTION, &kw); - PUT_SX (df, kw->ptr, kw->len)); + PUT_SX (df, kw.ptr, kw.len); PUT_C (df, ASE_T(' ')); - PUT_S (df, afn->name); + PUT_SX (df, afn->name.ptr, afn->name.len); PUT_S (df, ASE_T(" (")); for (i = 0; i < afn->nargs; ) diff --git a/ase/lib/awk/run.c b/ase/lib/awk/run.c index c7136485..68cbd838 100644 --- a/ase/lib/awk/run.c +++ b/ase/lib/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c 372 2008-09-23 09:51:24Z baconevi $ + * $Id: run.c 381 2008-09-24 11:07:24Z baconevi $ * * {License} */ @@ -264,8 +264,8 @@ static int set_global ( /* global variable */ ase_cstr_t errarg; - errarg.ptr = var->id.name; - errarg.len = var->id.name_len; + errarg.ptr = var->id.name.ptr; + errarg.len = var->id.name.len; ase_awk_setrunerror (run, ASE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); @@ -768,24 +768,24 @@ static int init_run ( run->inrec.nflds = 0; run->inrec.maxflds = 0; run->inrec.d0 = ase_awk_val_nil; - if (ase_str_open ( - &run->inrec.line, DEF_BUF_CAPA, MMGR(run)) == ASE_NULL) + if (ase_str_init ( + &run->inrec.line, MMGR(run), DEF_BUF_CAPA) == ASE_NULL) { ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return -1; } - if (ase_str_open (&run->format.out, 256, MMGR(run)) == ASE_NULL) + if (ase_str_init (&run->format.out, MMGR(run), 256) == ASE_NULL) { - ase_str_close (&run->inrec.line); + ase_str_fini (&run->inrec.line); ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return -1; } - if (ase_str_open (&run->format.fmt, 256, MMGR(run)) == ASE_NULL) + if (ase_str_init (&run->format.fmt, MMGR(run), 256) == ASE_NULL) { - ase_str_close (&run->format.out); - ase_str_close (&run->inrec.line); + ase_str_fini (&run->format.out); + ase_str_fini (&run->inrec.line); ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return -1; } @@ -794,9 +794,9 @@ static int init_run ( run, 1024, 70, free_namedval, same_namedval, MMGR(run)); if (run->named == ASE_NULL) { - ase_str_close (&run->format.fmt); - ase_str_close (&run->format.out); - ase_str_close (&run->inrec.line); + ase_str_fini (&run->format.fmt); + ase_str_fini (&run->format.out); + ase_str_fini (&run->inrec.line); ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return -1; } @@ -806,9 +806,9 @@ static int init_run ( if (run->format.tmp.ptr == ASE_NULL) { ase_map_close (run->named); - ase_str_close (&run->format.fmt); - ase_str_close (&run->format.out); - ase_str_close (&run->inrec.line); + ase_str_fini (&run->format.fmt); + ase_str_fini (&run->format.out); + ase_str_fini (&run->inrec.line); ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return -1; } @@ -823,9 +823,9 @@ static int init_run ( { ASE_AWK_FREE (run->awk, run->format.tmp.ptr); ase_map_close (run->named); - ase_str_close (&run->format.fmt); - ase_str_close (&run->format.out); - ase_str_close (&run->inrec.line); + ase_str_fini (&run->format.fmt); + ase_str_fini (&run->format.out); + ase_str_fini (&run->inrec.line); ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return -1; } @@ -923,8 +923,8 @@ static void deinit_run (ase_awk_run_t* run) ASE_AWK_FREE (run->awk, run->format.tmp.ptr); run->format.tmp.ptr = ASE_NULL; run->format.tmp.len = 0; - ase_str_close (&run->format.fmt); - ase_str_close (&run->format.out); + ase_str_fini (&run->format.fmt); + ase_str_fini (&run->format.out); /* destroy input record. ase_awk_clrrec should be called * before the run stack has been destroyed because it may try @@ -936,7 +936,7 @@ static void deinit_run (ase_awk_run_t* run) run->inrec.flds = ASE_NULL; run->inrec.maxflds = 0; } - ase_str_close (&run->inrec.line); + ase_str_fini (&run->inrec.line); /* destroy run stack */ if (run->stack != ASE_NULL) @@ -2449,7 +2449,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde) "if a named variable has an index part and a named indexed variable doesn't have an index part, the program is definitely wrong"); pair = ase_map_search ( - run->named, var->id.name, var->id.name_len); + run->named, var->id.name.ptr, var->id.name.len); if (pair == ASE_NULL) { ase_awk_val_t* tmp; @@ -2466,7 +2466,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde) } pair = ase_map_upsert (run->named, - var->id.name, var->id.name_len, tmp); + var->id.name.ptr, var->id.name.len, tmp); if (pair == ASE_NULL) { ase_awk_refupval (run, tmp); @@ -2495,7 +2495,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde) ase_cstr_t errarg; errarg.ptr = var->id.name; - errarg.len = var->id.name_len; + errarg.len = var->id.name.len; ase_awk_setrunerror ( run, ASE_AWK_ENOTDEL, var->line, @@ -2619,7 +2619,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde) ase_cstr_t errarg; errarg.ptr = var->id.name; - errarg.len = var->id.name_len; + errarg.len = var->id.name.len; ase_awk_setrunerror ( run, ASE_AWK_ENOTDEL, var->line, @@ -2701,7 +2701,7 @@ static int run_reset (ase_awk_run_t* run, ase_awk_nde_reset_t* nde) /* a named variable can be reset if removed from a internal map to manage it */ - ase_map_remove (run->named, var->id.name, var->id.name_len); + ase_map_remove (run->named, var->id.name.ptr, var->id.name.len); } else if (var->type == ASE_AWK_NDE_GLOBAL || var->type == ASE_AWK_NDE_LOCAL || @@ -3328,7 +3328,7 @@ static ase_awk_val_t* do_assignment_scalar ( int n; pair = ase_map_search ( - run->named, var->id.name, var->id.name_len); + run->named, var->id.name.ptr, var->id.name.len); if (pair != ASE_NULL && ((ase_awk_val_t*)pair->val)->type == ASE_AWK_VAL_MAP) { @@ -3337,7 +3337,7 @@ static ase_awk_val_t* do_assignment_scalar ( ase_cstr_t errarg; errarg.ptr = var->id.name; - errarg.len = var->id.name_len; + errarg.len = var->id.name.len; ase_awk_setrunerror (run, ASE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); @@ -3345,7 +3345,7 @@ static ase_awk_val_t* do_assignment_scalar ( } n = ase_map_upsertx (run->named, - var->id.name, var->id.name_len, val, ASE_NULL); + var->id.name.ptr, var->id.name.len, val, ASE_NULL); if (n < 0) { ase_awk_setrunerror ( @@ -3374,7 +3374,7 @@ static ase_awk_val_t* do_assignment_scalar ( ase_cstr_t errarg; errarg.ptr = var->id.name; - errarg.len = var->id.name_len; + errarg.len = var->id.name.len; ase_awk_setrunerror (run, ASE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); @@ -3395,7 +3395,7 @@ static ase_awk_val_t* do_assignment_scalar ( ase_cstr_t errarg; errarg.ptr = var->id.name; - errarg.len = var->id.name_len; + errarg.len = var->id.name.len; ase_awk_setrunerror (run, ASE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); @@ -3430,7 +3430,7 @@ static ase_awk_val_t* do_assignment_map ( { ase_map_pair_t* pair; pair = ase_map_search ( - run->named, var->id.name, var->id.name_len); + run->named, var->id.name.ptr, var->id.name.len); map = (pair == ASE_NULL)? (ase_awk_val_map_t*)ase_awk_val_nil: (ase_awk_val_map_t*)pair->val; @@ -3463,7 +3463,7 @@ static ase_awk_val_t* do_assignment_map ( * of the previous value here as it is done by * ase_map_upsert */ if (ase_map_upsert (run->named, - var->id.name, var->id.name_len, tmp) == ASE_NULL) + var->id.name.ptr, var->id.name.len, tmp) == ASE_NULL) { ase_awk_refupval (run, tmp); ase_awk_refdownval (run, tmp); @@ -5738,15 +5738,15 @@ static int get_reference ( ase_map_pair_t* pair; pair = ase_map_search ( - run->named, tgt->id.name, tgt->id.name_len); + run->named, tgt->id.name.ptr, tgt->id.name.len); if (pair == ASE_NULL) { /* it is bad that the named variable has to be * created in the function named "__get_refernce". * would there be any better ways to avoid this? */ pair = ase_map_upsert ( - run->named, tgt->id.name, - tgt->id.name_len, ase_awk_val_nil); + run->named, tgt->id.name.ptr, + tgt->id.name.len, ase_awk_val_nil); if (pair == ASE_NULL) { ase_awk_setrunerror ( @@ -5783,12 +5783,12 @@ static int get_reference ( ase_map_pair_t* pair; pair = ase_map_search ( - run->named, tgt->id.name, tgt->id.name_len); + run->named, tgt->id.name.ptr, tgt->id.name.len); if (pair == ASE_NULL) { pair = ase_map_upsert ( - run->named, tgt->id.name, - tgt->id.name_len, ase_awk_val_nil); + run->named, tgt->id.name.ptr, + tgt->id.name.len, ase_awk_val_nil); if (pair == ASE_NULL) { ase_awk_setrunerror ( @@ -5997,8 +5997,8 @@ static ase_awk_val_t* eval_named (ase_awk_run_t* run, ase_awk_nde_t* nde) ase_map_pair_t* pair; pair = ase_map_search (run->named, - ((ase_awk_nde_var_t*)nde)->id.name, - ((ase_awk_nde_var_t*)nde)->id.name_len); + ((ase_awk_nde_var_t*)nde)->id.name.ptr, + ((ase_awk_nde_var_t*)nde)->id.name.len); return (pair == ASE_NULL)? ase_awk_val_nil: pair->val; } @@ -6071,11 +6071,11 @@ static ase_awk_val_t* eval_namedidx (ase_awk_run_t* run, ase_awk_nde_t* nde) ase_awk_nde_var_t* tgt = (ase_awk_nde_var_t*)nde; ase_map_pair_t* pair; - pair = ase_map_search (run->named, tgt->id.name, tgt->id.name_len); + pair = ase_map_search (run->named, tgt->id.name.ptr, tgt->id.name.len); if (pair == ASE_NULL) { pair = ase_map_upsert (run->named, - tgt->id.name, tgt->id.name_len, ase_awk_val_nil); + tgt->id.name.ptr, tgt->id.name.len, ase_awk_val_nil); if (pair == ASE_NULL) { ase_awk_setrunerror ( @@ -6207,7 +6207,7 @@ static ase_awk_val_t* eval_getline (ase_awk_run_t* run, ase_awk_nde_t* nde) dst = (in == ASE_NULL)? ASE_T(""): in; /* TODO: optimize the line buffer management */ - if (ase_str_open (&buf, DEF_BUF_CAPA, MMGR(run)) == ASE_NULL) + if (ase_str_init (&buf, MMGR(run), DEF_BUF_CAPA) == ASE_NULL) { if (in != ASE_NULL) ASE_AWK_FREE (run->awk, in); ase_awk_setrunerror ( @@ -6233,11 +6233,11 @@ static ase_awk_val_t* eval_getline (ase_awk_run_t* run, ase_awk_nde_t* nde) ASE_STR_PTR(&buf), ASE_STR_LEN(&buf)) == -1) { - ase_str_close (&buf); + ase_str_fini (&buf); return ASE_NULL; } - ase_str_close (&buf); + ase_str_fini (&buf); } else { @@ -6245,7 +6245,7 @@ static ase_awk_val_t* eval_getline (ase_awk_run_t* run, ase_awk_nde_t* nde) v = ase_awk_makestrval (run, ASE_STR_PTR(&buf), ASE_STR_LEN(&buf)); - ase_str_close (&buf); + ase_str_fini (&buf); if (v == ASE_NULL) { run->errlin = nde->line; @@ -6263,7 +6263,7 @@ static ase_awk_val_t* eval_getline (ase_awk_run_t* run, ase_awk_nde_t* nde) } else { - ase_str_close (&buf); + ase_str_fini (&buf); } skip_read: @@ -6386,8 +6386,8 @@ static int shorten_record (ase_awk_run_t* run, ase_size_t nflds) } } - if (ase_str_open ( - &tmp, ASE_STR_LEN(&run->inrec.line), MMGR(run)) == ASE_NULL) + if (ase_str_init ( + &tmp, MMGR(run), ASE_STR_LEN(&run->inrec.line)) == ASE_NULL) { ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); return -1; @@ -6429,7 +6429,7 @@ static int shorten_record (ase_awk_run_t* run, ase_size_t nflds) ase_awk_refupval (run, run->inrec.d0); ase_str_swap (&tmp, &run->inrec.line); - ase_str_close (&tmp); + ase_str_fini (&tmp); for (i = nflds; i < run->inrec.nflds; i++) { diff --git a/ase/lib/awk/tree.c b/ase/lib/awk/tree.c index 0e8df970..12448616 100644 --- a/ase/lib/awk/tree.c +++ b/ase/lib/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c 363 2008-09-04 10:58:08Z baconevi $ + * $Id: tree.c 381 2008-09-24 11:07:24Z baconevi $ * * {License} */ @@ -372,7 +372,7 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) ASE_ASSERT (px->id.idxa == (ase_size_t)-1); ASE_ASSERT (px->idx == ASE_NULL); - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); break; } @@ -382,7 +382,7 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) ASE_ASSERT (px->id.idxa == (ase_size_t)-1); ASE_ASSERT (px->idx != ASE_NULL); - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); PUT_SRCSTR (awk, ASE_T("[")); PRINT_EXPRESSION_LIST (awk, px->idx); PUT_SRCSTR (awk, ASE_T("]")); @@ -401,12 +401,12 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) { /* no implicit(named) variable is allowed. * use the actual name */ - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); } else if (px->id.idxa < awk->tree.nbglobals) { /* static global variables */ - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); } else { @@ -422,7 +422,7 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) } else { - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); } ASE_ASSERT (px->idx == ASE_NULL); break; @@ -439,12 +439,12 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) { /* no implicit(named) variable is allowed. * use the actual name */ - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); } else if (px->id.idxa < awk->tree.nbglobals) { /* static global variables */ - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); } else { @@ -461,7 +461,7 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) } else { - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); PUT_SRCSTR (awk, ASE_T("[")); } ASE_ASSERT (px->idx != ASE_NULL); @@ -485,7 +485,7 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) } else { - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); } ASE_ASSERT (px->idx == ASE_NULL); break; @@ -507,7 +507,7 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) } else { - PUT_SRCSTRX (awk, px->id.name, px->id.name_len); + PUT_SRCSTRX (awk, px->id.name.ptr, px->id.name.len); PUT_SRCSTR (awk, ASE_T("[")); } ASE_ASSERT (px->idx != ASE_NULL); @@ -1217,8 +1217,8 @@ void ase_awk_clrpt (ase_awk_t* awk, ase_awk_nde_t* tree) { ase_awk_nde_var_t* px = (ase_awk_nde_var_t*)p; ASE_ASSERT (px->idx == ASE_NULL); - if (px->id.name != ASE_NULL) - ASE_AWK_FREE (awk, px->id.name); + if (px->id.name.ptr != ASE_NULL) + ASE_AWK_FREE (awk, px->id.name.ptr); ASE_AWK_FREE (awk, p); break; } @@ -1231,8 +1231,8 @@ void ase_awk_clrpt (ase_awk_t* awk, ase_awk_nde_t* tree) ase_awk_nde_var_t* px = (ase_awk_nde_var_t*)p; ASE_ASSERT (px->idx != ASE_NULL); ase_awk_clrpt (awk, px->idx); - if (px->id.name != ASE_NULL) - ASE_AWK_FREE (awk, px->id.name); + if (px->id.name.ptr != ASE_NULL) + ASE_AWK_FREE (awk, px->id.name.ptr); ASE_AWK_FREE (awk, p); break; } diff --git a/ase/lib/awk/tree.h b/ase/lib/awk/tree.h index f328884e..1dbd6d78 100644 --- a/ase/lib/awk/tree.h +++ b/ase/lib/awk/tree.h @@ -1,5 +1,5 @@ /* - * $Id: tree.h 363 2008-09-04 10:58:08Z baconevi $ + * $Id: tree.h 381 2008-09-24 11:07:24Z baconevi $ * * {License} */ @@ -129,8 +129,7 @@ typedef struct ase_awk_nde_print_t ase_awk_nde_print_t; struct ase_awk_afn_t { - ase_char_t* name; - ase_size_t name_len; + ase_xstr_t name; ase_size_t nargs; ase_awk_nde_t* body; }; @@ -239,9 +238,8 @@ struct ase_awk_nde_var_t ASE_AWK_NDE_HDR; struct { - ase_char_t* name; - ase_size_t name_len; - ase_size_t idxa; + ase_xstr_t name; + ase_size_t idxa; } id; ase_awk_nde_t* idx; /* ASE_NULL for non-XXXXIDX */ }; @@ -254,30 +252,18 @@ struct ase_awk_nde_call_t { struct { - struct - { - ase_char_t* ptr; - ase_size_t len; - } name; + ase_xstr_t name; } afn; /* minimum information of a intrinsic function * needed during run-time. */ struct { - struct - { - ase_char_t* ptr; - ase_size_t len; - } name; + ase_xstr_t name; /* original name. if ase_awk_setword has been * invoked, oname can be different from name */ - struct - { - ase_char_t* ptr; - ase_size_t len; - } oname; + ase_xstr_t oname; struct { diff --git a/ase/lib/awk/val.c b/ase/lib/awk/val.c index 191de09f..8c5b63bd 100644 --- a/ase/lib/awk/val.c +++ b/ase/lib/awk/val.c @@ -1,5 +1,5 @@ /* - * $Id: val.c 380 2008-09-24 08:16:41Z baconevi $ + * $Id: val.c 381 2008-09-24 11:07:24Z baconevi $ * * {License} */ @@ -457,8 +457,10 @@ ase_awk_val_t* ase_awk_makemapval (ase_awk_run_t* run) { ase_awk_val_map_t* val; + /* CHECK */ + /* val = (ase_awk_val_map_t*) ASE_AWK_ALLOC ( - run->awk, ASE_SIZEOF(ase_awk_val_map_t)); + run->awk, ASE_SIZEOF(ase_awk_val_map_t) ); if (val == ASE_NULL) { ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); @@ -467,8 +469,6 @@ ase_awk_val_t* ase_awk_makemapval (ase_awk_run_t* run) val->type = ASE_AWK_VAL_MAP; val->ref = 0; - /* CHECK */ - /* val->map = ase_map_open ( run, 256, 70, free_mapval, same_mapval, run->awk->mmgr); if (val->map == ASE_NULL) @@ -478,7 +478,23 @@ ase_awk_val_t* ase_awk_makemapval (ase_awk_run_t* run) return ASE_NULL; } */ - val->map = ase_map_open (run->awk->mmgr, ASE_SIZEOF(run), 256, 70); + + val = (ase_awk_val_map_t*) ASE_AWK_ALLOC ( + run->awk, + ASE_SIZEOF(ase_awk_val_map_t) + + ASE_SIZEOF(ase_map_t) + + ASE_SIZEOF(run)); + if (val == ASE_NULL) + { + ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); + return ASE_NULL; + } + + val->type = ASE_AWK_VAL_MAP; + val->ref = 0; + val->map = (ase_map_t*)(val + 1); + + val->map = ase_map_init (val->map, run->awk->mmgr, 256, 70); if (val->map == ASE_NULL) { ASE_AWK_FREE (run->awk, val); @@ -613,7 +629,10 @@ void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache) } else if (val->type == ASE_AWK_VAL_MAP) { - ase_map_close (((ase_awk_val_map_t*)val)->map); + /* CHECK */ + /* ase_map_close (((ase_awk_val_map_t*)val)->map);*/ + ase_map_fini (((ase_awk_val_map_t*)val)->map); + /* END CHECK */ ASE_AWK_FREE (run->awk, val); } else if (val->type == ASE_AWK_VAL_REF)