From f90fffc85325a5f5c3cf59fbed61e8a8bf691119 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 5 Sep 2008 04:58:08 +0000 Subject: [PATCH] --- ase/include/ase/cmn/str.h | 56 +++++++++- ase/include/ase/types.h | 32 ++---- ase/include/ase/utl/makefile.am | 2 +- ase/lib/awk/Awk.cpp | 20 ++-- ase/lib/awk/awk.c | 181 ++++++++++++-------------------- ase/lib/awk/extio.h | 10 +- ase/lib/awk/func.c | 54 +++++----- ase/lib/awk/func.h | 10 +- ase/lib/awk/jni.c | 16 +-- ase/lib/awk/jni.h | 6 +- ase/lib/awk/misc.h | 10 +- ase/lib/awk/parse.c | 117 +++++++++++++-------- ase/lib/awk/parse.h | 39 +++++-- ase/lib/awk/run.c | 61 ++++++----- ase/lib/awk/run.h | 10 +- ase/lib/awk/tab.h | 6 +- ase/lib/awk/tree.c | 71 +++++++++---- ase/lib/awk/tree.h | 10 +- ase/lib/awk/val.c | 31 +++--- ase/lib/cmn/str_dyn.c | 108 ++++++++++++++----- 20 files changed, 487 insertions(+), 363 deletions(-) diff --git a/ase/include/ase/cmn/str.h b/ase/include/ase/cmn/str.h index f1cee694..90107cb8 100644 --- a/ase/include/ase/cmn/str.h +++ b/ase/include/ase/cmn/str.h @@ -1,5 +1,5 @@ /* - * $Id: str.h 352 2008-08-31 10:55:59Z baconevi $ + * $Id: str.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -21,6 +21,8 @@ typedef struct ase_str_t ase_str_t; struct ase_str_t { ase_mmgr_t* mmgr; + ase_sizer_t sizer; + ase_char_t* buf; ase_size_t size; ase_size_t capa; @@ -216,6 +218,58 @@ int ase_str_yield ( int new_capa /* new capacity in number of characters */ ); +/* + * NAME: get the sizer + * + * DESCRIPTION: + * The ase_str_getsizer() function returns the sizer specified. + * + * RETURNS: a sizer function set or ASE_NULL if no sizer is set. + */ +ase_sizer_t ase_str_getsizer ( + ase_str_t* str /* a dynamic string */ +); + +/* + * NAME: specify a sizer + * + * DESCRIPTION: + * The ase_str_setsizer() function specify a new sizer for a dynamic string. + * With no sizer specified, the dynamic string doubles the current buffer + * when it needs to increase its size. + */ +void ase_str_setsizer ( + ase_str_t* str /* a dynamic string */, + ase_sizer_t sizer /* a sizer function */ +); + +/* + * NAME: get capacity + * + * DESCRIPTION: + * The ase_str_getcapa() function returns the current capacity. + * + * RETURNS: the current capacity in number of characters. + */ +ase_size_t ase_str_getcapa ( + ase_str_t* str /* a dynamic string */ +); + +/* + * NAME: set new capacity + * + * DESCRIPTION: + * The ase_str_setcapa() function set new capacity. If the new capacity + * is smaller than the old, the overflowing characters are removed from + * from the buffer. + * + * RETURNS: -1 on failure, a new capacity on success + */ +ase_size_t ase_str_setcapa ( + ase_str_t* str /* a dynamic string */, + ase_size_t capa /* a new capacity */ +); + void ase_str_clear (ase_str_t* str); void ase_str_swap (ase_str_t* str, ase_str_t* str2); diff --git a/ase/include/ase/types.h b/ase/include/ase/types.h index 1b7bd605..742e1e17 100644 --- a/ase/include/ase/types.h +++ b/ase/include/ase/types.h @@ -1,5 +1,5 @@ /* - * $Id: types.h 354 2008-08-31 10:57:24Z baconevi $ + * $Id: types.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -345,26 +345,6 @@ struct ase_mmgr_t void* data; }; -/* -struct ase_ccls_t -{ - ase_isccls_t is_upper; - ase_isccls_t is_lower; - ase_isccls_t is_alpha; - ase_isccls_t is_digit; - ase_isccls_t is_xdigit; - ase_isccls_t is_alnum; - ase_isccls_t is_space; - ase_isccls_t is_print; - ase_isccls_t is_graph; - ase_isccls_t is_cntrl; - ase_isccls_t is_punct; - ase_toccls_t to_upper; - ase_toccls_t to_lower; - void* data; -}; -*/ - struct ase_ccls_t { ase_bool_t (*is) (void* data, ase_cint_t c, int type); @@ -372,4 +352,14 @@ struct ase_ccls_t void* data; }; + +/* + * NAME: determine the size of data + * + * DESCRIPTION: + * The ase_sizer_t is a generic type used by many other modules usually to + * get the new size for resizing data structure. + */ +typedef ase_size_t (*ase_sizer_t) (void* data); + #endif diff --git a/ase/include/ase/utl/makefile.am b/ase/include/ase/utl/makefile.am index 425dad32..0f99fb16 100644 --- a/ase/include/ase/utl/makefile.am +++ b/ase/include/ase/utl/makefile.am @@ -1,5 +1,5 @@ -pkginclude_HEADERS = helper.h ctype.h getopt.h http.h main.h stdio.h +pkginclude_HEADERS = http.h main.h stdio.h pkgincludedir= $(includedir)/ase/utl diff --git a/ase/lib/awk/Awk.cpp b/ase/lib/awk/Awk.cpp index b0b75cc7..efad7f29 100644 --- a/ase/lib/awk/Awk.cpp +++ b/ase/lib/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp 341 2008-08-20 10:58:19Z baconevi $ + * $Id: Awk.cpp 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -417,7 +417,7 @@ int Awk::Argument::getIndexed ( // get the value from the map. ase_awk_val_map_t* m = (ase_awk_val_map_t*)this->val; - pair_t* pair = ase_map_get (m->map, idxptr, idxlen); + pair_t* pair = ase_map_search (m->map, idxptr, idxlen); // the key is not found. it is not an error. val is just nil if (pair == ASE_NULL) return 0; @@ -461,7 +461,7 @@ int Awk::Argument::getIndexed (long_t idx, Argument& val) const // get the value from the map. ase_awk_val_map_t* m = (ase_awk_val_map_t*)this->val; - pair_t* pair = ase_map_get (m->map, ri, rl); + pair_t* pair = ase_map_search (m->map, ri, rl); // the key is not found. it is not an error. val is just nil if (pair == ASE_NULL) return 0; @@ -616,7 +616,7 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, long_t v) ase_awk_refupval (this->run->run, x2); - pair_t* pair = ase_map_put ( + pair_t* pair = ase_map_upsert ( ((ase_awk_val_map_t*)x)->map, idx, iln, x2); if (pair == ASE_NULL) { @@ -636,7 +636,7 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, long_t v) ase_awk_refupval (this->run->run, x2); - pair_t* pair = ase_map_put ( + pair_t* pair = ase_map_upsert ( ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); if (pair == ASE_NULL) { @@ -677,7 +677,7 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, real_t v) ase_awk_refupval (this->run->run, x2); - pair_t* pair = ase_map_put ( + pair_t* pair = ase_map_upsert ( ((ase_awk_val_map_t*)x)->map, idx, iln, x2); if (pair == ASE_NULL) { @@ -697,7 +697,7 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, real_t v) ase_awk_refupval (this->run->run, x2); - pair_t* pair = ase_map_put ( + pair_t* pair = ase_map_upsert ( ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); if (pair == ASE_NULL) { @@ -738,7 +738,7 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, const char_t* str, s ase_awk_refupval (this->run->run, x2); - pair_t* pair = ase_map_put ( + pair_t* pair = ase_map_upsert ( ((ase_awk_val_map_t*)x)->map, idx, iln, x2); if (pair == ASE_NULL) { @@ -758,7 +758,7 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, const char_t* str, s ase_awk_refupval (this->run->run, x2); - pair_t* pair = ase_map_put ( + pair_t* pair = ase_map_upsert ( ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); if (pair == ASE_NULL) { @@ -1464,7 +1464,7 @@ int Awk::addFunction ( return -1; } - pair_t* pair = ase_map_put (functionMap, name, nameLen, tmp); + pair_t* pair = ase_map_upsert (functionMap, name, nameLen, tmp); if (pair == ASE_NULL) { ase_awk_delfunc (awk, name, nameLen); diff --git a/ase/lib/awk/awk.c b/ase/lib/awk/awk.c index f6e529ab..67c93ebc 100644 --- a/ase/lib/awk/awk.c +++ b/ase/lib/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 349 2008-08-28 14:21:25Z baconevi $ + * $Id: awk.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -11,11 +11,8 @@ #include "awk.h" -static void free_word (void* awk, void* ptr); -static void free_afn (void* awk, void* afn); -static void free_bfn (void* awk, void* afn); - #define SETERR(awk,code) ase_awk_seterrnum(awk,code) + #define SETERRARG(awk,code,line,arg,leng) \ do { \ ase_cstr_t errarg; \ @@ -24,15 +21,27 @@ static void free_bfn (void* awk, void* afn); ase_awk_seterror ((awk), (code), (line), &errarg, 1); \ } while (0) -static void init_map (ase_map_t* map, void* arg) +static void free_afn (ase_map_t* map, void* vptr, ase_size_t vlen) { - ase_awk_t** p = ase_map_getextension (map); - *p = arg; + ase_awk_t* awk = *(ase_awk_t**)ase_map_getextension(map); + ase_awk_afn_t* f = (ase_awk_afn_t*)vptr; + + /* f->name doesn't have to be freed */ + /*ASE_AWK_FREE (awk, f->name);*/ + + ase_awk_clrpt (awk, f->body); + ASE_AWK_FREE (awk, f); } -ase_awk_t* ase_awk_open ( - ase_mmgr_t* mmgr, ase_size_t ext, - void (*init) (ase_awk_t*, void*), void* init_data) +static void free_bfn (ase_map_t* map, void* vptr, ase_size_t vlen) +{ + ase_awk_t* awk = *(ase_awk_t**)ase_map_getextension(map); + ase_awk_bfn_t* f = (ase_awk_bfn_t*)vptr; + + ASE_AWK_FREE (awk, f); +} + +ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) { ase_awk_t* awk; @@ -58,19 +67,18 @@ ase_awk_t* ase_awk_open ( return ASE_NULL; } - /*awk->wtab = ase_map_open (awk, 512, 70, free_word, ASE_NULL, mmgr);*/ - awk->wtab = ase_map_open ( - mmgr, sizeof(awk), init_map, awk, 512, 70); + awk->wtab = ase_map_open (mmgr, sizeof(awk), 512, 70); if (awk->wtab == ASE_NULL) { ase_str_close (&awk->token.name); ASE_AWK_FREE (awk, awk); return ASE_NULL; } + *(ase_awk_t**)ase_map_getextension(awk->wtab) = awk; + ase_map_setcopier (awk->wtab, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); + ase_map_setcopier (awk->wtab, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); - /*awk->rwtab = ase_map_open (awk, 512, 70, free_word, ASE_NULL, mmgr);*/ - awk->rwtab = ase_map_open ( - mmgr, sizeof(awk), init_map, awk, 512, 70); + awk->rwtab = ase_map_open (mmgr, sizeof(awk), 512, 70); if (awk->rwtab == ASE_NULL) { ase_map_close (awk->wtab); @@ -78,12 +86,13 @@ ase_awk_t* ase_awk_open ( ASE_AWK_FREE (awk, awk); return ASE_NULL; } + *(ase_awk_t**)ase_map_getextension(awk->rwtab) = awk; + ase_map_setcopier (awk->rwtab, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); + ase_map_setcopier (awk->rwtab, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); /* TODO: initial map size?? */ /*awk->tree.afns = ase_map_open (awk, 512, 70, free_afn, ASE_NULL, mmgr);*/ - - awk->tree.afns = ase_map_open ( - mmgr, sizeof(awk), init_map, awk, 512, 70); + awk->tree.afns = ase_map_open (mmgr, sizeof(awk), 512, 70); if (awk->tree.afns == ASE_NULL) { ase_map_close (awk->rwtab); @@ -92,10 +101,11 @@ ase_awk_t* ase_awk_open ( ASE_AWK_FREE (awk, awk); return ASE_NULL; } + *(ase_awk_t**)ase_map_getextension(awk->tree.afns) = awk; + ase_map_setfreeer (awk->tree.afns, ASE_MAP_VAL, free_afn); /*awk->parse.afns = ase_map_open (awk, 256, 70, ASE_NULL, ASE_NULL, mmgr);*/ - awk->parse.afns = ase_map_open ( - mmgr, sizeof(awk), init_map, awk, 256, 70); + awk->parse.afns = ase_map_open (mmgr, sizeof(awk), 256, 70); if (awk->parse.afns == ASE_NULL) { ase_map_close (awk->tree.afns); @@ -105,10 +115,10 @@ ase_awk_t* ase_awk_open ( ASE_AWK_FREE (awk, awk); return ASE_NULL; } + *(ase_awk_t**)ase_map_getextension(awk->parse.afns) = awk; /*awk->parse.named = ase_map_open (awk, 256, 70, ASE_NULL, ASE_NULL, mmgr);*/ - awk->parse.named = ase_map_open ( - mmgr, sizeof(awk), init_map, awk, 256, 70); + awk->parse.named = ase_map_open (mmgr, sizeof(awk), 256, 70); if (awk->parse.named == ASE_NULL) { ase_map_close (awk->parse.afns); @@ -119,6 +129,7 @@ ase_awk_t* ase_awk_open ( ASE_AWK_FREE (awk, awk); return ASE_NULL; } + *(ase_awk_t**)ase_map_getextension(awk->parse.named) = awk; if (ase_awk_tab_open (&awk->parse.globals, awk) == ASE_NULL) { @@ -193,8 +204,7 @@ ase_awk_t* ase_awk_open ( awk->bfn.sys = ASE_NULL; /*awk->bfn.user = ASE_NULL;*/ /*awk->bfn.user = ase_map_open (awk, 512, 70, free_bfn, ASE_NULL, mmgr);*/ - awk->bfn.user = ase_map_open ( - mmgr, sizeof(awk), init_map, awk, 512, 70); + awk->bfn.user = ase_map_open (mmgr, sizeof(awk), 512, 70); if (awk->bfn.user == ASE_NULL) { ase_awk_tab_close (&awk->parse.params); @@ -209,6 +219,8 @@ ase_awk_t* ase_awk_open ( ASE_AWK_FREE (awk, awk); return ASE_NULL; } + *(ase_awk_t**)ase_map_getextension(awk->bfn.user) = awk; + ase_map_setfreeer (awk->bfn.user, ASE_MAP_VAL, free_bfn); awk->parse.depth.cur.block = 0; awk->parse.depth.cur.loop = 0; @@ -239,31 +251,9 @@ ase_awk_t* ase_awk_open ( return ASE_NULL; } - if (init) init (awk, init_data); return awk; } -static void free_word (void* owner, void* ptr) -{ - ASE_AWK_FREE ((ase_awk_t*)owner, ptr); -} - -static void free_afn (void* owner, void* afn) -{ - ase_awk_afn_t* f = (ase_awk_afn_t*)afn; - - /* f->name doesn't have to be freed */ - /*ASE_AWK_FREE ((ase_awk_t*)owner, f->name);*/ - - ase_awk_clrpt ((ase_awk_t*)owner, f->body); - ASE_AWK_FREE ((ase_awk_t*)owner, f); -} - -static void free_bfn (void* owner, void* bfn) -{ - ase_awk_bfn_t* f = (ase_awk_bfn_t*)bfn; - ASE_AWK_FREE ((ase_awk_t*)owner, f); -} int ase_awk_close (ase_awk_t* awk) { @@ -443,7 +433,7 @@ int ase_awk_getword (ase_awk_t* awk, { ase_map_pair_t* p; - p = ase_map_get (awk->wtab, okw, olen); + p = ase_map_search (awk->wtab, okw, olen); if (p == ASE_NULL) return -1; *nkw = ((ase_cstr_t*)p->vptr)->ptr; @@ -452,6 +442,28 @@ int ase_awk_getword (ase_awk_t* awk, return 0; } +int ase_awk_unsetword (ase_awk_t* awk, const ase_char_t* kw, ase_size_t len) +{ + ase_map_pair_t* p; + + p = ase_map_search (awk->wtab, kw, ASE_NCHARS_TO_NBYTES(len)); + if (p == ASE_NULL) + { + SETERRARG (awk, ASE_AWK_ENOENT, 0, kw, len); + return -1; + } + + ase_map_delete (awk->rwtab, ASE_MAP_VPTR(p), ASE_MAP_VLEN(p)); + ase_map_delete (awk->wtab, kw, ASE_NCHARS_TO_NBYTES(len)); + return 0; +} + +void ase_awk_unsetallwords (ase_awk_t* awk) +{ + ase_map_clear (awk->wtab); + ase_map_clear (awk->rwtab); +} + int ase_awk_setword (ase_awk_t* awk, const ase_char_t* okw, ase_size_t olen, const ase_char_t* nkw, ase_size_t nlen) @@ -465,25 +477,11 @@ int ase_awk_setword (ase_awk_t* awk, if (okw == ASE_NULL || olen == 0) { /* clear the entire table */ - ase_map_clear (awk->wtab); - ase_map_clear (awk->rwtab); + ase_awk_unsetallwords (awk); return 0; } - /* delete the word */ - p = ase_map_get (awk->wtab, okw, olen); - if (p != ASE_NULL) - { - ase_cstr_t* s = (ase_cstr_t*)p->vptr; - ase_map_remove (awk->rwtab, s->ptr, s->len); - ase_map_remove (awk->wtab, okw, olen); - return 0; - } - else - { - SETERRARG (awk, ASE_AWK_ENOENT, 0, okw, olen); - return -1; - } + return ase_awk_unsetword (awk, okw, olen); } else if (okw == ASE_NULL || olen == 0) { @@ -492,58 +490,19 @@ int ase_awk_setword (ase_awk_t* awk, } /* set the word */ -#if 0 - vn = (ase_cstr_t*) ASE_AWK_ALLOC ( - awk, ASE_SIZEOF(ase_cstr_t)+((nlen+1)*ASE_SIZEOF(*nkw))); - if (vn == ASE_NULL) + if (ase_map_upsert (awk->wtab, + (ase_char_t*)okw, ASE_NCHARS_TO_NBYTES(olen), + (ase_char_t*)nkw, ASE_NCHARS_TO_NBYTES(nlen)) == ASE_NULL) { SETERR (awk, ASE_AWK_ENOMEM); return -1; } - vn->len = nlen; - vn->ptr = (const ase_char_t*)(vn + 1); - ase_strncpy ((ase_char_t*)vn->ptr, nkw, nlen); - - vo = (ase_cstr_t*) ASE_AWK_ALLOC ( - awk, ASE_SIZEOF(ase_cstr_t)+((olen+1)*ASE_SIZEOF(*okw))); - if (vo == ASE_NULL) - { - ASE_AWK_FREE (awk, vn); - SETERR (awk, ASE_AWK_ENOMEM); - return -1; - } - vo->len = olen; - vo->ptr = (const ase_char_t*)(vo + 1); - ase_strncpy ((ase_char_t*)vo->ptr, okw, olen); - - if (ase_map_put (awk->wtab, (void*)okw, olen, vn) == ASE_NULL) - { - ASE_AWK_FREE (awk, vo); - ASE_AWK_FREE (awk, vn); - SETERR (awk, ASE_AWK_ENOMEM); - return -1; - } - if (ase_map_put (awk->rwtab, nkw, nlen, vo) == ASE_NULL) + if (ase_map_upsert (awk->rwtab, + (ase_char_t*)nkw, ASE_NCHARS_TO_NBYTES(nlen), + (ase_char_t*)okw, ASE_NCHARS_TO_NBYTES(olen)) == ASE_NULL) { - ase_map_remove (awk->wtab, okw, olen); - ASE_AWK_FREE (awk, vo); - SETERR (awk, ASE_AWK_ENOMEM); - return -1; - } -#endif - if (ase_map_put (awk->wtab, (void*)okw, olen, nkw, nlen) == ASE_NULL) - { - ASE_AWK_FREE (awk, vo); - ASE_AWK_FREE (awk, vn); - SETERR (awk, ASE_AWK_ENOMEM); - return -1; - } - - if (ase_map_put (awk->rwtab, nkw, nlen, okw, olen) == ASE_NULL) - { - ase_map_remove (awk->wtab, okw, olen); - ASE_AWK_FREE (awk, vo); + ase_map_delete (awk->wtab, okw, ASE_NCHARS_TO_NBYTES(olen)); SETERR (awk, ASE_AWK_ENOMEM); return -1; } diff --git a/ase/lib/awk/extio.h b/ase/lib/awk/extio.h index c0ec249b..76832de5 100644 --- a/ase/lib/awk/extio.h +++ b/ase/lib/awk/extio.h @@ -1,15 +1,11 @@ /* - * $Id: extio.h 115 2008-03-03 11:13:15Z baconevi $ + * $Id: extio.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_EXTIO_H_ -#define _ASE_AWK_EXTIO_H_ - -#ifndef _ASE_AWK_AWK_H_ -#error Never include this file directly. Include instead -#endif +#ifndef _ASE_LIB_AWK_EXTIO_H_ +#define _ASE_LIB_AWK_EXTIO_H_ #ifdef __cplusplus extern "C" diff --git a/ase/lib/awk/func.c b/ase/lib/awk/func.c index fb5cfe5c..16ebf514 100644 --- a/ase/lib/awk/func.c +++ b/ase/lib/awk/func.c @@ -1,5 +1,5 @@ /* - * $Id: func.c 337 2008-08-20 09:17:25Z baconevi $ + * $Id: func.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -98,7 +98,7 @@ void* ase_awk_addfunc ( bfn->handler = handler; - if (ase_map_put (awk->bfn.user, name, name_len, bfn) == ASE_NULL) + if (ase_map_upsert (awk->bfn.user, name, name_len, bfn) == ASE_NULL) { ASE_AWK_FREE (awk, bfn); ase_awk_seterrnum (awk, ASE_AWK_ENOMEM); @@ -144,12 +144,14 @@ ase_awk_bfn_t* ase_awk_getbfn ( if (bfn->valid != 0 && (awk->option & bfn->valid) != bfn->valid) continue; - pair = ase_map_get (awk->wtab, bfn->name.ptr, bfn->name.len); + pair = ase_map_search ( + awk->wtab, bfn->name.ptr, + ASE_NCHARS_TO_NBYTES(bfn->name.len)); if (pair != ASE_NULL) { /* found in the customized word table */ - k = ((ase_cstr_t*)(pair->val))->ptr; - l = ((ase_cstr_t*)(pair->val))->len; + k = ASE_MAP_VPTR(pair); + l = ASE_NBYTES_TO_NCHARS(ASE_MAP_VLEN(pair)); } else { @@ -164,21 +166,21 @@ ase_awk_bfn_t* ase_awk_getbfn ( * because I'm trying to support ase_awk_setword in * a very flimsy way here. Would it be better to drop * ase_awk_setword totally? */ - pair = ase_map_get (awk->rwtab, name, len); + pair = ase_map_search (awk->rwtab, name, ASE_NCHARS_TO_NBYTES(len)); if (pair != ASE_NULL) { /* the current name is a target name for * one of the original word. */ - k = ((ase_cstr_t*)(pair->val))->ptr; - l = ((ase_cstr_t*)(pair->val))->len; + k = ASE_MAP_VPTR(pair); + l = ASE_NBYTES_TO_NCHARS(ASE_MAP_VLEN(pair)); } else { - pair = ase_map_get (awk->wtab, name, len); + pair = ase_map_search (awk->wtab, name, ASE_NCHARS_TO_NBYTES(len)); if (pair != ASE_NULL) { - k = ((ase_cstr_t*)(pair->val))->ptr; - l = ((ase_cstr_t*)(pair->val))->len; + k = ASE_MAP_VPTR(pair); + l = ASE_NBYTES_TO_NCHARS(ASE_MAP_VLEN(pair)); if (ase_strxncmp (name, len, k, l) != 0) { @@ -202,7 +204,7 @@ ase_awk_bfn_t* ase_awk_getbfn ( } /* END NOTE */ - pair = ase_map_get (awk->bfn.user, k, l); + pair = ase_map_search (awk->bfn.user, k, ASE_NCHARS_TO_NBYTES(l)); if (pair == ASE_NULL) return ASE_NULL; bfn = (ase_awk_bfn_t*)pair->val; @@ -796,7 +798,7 @@ static int bfn_split ( * it is decremented if the assignement fails. */ ase_awk_refupval (run, t2); - if (ase_map_putx ( + if (ase_map_put ( ((ase_awk_val_map_t*)t1)->map, key, key_len, t2, ASE_NULL) == -1) { @@ -1340,9 +1342,9 @@ static int bfn_sprintf ( { ase_size_t nargs; ase_awk_val_t* a0; - ase_char_t* str0, * ptr; - ase_size_t len0, len; ase_str_t out, fbu; + ase_cstr_t cs0; + ase_cstr_t x; nargs = ase_awk_getnargs (run); ASE_ASSERT (nargs > 0); @@ -1362,14 +1364,14 @@ static int bfn_sprintf ( a0 = ase_awk_getarg (run, 0); if (a0->type == ASE_AWK_VAL_STR) { - str0 = ((ase_awk_val_str_t*)a0)->buf; - len0 = ((ase_awk_val_str_t*)a0)->len; + cs0.ptr = ((ase_awk_val_str_t*)a0)->buf; + cs0.len = ((ase_awk_val_str_t*)a0)->len; } else { - str0 = ase_awk_valtostr ( - run, a0, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len0); - if (str0 == ASE_NULL) + cs0.ptr = ase_awk_valtostr ( + run, a0, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &cs0.len); + if (cs0.ptr == ASE_NULL) { ase_str_close (&fbu); ase_str_close (&out); @@ -1377,9 +1379,9 @@ static int bfn_sprintf ( } } - ptr = ase_awk_format (run, - &out, &fbu, str0, len0, nargs, ASE_NULL, &len); - if (a0->type != ASE_AWK_VAL_STR) ASE_AWK_FREE (run->awk, str0); + x.ptr = ase_awk_format (run, + &out, &fbu, cs0.ptr, cs0.len, nargs, ASE_NULL, &x.len); + if (a0->type != ASE_AWK_VAL_STR) ASE_AWK_FREE (run->awk, cs0.ptr); if (ptr == ASE_NULL) { ase_str_close (&fbu); @@ -1387,8 +1389,8 @@ static int bfn_sprintf ( return -1; } - /*a0 = ase_awk_makestrval_nodup (run, ptr, len);*/ - a0 = ase_awk_makestrval (run, ptr, len); + /*a0 = ase_awk_makestrval_nodup (run, x.ptr, x.len);*/ + a0 = ase_awk_makestrval (run, x.ptr, x.len); if (a0 == ASE_NULL) { ase_str_close (&fbu); @@ -1398,7 +1400,7 @@ static int bfn_sprintf ( } ase_str_close (&fbu); - /*ase_str_forfeit (&out);*/ + /*ase_str_yield (&out, ASE_NULL, 0);*/ ase_str_close (&out); ase_awk_setretval (run, a0); return 0; diff --git a/ase/lib/awk/func.h b/ase/lib/awk/func.h index 65f880a2..8725c06a 100644 --- a/ase/lib/awk/func.h +++ b/ase/lib/awk/func.h @@ -1,15 +1,11 @@ /* - * $Id: func.h 115 2008-03-03 11:13:15Z baconevi $ + * $Id: func.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_FUNC_H_ -#define _ASE_AWK_FUNC_H_ - -#ifndef _ASE_AWK_AWK_H_ -#error Never include this file directly. Include instead -#endif +#ifndef _ASE_LIB_AWK_FUNC_H_ +#define _ASE_LIB_AWK_FUNC_H_ typedef struct ase_awk_bfn_t ase_awk_bfn_t; diff --git a/ase/lib/awk/jni.c b/ase/lib/awk/jni.c index 2b812262..f7272030 100644 --- a/ase/lib/awk/jni.c +++ b/ase/lib/awk/jni.c @@ -1,5 +1,5 @@ /* - * $Id: jni.c 337 2008-08-20 09:17:25Z baconevi $ + * $Id: jni.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -2274,7 +2274,7 @@ JNIEXPORT jobject JNICALL Java_ase_awk_Argument_getindexed (JNIEnv* env, jobject } else rptr = (ase_char_t*)ptr; - pair = ase_map_get (((ase_awk_val_map_t*)val)->map, rptr, len); + pair = ase_map_search (((ase_awk_val_map_t*)val)->map, rptr, len); if (ptr != rptr) ase_awk_free (awk, rptr); (*env)->ReleaseStringChars (env, index, ptr); @@ -2463,7 +2463,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedintval (JNIEnv* env, jobjec return; } - pair = ase_map_put ( + pair = ase_map_upsert ( ((ase_awk_val_map_t*)x)->map, aptr, len, x2); free_str (env, awk, index, jptr, aptr); if (pair == ASE_NULL) @@ -2497,7 +2497,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedintval (JNIEnv* env, jobjec THROW_NOMEM_EXCEPTION (env); return; } - pair = ase_map_put ( + pair = ase_map_upsert ( ((ase_awk_val_map_t*)val)->map, aptr, len, x2); free_str (env, awk, index, jptr, aptr); if (pair == ASE_NULL) @@ -2566,7 +2566,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedrealval (JNIEnv* env, jobje return; } - pair = ase_map_put ( + pair = ase_map_upsert ( ((ase_awk_val_map_t*)x)->map, aptr, len, x2); free_str (env, awk, index, jptr, aptr); if (pair == ASE_NULL) @@ -2600,7 +2600,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedrealval (JNIEnv* env, jobje THROW_NOMEM_EXCEPTION (env); return; } - pair = ase_map_put ( + pair = ase_map_upsert ( ((ase_awk_val_map_t*)val)->map, aptr, len, x2); free_str (env, awk, index, jptr, aptr); if (pair == ASE_NULL) @@ -2675,7 +2675,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedstrval (JNIEnv* env, jobjec THROW_NOMEM_EXCEPTION (env); return; } - pair = ase_map_put ( + pair = ase_map_upsert ( ((ase_awk_val_map_t*)x)->map, aptr, len, x2); free_str (env, awk, index, jptr, aptr); if (pair == ASE_NULL) @@ -2715,7 +2715,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedstrval (JNIEnv* env, jobjec THROW_NOMEM_EXCEPTION (env); return; } - pair = ase_map_put ( + pair = ase_map_upsert ( ((ase_awk_val_map_t*)val)->map, aptr, len, x2); free_str (env, awk, index, jptr, aptr); if (pair == ASE_NULL) diff --git a/ase/lib/awk/jni.h b/ase/lib/awk/jni.h index 97ccd65c..7066a452 100644 --- a/ase/lib/awk/jni.h +++ b/ase/lib/awk/jni.h @@ -1,11 +1,11 @@ /* - * $Id: jni.h 115 2008-03-03 11:13:15Z baconevi $ + * $Id: jni.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_JNI_H_ -#define _ASE_AWK_JNI_H_ +#ifndef _ASE_LIB_AWK_JNI_H_ +#define _ASE_LIB_AWK_JNI_H_ #if defined(__APPLE__) && defined(__MACH__) #include diff --git a/ase/lib/awk/misc.h b/ase/lib/awk/misc.h index 64cb53c6..bfc17300 100644 --- a/ase/lib/awk/misc.h +++ b/ase/lib/awk/misc.h @@ -1,15 +1,11 @@ /* - * $Id: misc.h 115 2008-03-03 11:13:15Z baconevi $ + * $Id: misc.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_MISC_H_ -#define _ASE_AWK_MISC_H_ - -#ifndef _ASE_AWK_AWK_H_ -#error Never include this file directly. Include instead -#endif +#ifndef _ASE_LIB_AWK_MISC_H_ +#define _ASE_LIB_AWK_MISC_H_ #ifdef __cplusplus extern "C" { diff --git a/ase/lib/awk/parse.c b/ase/lib/awk/parse.c index 3d668bf4..7c6be0ea 100644 --- a/ase/lib/awk/parse.c +++ b/ase/lib/awk/parse.c @@ -1,12 +1,12 @@ /* - * $Id: parse.c 349 2008-08-28 14:21:25Z baconevi $ + * $Id: parse.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ #include "awk.h" -enum +enum token_t { TOKEN_EOF, TOKEN_NEWLINE, @@ -240,6 +240,7 @@ struct kwent_t int valid; /* the entry is valid when this option is set */ }; +/* this table should match the kw_t enums in parse.h */ static kwent_t kwtab[] = { /* operators */ @@ -456,16 +457,21 @@ const ase_char_t* ase_awk_getglobalname ( return awk->parse.globals.buf[idx].name.ptr; } -const ase_char_t* ase_awk_getkw (ase_awk_t* awk, const ase_char_t* kw) +ase_cstr_t* ase_awk_getkw (ase_awk_t* awk, int id, ase_cstr_t* s) { ase_map_pair_t* p; - ASE_ASSERT (kw != ASE_NULL); + s->ptr = kwtab[id].name; + s->len = kwtab[id].name_len; - p = ase_map_get (awk->wtab, kw, ase_strlen(kw)); - if (p != ASE_NULL) return ((ase_cstr_t*)p->val)->ptr; + p = ase_map_search (awk->wtab, s->ptr, ASE_NCHARS_TO_NBYTES(s->len)); + if (p != ASE_NULL) + { + s->ptr = ASE_MAP_VPTR(p); + s->len = ASE_NBYTES_TO_NCHARS(ASE_MAP_VLEN(p)); + } - return kw; + return s; } int ase_awk_parse (ase_awk_t* awk, ase_awk_srcios_t* srcios) @@ -545,15 +551,16 @@ static int parse (ase_awk_t* awk) p = ase_map_getfirstpair (awk->parse.afns, &buckno); while (p != ASE_NULL) { - if (ase_map_get (awk->tree.afns, - p->key.ptr, p->key.len) == ASE_NULL) + if (ase_map_search (awk->tree.afns, + 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, - p->key.ptr, p->key.len); + ASE_MAP_KPTR(p), + ASE_NBYTES_TO_NCHARS(ASE_MAP_KELN(p))); EXIT_PARSE(-1); } @@ -844,7 +851,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) return ASE_NULL; } - if (ase_map_get(awk->tree.afns, name, name_len) != ASE_NULL) + if (ase_map_search (awk->tree.afns, name, name_len) != ASE_NULL) { /* the function is defined previously */ SETERRARG ( @@ -1075,7 +1082,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) afn->nargs = nargs; afn->body = body; - n = ase_map_putx (awk->tree.afns, name_dup, name_len, afn, &pair); + n = ase_map_upsertx (awk->tree.afns, name_dup, name_len, afn, &pair); if (n < 0) { ASE_AWK_FREE (awk, name_dup); @@ -1425,7 +1432,7 @@ static void trans_global ( { ase_map_pair_t* pair; - pair = ase_map_get (awk->wtab, word->ptr, word->len); + pair = ase_map_search (awk->wtab, word->ptr, word->len); if (pair != ASE_NULL) { word->ptr = ((ase_cstr_t*)(pair->vptr))->ptr; @@ -1470,7 +1477,7 @@ static int add_global ( } /* check if it conflict with a function name */ - if (ase_map_get (awk->tree.afns, name, len) != ASE_NULL) + if (ase_map_search (awk->tree.afns, name, len) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EAFNRED, line, @@ -1480,7 +1487,7 @@ static int add_global ( /* check if it conflict with a function name * caught in the function call table */ - if (ase_map_get (awk->parse.afns, name, len) != ASE_NULL) + if (ase_map_search (awk->parse.afns, name, len) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EAFNRED, line, @@ -1660,7 +1667,7 @@ static ase_awk_t* collect_locals ( local, local_len) == 0); } - if (iscur || ase_map_get (awk->tree.afns, local, local_len) != ASE_NULL) + if (iscur || ase_map_search (awk->tree.afns, local, local_len) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EAFNRED, awk->token.line, @@ -1670,7 +1677,7 @@ static ase_awk_t* collect_locals ( /* check if it conflict with a function name * caught in the function call table */ - if (ase_map_get (awk->parse.afns, local, local_len) != ASE_NULL) + if (ase_map_search (awk->parse.afns, local, local_len) != ASE_NULL) { SETERRARG ( awk, ASE_AWK_EAFNRED, awk->token.line, @@ -3257,7 +3264,7 @@ 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_get (awk->parse.named, name_dup, name_len) != ASE_NULL) + if (ase_map_search (awk->parse.named, name_dup, name_len) != ASE_NULL) { /* a function call conflicts with a named variable */ SETERRARG (awk, ASE_AWK_EVARRED, line, name_dup, name_len); @@ -3308,14 +3315,14 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) name_dup, name_len) == 0); } - if (iscur || ase_map_get (awk->tree.afns, name_dup, name_len) != ASE_NULL) + if (iscur || ase_map_search (awk->tree.afns, name_dup, name_len) != ASE_NULL) { /* the function is defined previously */ SETERRARG (awk, ASE_AWK_EAFNRED, line, name_dup, name_len); goto exit_func; } - if (ase_map_get (awk->parse.afns, name_dup, name_len) != ASE_NULL) + if (ase_map_search (awk->parse.afns, name_dup, name_len) != ASE_NULL) { /* is it one of the function calls found so far? */ SETERRARG (awk, ASE_AWK_EAFNRED, line, name_dup, name_len); @@ -3334,7 +3341,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) nde->idx = ASE_NULL; /* collect unique instances of a named variables for reference */ - if (ase_map_put (awk->parse.named, + if (ase_map_upsert (awk->parse.named, name_dup, name_len, (void*)line) == ASE_NULL) { SETERRLIN (awk, ASE_AWK_ENOMEM, line); @@ -3489,14 +3496,14 @@ static ase_awk_nde_t* parse_hashidx ( name, name_len) == 0); } - if (iscur || ase_map_get (awk->tree.afns, name, name_len) != ASE_NULL) + if (iscur || ase_map_search (awk->tree.afns, name, name_len) != ASE_NULL) { /* the function is defined previously */ SETERRARG (awk, ASE_AWK_EAFNRED, line, name, name_len); goto exit_func; } - if (ase_map_get (awk->parse.afns, name, name_len) != ASE_NULL) + if (ase_map_search (awk->parse.afns, name, name_len) != ASE_NULL) { /* is it one of the function calls found so far? */ SETERRARG (awk, ASE_AWK_EAFNRED, line, name, name_len); @@ -3648,7 +3655,7 @@ static ase_awk_nde_t* parse_fncall ( /* this line number might be truncated as * sizeof(line) could be > sizeof(void*) */ - if (ase_map_put (awk->parse.afns, + if (ase_map_upsert (awk->parse.afns, name, name_len, (void*)line) == ASE_NULL) { ASE_AWK_FREE (awk, call); @@ -5386,7 +5393,7 @@ static int classify_ident ( if (kwp->valid != 0 && (awk->option & kwp->valid) != kwp->valid) continue; - pair = ase_map_get (awk->wtab, kwp->name, kwp->name_len); + pair = ase_map_search (awk->wtab, kwp->name, kwp->name_len); if (pair != ASE_NULL) { k = ((ase_cstr_t*)(pair->vptr))->ptr; @@ -5473,6 +5480,7 @@ static int deparse (ase_awk_t* awk) struct deparse_func_t df; int n = 0; ase_ssize_t op; + ase_cstr_t kw; ASE_ASSERT (awk->src.ios.out != ASE_NULL); @@ -5512,7 +5520,9 @@ static int deparse (ase_awk_t* awk) ase_size_t i, len; ASE_ASSERT (awk->tree.nglobals > 0); - if (ase_awk_putsrcstr(awk,ase_awk_getkw(awk,ASE_T("global"))) == -1) + + ase_awk_getkw (ase, KW_GLOBAL, &kw); + if (ase_awk_putsrcstrx(awk,kw.ptr,kw.len)) == -1) { EXIT_DEPARSE (); } @@ -5691,51 +5701,68 @@ exit_deparse: return n; } -#define PUTSRCSTR(x,str) \ - if (ase_awk_putsrcstr (x->awk, str) == -1) { \ - x->ret = -1; \ - return ASE_MAP_WALK_STOP; \ - } + static int deparse_func (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_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); - PUTSRCSTR (df, ase_awk_getkw(df->awk,ASE_T("function"))); - PUTSRCSTR (df, ASE_T(" ")); - PUTSRCSTR (df, afn->name); - PUTSRCSTR (df, ASE_T(" (")); +#define PUT_C(x,c) \ + if (put_char(x->awk,c)==-1) { \ + x->ret = -1; return ASE_MAP_WALK_STOP; \ + } + +#define PUT_S(x,str) \ + if (ase_awk_putsrcstr(x->awk,str) == -1) { \ + x->ret = -1; return ASE_MAP_WALK_STOP; \ + } + +#define PUT_SX(x,str,len) \ + if (ase_awk_putsrcstrx (x->awk, str, len) == -1) { \ + x->ret = -1; return ASE_MAP_WALK_STOP; \ + } + + ase_awk_getkw (df->awk, KW_FUNCTION, &kw); + PUT_SX (df, kw->ptr, kw->len)); + + PUT_C (df, ASE_T(' ')); + PUT_S (df, afn->name); + PUT_S (df, ASE_T(" (")); for (i = 0; i < afn->nargs; ) { n = ase_awk_longtostr (i++, 10, ASE_T("__p"), df->tmp, df->tmp_len); ASE_ASSERT (n != (ase_size_t)-1); - if (ase_awk_putsrcstrx (df->awk, df->tmp, n) == -1) return -1; + PUT_SX (df, df->tmp, n); if (i >= afn->nargs) break; - PUTSRCSTR (df, ASE_T(", ")); + PUT_S (df, ASE_T(", ")); } - PUTSRCSTR (df, ASE_T(")")); - if (df->awk->option & ASE_AWK_CRLF) - { - if (put_char (df->awk, ASE_T('\r')) == -1) return -1; - } - if (put_char (df->awk, ASE_T('\n')) == -1) return -1; + PUT_S (df, ASE_T(")")); + if (df->awk->option & ASE_AWK_CRLF) PUT_C (df, ASE_T('\r')); + + PUT_C (df, ASE_T('\n')); if (ase_awk_prnpt (df->awk, afn->body) == -1) return -1; if (df->awk->option & ASE_AWK_CRLF) { - if (put_char (df->awk, ASE_T('\r')) == -1) return -1; + PUT_C (df, ASE_T('\r')); } - if (put_char (df->awk, ASE_T('\n')) == -1) return -1; + PUT_C (df, ASE_T('\n')); return ASE_MAP_WALK_FORWARD; + +#undef PUT_C +#undef PUT_S +#undef PUT_SX } static int put_char (ase_awk_t* awk, ase_char_t c) diff --git a/ase/lib/awk/parse.h b/ase/lib/awk/parse.h index e825dc77..9bfb0243 100644 --- a/ase/lib/awk/parse.h +++ b/ase/lib/awk/parse.h @@ -1,15 +1,39 @@ /* - * $Id: parse.h 115 2008-03-03 11:13:15Z baconevi $ + * $Id: parse.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_PARSE_H_ -#define _ASE_AWK_PARSE_H_ +#ifndef _ASE_LIB_AWK_PARSE_H_ +#define _ASE_LIB_AWK_PARSE_H_ -#ifndef _ASE_AWK_AWK_H_ -#error Never include this file directly. Include instead -#endif +/* these enums should match kwtab in parse.c */ +enum kw_t +{ + KW_IN, + KW_BEGIN, + KW_END, + KW_FUNCTION, + KW_LOCAL, + KW_GLOBAL, + KW_IF, + KW_ELSE, + KW_WHILE, + KW_FOR, + KW_DO, + KW_BREAK, + KW_CONTINUE, + KW_RETURN, + KW_EXIT, + KW_NEXT, + KW_NEXTFILE, + KW_NEXTOFILE, + KW_DELETE, + KW_RESET, + KW_PRINT, + KW_PRINTF, + KW_GETLINE, +}; #ifdef __cplusplus extern "C" { @@ -21,7 +45,8 @@ int ase_awk_putsrcstrx ( const ase_char_t* ase_awk_getglobalname ( ase_awk_t* awk, ase_size_t idx, ase_size_t* len); -const ase_char_t* ase_awk_getkw (ase_awk_t* awk, const ase_char_t* kw); +ase_cstr_t* ase_awk_getkw (ase_awk_t* awk, int id, ase_cstr_t* s); + int ase_awk_initglobals (ase_awk_t* awk); diff --git a/ase/lib/awk/run.c b/ase/lib/awk/run.c index e7d626cb..7aa66329 100644 --- a/ase/lib/awk/run.c +++ b/ase/lib/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c 349 2008-08-28 14:21:25Z baconevi $ + * $Id: run.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -1022,7 +1022,7 @@ static int build_runarg ( * it has successfully been assigned into ARGV. */ ase_awk_refupval (run, v_tmp); - if (ase_map_putx ( + if (ase_map_upsertx ( ((ase_awk_val_map_t*)v_argv)->map, key, key_len, v_tmp, ASE_NULL) == -1) { @@ -2448,7 +2448,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde) (var->type == ASE_AWK_NDE_NAMEDIDX && var->idx != ASE_NULL), "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_get ( + pair = ase_map_search ( run->named, var->id.name, var->id.name_len); if (pair == ASE_NULL) { @@ -2465,7 +2465,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde) return -1; } - pair = ase_map_put (run->named, + pair = ase_map_upsert (run->named, var->id.name, var->id.name_len, tmp); if (pair == ASE_NULL) { @@ -3327,7 +3327,7 @@ static ase_awk_val_t* do_assignment_scalar ( ase_map_pair_t* pair; int n; - pair = ase_map_get ( + pair = ase_map_search ( run->named, var->id.name, var->id.name_len); if (pair != ASE_NULL && ((ase_awk_val_t*)pair->val)->type == ASE_AWK_VAL_MAP) @@ -3344,7 +3344,7 @@ static ase_awk_val_t* do_assignment_scalar ( return ASE_NULL; } - n = ase_map_putx (run->named, + n = ase_map_upsertx (run->named, var->id.name, var->id.name_len, val, ASE_NULL); if (n < 0) { @@ -3429,7 +3429,7 @@ static ase_awk_val_t* do_assignment_map ( if (var->type == ASE_AWK_NDE_NAMEDIDX) { ase_map_pair_t* pair; - pair = ase_map_get ( + pair = ase_map_search ( run->named, var->id.name, var->id.name_len); map = (pair == ASE_NULL)? (ase_awk_val_map_t*)ase_awk_val_nil: @@ -3461,8 +3461,8 @@ static ase_awk_val_t* do_assignment_map ( { /* doesn't have to decrease the reference count * of the previous value here as it is done by - * ase_map_put */ - if (ase_map_put (run->named, + * ase_map_upsert */ + if (ase_map_upsert (run->named, var->id.name, var->id.name_len, tmp) == ASE_NULL) { ase_awk_refupval (run, tmp); @@ -3524,7 +3524,7 @@ static ase_awk_val_t* do_assignment_map ( str, (int)map->ref, (int)map->type); #endif - n = ase_map_putx (map->map, str, len, val, ASE_NULL); + n = ase_map_upsertx (map->map, str, len, val, ASE_NULL); if (n < 0) { if (str != idxbuf) ASE_AWK_FREE (run->awk, str); @@ -3849,7 +3849,7 @@ static ase_awk_val_t* eval_binop_in ( ase_map_t* map; map = ((ase_awk_val_map_t*)rv)->map; - res = (ase_map_get (map, str, len) == ASE_NULL)? + res = (ase_map_search (map, str, len) == ASE_NULL)? ase_awk_val_zero: ase_awk_val_one; if (str != idxbuf) ASE_AWK_FREE (run->awk, str); @@ -5381,7 +5381,7 @@ static ase_awk_val_t* eval_afn_intrinsic ( ase_awk_afn_t* afn; ase_map_pair_t* pair; - pair = ase_map_get (run->awk->tree.afns, + pair = ase_map_search (run->awk->tree.afns, call->what.afn.name.ptr, call->what.afn.name.len); if (pair == ASE_NULL) { @@ -5737,14 +5737,14 @@ static int get_reference ( { ase_map_pair_t* pair; - pair = ase_map_get ( + pair = ase_map_search ( run->named, tgt->id.name, 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_put ( + pair = ase_map_upsert ( run->named, tgt->id.name, tgt->id.name_len, ase_awk_val_nil); if (pair == ASE_NULL) @@ -5782,11 +5782,11 @@ static int get_reference ( { ase_map_pair_t* pair; - pair = ase_map_get ( + pair = ase_map_search ( run->named, tgt->id.name, tgt->id.name_len); if (pair == ASE_NULL) { - pair = ase_map_put ( + pair = ase_map_upsert ( run->named, tgt->id.name, tgt->id.name_len, ase_awk_val_nil); if (pair == ASE_NULL) @@ -5908,10 +5908,10 @@ static ase_awk_val_t** get_reference_indexed ( if (str == ASE_NULL) return ASE_NULL; } - pair = ase_map_get ((*(ase_awk_val_map_t**)val)->map, str, len); + pair = ase_map_search ((*(ase_awk_val_map_t**)val)->map, str, len); if (pair == ASE_NULL) { - pair = ase_map_put ( + pair = ase_map_upsert ( (*(ase_awk_val_map_t**)val)->map, str, len, ase_awk_val_nil); if (pair == ASE_NULL) @@ -5996,7 +5996,7 @@ 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_get (run->named, + pair = ase_map_search (run->named, ((ase_awk_nde_var_t*)nde)->id.name, ((ase_awk_nde_var_t*)nde)->id.name_len); @@ -6060,7 +6060,7 @@ static ase_awk_val_t* eval_indexed ( if (str == ASE_NULL) return ASE_NULL; } - pair = ase_map_get ((*(ase_awk_val_map_t**)val)->map, str, len); + pair = ase_map_search ((*(ase_awk_val_map_t**)val)->map, str, len); if (str != idxbuf) ASE_AWK_FREE (run->awk, str); return (pair == ASE_NULL)? ase_awk_val_nil: (ase_awk_val_t*)pair->val; @@ -6071,10 +6071,10 @@ 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_get (run->named, tgt->id.name, tgt->id.name_len); + pair = ase_map_search (run->named, tgt->id.name, tgt->id.name_len); if (pair == ASE_NULL) { - pair = ase_map_put (run->named, + pair = ase_map_upsert (run->named, tgt->id.name, tgt->id.name_len, ase_awk_val_nil); if (pair == ASE_NULL) { @@ -6486,8 +6486,9 @@ static ase_char_t* idxnde_to_str ( { /* multidimensional index */ ase_str_t idxstr; + ase_cstr_t tmp; - if (ase_str_open (&idxstr, DEF_BUF_CAPA, MMGR(run)) == ASE_NULL) + if (ase_str_init (MMGR(run) &idxstr, DEF_BUF_CAPA) == ASE_NULL) { ase_awk_setrunerror ( run, ASE_AWK_ENOMEM, nde->line, ASE_NULL, 0); @@ -6499,7 +6500,7 @@ static ase_char_t* idxnde_to_str ( idx = eval_expression (run, nde); if (idx == ASE_NULL) { - ase_str_close (&idxstr); + ase_str_fini (&idxstr); return ASE_NULL; } @@ -6511,7 +6512,7 @@ static ase_char_t* idxnde_to_str ( run->global.subsep.len) == (ase_size_t)-1) { ase_awk_refdownval (run, idx); - ase_str_close (&idxstr); + ase_str_fini (&idxstr); ase_awk_setrunerror ( run, ASE_AWK_ENOMEM, nde->line, @@ -6524,7 +6525,7 @@ static ase_char_t* idxnde_to_str ( run, idx, 0, &idxstr, ASE_NULL) == ASE_NULL) { ase_awk_refdownval (run, idx); - ase_str_close (&idxstr); + ase_str_fini (&idxstr); return ASE_NULL; } @@ -6532,9 +6533,11 @@ static ase_char_t* idxnde_to_str ( nde = nde->next; } - str = ASE_STR_BUF(&idxstr); - *len = ASE_STR_LEN(&idxstr); - ase_str_forfeit (&idxstr); + ase_str_yield (&idxstr, &tmp, 0); + str = tmp.ptr; + *len = tmp.len; + + ase_str_fini (&idxstr); } return str; diff --git a/ase/lib/awk/run.h b/ase/lib/awk/run.h index 429c0c2f..01c54ddf 100644 --- a/ase/lib/awk/run.h +++ b/ase/lib/awk/run.h @@ -1,15 +1,11 @@ /* - * $Id: run.h 115 2008-03-03 11:13:15Z baconevi $ + * $Id: run.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_RUN_H_ -#define _ASE_AWK_RUN_H_ - -#ifndef _ASE_AWK_AWK_H_ -#error Never include this file directly. Include instead -#endif +#ifndef _ASE_LIB_AWK_RUN_H_ +#define _ASE_LIB_AWK_RUN_H_ enum ase_awk_assop_type_t { diff --git a/ase/lib/awk/tab.h b/ase/lib/awk/tab.h index a10dd1d2..032b1669 100644 --- a/ase/lib/awk/tab.h +++ b/ase/lib/awk/tab.h @@ -1,11 +1,11 @@ /* - * $Id: tab.h 115 2008-03-03 11:13:15Z baconevi $ + * $Id: tab.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_TAB_H_ -#define _ASE_AWK_TAB_H_ +#ifndef _ASE_LIB_AWK_TAB_H_ +#define _ASE_LIB_AWK_TAB_H_ #ifndef _ASE_AWK_AWK_H_ #error Never include this file directly. Include instead diff --git a/ase/lib/awk/tree.c b/ase/lib/awk/tree.c index a8cb64d1..0e8df970 100644 --- a/ase/lib/awk/tree.c +++ b/ase/lib/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c 337 2008-08-20 09:17:25Z baconevi $ + * $Id: tree.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -131,6 +131,8 @@ static int print_tabs (ase_awk_t* awk, int depth) static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) { + ase_cstr_t kw; + switch (nde->type) { case ASE_AWK_NDE_GRP: @@ -556,7 +558,8 @@ static int print_expression (ase_awk_t* awk, ase_awk_nde_t* nde) PUT_SRCSTR (awk, ASE_T(" ")); } - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("getline"))); + ase_awk_getkw (awk, KW_GETLINE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); if (px->var != ASE_NULL) { PUT_SRCSTR (awk, ASE_T(" ")); @@ -600,6 +603,7 @@ static int print_expression_list (ase_awk_t* awk, ase_awk_nde_t* tree) static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) { ase_size_t i; + ase_cstr_t kw; switch (p->type) { @@ -623,7 +627,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) if (px->nlocals > 0) { PRINT_TABS (awk, depth + 1); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("local"))); + ase_awk_getkw (awk, KW_LOCAL, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" ")); for (i = 0; i < px->nlocals - 1; i++) @@ -657,7 +662,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) ase_awk_nde_if_t* px = (ase_awk_nde_if_t*)p; PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("if"))); + ase_awk_getkw (awk, KW_IF, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" (")); PRINT_EXPRESSION (awk, px->test); PUT_SRCSTR (awk, ASE_T(")")); @@ -672,7 +678,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) if (px->else_part != ASE_NULL) { PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("else"))); + ase_awk_getkw (awk, KW_ELSE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_NEWLINE (awk); if (px->else_part->type == ASE_AWK_NDE_BLK) PRINT_STATEMENTS (awk, px->else_part, depth); @@ -687,7 +694,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) ase_awk_nde_while_t* px = (ase_awk_nde_while_t*)p; PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("while"))); + ase_awk_getkw (awk, KW_WHILE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" (")); PRINT_EXPRESSION (awk, px->test); PUT_SRCSTR (awk, ASE_T(")")); @@ -708,7 +716,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) ase_awk_nde_while_t* px = (ase_awk_nde_while_t*)p; PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("do"))); + ase_awk_getkw (awk, KW_DO, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_NEWLINE (awk); if (px->body->type == ASE_AWK_NDE_BLK) { @@ -720,7 +729,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) } PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("while"))); + ase_awk_getkw (awk, KW_WHILE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" (")); PRINT_EXPRESSION (awk, px->test); PUT_SRCSTR (awk, ASE_T(");")); @@ -733,7 +743,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) ase_awk_nde_for_t* px = (ase_awk_nde_for_t*)p; PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("for"))); + ase_awk_getkw (awk, KW_FOR, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" (")); if (px->init != ASE_NULL) { @@ -768,7 +779,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) ase_awk_nde_foreach_t* px = (ase_awk_nde_foreach_t*)p; PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("for"))); + ase_awk_getkw (awk, KW_FOR, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" ")); PRINT_EXPRESSION (awk, px->test); PUT_NEWLINE (awk); @@ -786,7 +798,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) case ASE_AWK_NDE_BREAK: { PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("break"))); + ase_awk_getkw (awk, KW_BREAK, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(";")); PUT_NEWLINE (awk); break; @@ -795,7 +808,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) case ASE_AWK_NDE_CONTINUE: { PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("continue"))); + ase_awk_getkw (awk, KW_CONTINUE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(";")); PUT_NEWLINE (awk); break; @@ -806,13 +820,15 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) PRINT_TABS (awk, depth); if (((ase_awk_nde_return_t*)p)->val == ASE_NULL) { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("return"))); + ase_awk_getkw (awk, KW_RETURN, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(";")); PUT_NEWLINE (awk); } else { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("return"))); + ase_awk_getkw (awk, KW_RETURN, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" ")); ASE_ASSERT (((ase_awk_nde_return_t*)p)->val->next == ASE_NULL); @@ -830,13 +846,15 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) if (px->val == ASE_NULL) { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("exit"))); + ase_awk_getkw (awk, KW_EXIT, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(";")); PUT_NEWLINE (awk); } else { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("exit"))); + ase_awk_getkw (awk, KW_EXIT, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" ")); ASE_ASSERT (px->val->next == ASE_NULL); PRINT_EXPRESSION (awk, px->val); @@ -849,7 +867,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) case ASE_AWK_NDE_NEXT: { PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("next"))); + ase_awk_getkw (awk, KW_NEXT, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(";")); PUT_NEWLINE (awk); break; @@ -860,11 +879,13 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) PRINT_TABS (awk, depth); if (((ase_awk_nde_nextfile_t*)p)->out) { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("nextofile"))); + ase_awk_getkw (awk, KW_NEXTOFILE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); } else { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("nextfile"))); + ase_awk_getkw (awk, KW_NEXTFILE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); } PUT_SRCSTR (awk, ASE_T(";")); PUT_NEWLINE (awk); @@ -874,7 +895,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) case ASE_AWK_NDE_DELETE: { PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("delete"))); + ase_awk_getkw (awk, KW_DELETE, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" ")); ase_awk_prnpt (awk, ((ase_awk_nde_delete_t*)p)->var); break; @@ -883,7 +905,8 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) case ASE_AWK_NDE_RESET: { PRINT_TABS (awk, depth); - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("reset"))); + ase_awk_getkw (awk, KW_RESET, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); PUT_SRCSTR (awk, ASE_T(" ")); ase_awk_prnpt (awk, ((ase_awk_nde_reset_t*)p)->var); break; @@ -898,11 +921,13 @@ static int print_statement (ase_awk_t* awk, ase_awk_nde_t* p, int depth) if (p->type == ASE_AWK_NDE_PRINT) { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("print"))); + ase_awk_getkw (awk, KW_PRINT, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); } else { - PUT_SRCSTR (awk, ase_awk_getkw(awk,ASE_T("printf"))); + ase_awk_getkw (awk, KW_PRINTF, &kw); + PUT_SRCSTRX (awk, kw.ptr, kw.len); } if (px->args != ASE_NULL) diff --git a/ase/lib/awk/tree.h b/ase/lib/awk/tree.h index a96498ff..f328884e 100644 --- a/ase/lib/awk/tree.h +++ b/ase/lib/awk/tree.h @@ -1,15 +1,11 @@ /* - * $Id: tree.h 237 2008-07-09 13:20:08Z baconevi $ + * $Id: tree.h 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ -#ifndef _ASE_AWK_TREE_H_ -#define _ASE_AWK_TREE_H_ - -#ifndef _ASE_AWK_AWK_H_ -#error Never include this file directly. Include instead -#endif +#ifndef _ASE_LIB_AWK_TREE_H_ +#define _ASE_LIB_AWK_TREE_H_ enum ase_awk_nde_type_t { diff --git a/ase/lib/awk/val.c b/ase/lib/awk/val.c index e34ec66e..55030a35 100644 --- a/ase/lib/awk/val.c +++ b/ase/lib/awk/val.c @@ -1,5 +1,5 @@ /* - * $Id: val.c 337 2008-08-20 09:17:25Z baconevi $ + * $Id: val.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -927,15 +927,15 @@ static ase_char_t* val_real_to_str ( tmp_len = run->global.convfmt.len; } - if (ase_str_open (&out, 256, run->awk->mmgr) == ASE_NULL) + if (ase_str_init (&out, run->awk->mmgr, 256) == ASE_NULL) { ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return ASE_NULL; } - if (ase_str_open (&fbu, 256, run->awk->mmgr) == ASE_NULL) + if (ase_str_init (&fbu, run->awk->mmgr, 256) == ASE_NULL) { - ase_str_close (&out); + ase_str_fini (&out); ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return ASE_NULL; } @@ -944,15 +944,18 @@ static ase_char_t* val_real_to_str ( (ase_size_t)-1, (ase_awk_nde_t*)v, &tmp_len); if (tmp == ASE_NULL) { - ase_str_close (&fbu); - ase_str_close (&out); + ase_str_fini (&fbu); + ase_str_fini (&out); return ASE_NULL; } if (buf == ASE_NULL) { - ase_str_close (&fbu); - ase_str_forfeit (&out); + ase_str_fini (&fbu); + + ase_str_yield (&out, ASE_NULL, 0); + ase_str_fini (&out); + if (len != ASE_NULL) *len = tmp_len; } else if (opt & ASE_AWK_VALTOSTR_FIXED) @@ -973,8 +976,8 @@ static ase_char_t* val_real_to_str ( tmp = (ase_char_t*)buf; *len = tmp_len; - ase_str_close (&fbu); - ase_str_close (&out); + ase_str_fini (&fbu); + ase_str_fini (&out); } else { @@ -982,8 +985,8 @@ static ase_char_t* val_real_to_str ( if (ase_str_ncat (buf, tmp, tmp_len) == (ase_size_t)-1) { - ase_str_close (&fbu); - ase_str_close (&out); + ase_str_fini (&fbu); + ase_str_fini (&out); ase_awk_setrunerror ( run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); return ASE_NULL; @@ -992,8 +995,8 @@ static ase_char_t* val_real_to_str ( tmp = ASE_STR_BUF(buf); if (len != ASE_NULL) *len = ASE_STR_LEN(buf); - ase_str_close (&fbu); - ase_str_close (&out); + ase_str_fini (&fbu); + ase_str_fini (&out); } return tmp; diff --git a/ase/lib/cmn/str_dyn.c b/ase/lib/cmn/str_dyn.c index 7d1cf4a9..ff28ae3e 100644 --- a/ase/lib/cmn/str_dyn.c +++ b/ase/lib/cmn/str_dyn.c @@ -1,5 +1,5 @@ /* - * $Id: str_dyn.c 357 2008-08-31 11:17:01Z baconevi $ + * $Id: str_dyn.c 363 2008-09-04 10:58:08Z baconevi $ * * {License} */ @@ -32,7 +32,9 @@ void ase_str_close (ase_str_t* str) ase_str_t* ase_str_init (ase_str_t* str, ase_mmgr_t* mmgr, ase_size_t capa) { ASE_MEMSET (str, 0, ASE_SIZEOF(ase_str_t)); + str->mmgr = mmgr; + str->sizer = ASE_NULL; if (capa == 0) str->buf = ASE_NULL; else @@ -80,6 +82,59 @@ int ase_str_yield (ase_str_t* str, ase_cstr_t* buf, int new_capa) return 0; } +ase_sizer_t ase_str_getsizer (ase_str_t* str) +{ + return str->sizer; +} + +void ase_str_setsizer (ase_str_t* str, ase_sizer_t sizer) +{ + str->sizer = sizer; +} + +ase_size_t ase_str_getcapa (ase_str_t* str) +{ + return str->capa; +} + +ase_size_t ase_str_setcapa (ase_str_t* str, ase_size_t capa) +{ + ase_char_t* tmp; + + if (str->mmgr->realloc != ASE_NULL && str->buf != ASE_NULL) + { + tmp = (ase_char_t*) ASE_MMGR_REALLOC ( + str->mmgr, str->buf, + ASE_SIZEOF(ase_char_t)*(capa+1)); + if (tmp == ASE_NULL) return (ase_size_t)-1; + } + else + { + tmp = (ase_char_t*) ASE_MMGR_ALLOC ( + str->mmgr, ASE_SIZEOF(ase_char_t)*(capa+1)); + if (tmp == ASE_NULL) return (ase_size_t)-1; + + if (str->buf != ASE_NULL) + { + ase_size_t ncopy = (str->size <= capa)? str->size: capa; + ASE_MEMCPY (tmp, str->buf, + ASE_SIZEOF(ase_char_t)*(ncopy+1)); + ASE_MMGR_FREE (str->mmgr, str->buf); + } + } + + if (capa < str->size) + { + str->size = capa; + tmp[capa] = ASE_T('\0'); + } + + str->capa = capa; + str->buf = tmp; + + return str->capa; +} + void ase_str_clear (ase_str_t* str) { str->size = 0; @@ -138,44 +193,45 @@ ase_size_t ase_str_cat (ase_str_t* str, const ase_char_t* s) return ase_str_ncat (str, s, ase_strlen(s)); } + ase_size_t ase_str_ncat (ase_str_t* str, const ase_char_t* s, ase_size_t len) { if (len > str->capa - str->size) { - ase_char_t* tmp; - ase_size_t capa; + ase_size_t ncapa; - capa = str->size + len; - - /* double the capa if necessary for concatenation */ - if (capa < str->capa * 2) capa = str->capa * 2; - - if (str->mmgr->realloc != ASE_NULL && str->buf != ASE_NULL) + if (str->sizer == ASE_NULL) { - tmp = (ase_char_t*) ASE_REALLOC ( - str->mmgr, str->buf, - ASE_SIZEOF(ase_char_t)*(capa+1)); - if (tmp == ASE_NULL) return (ase_size_t)-1; + /* increase the capacity by the length to add */ + ncapa = str->size + len; + /* if the new capacity is less than the double, + * just double it */ + if (ncapa < str->capa * 2) ncapa = str->capa * 2; } else { - tmp = (ase_char_t*) ASE_MMGR_ALLOC ( - str->mmgr, ASE_SIZEOF(ase_char_t)*(capa+1)); - if (tmp == ASE_NULL) return (ase_size_t)-1; - if (str->buf != ASE_NULL) - { - ASE_MEMCPY (tmp, str->buf, - ASE_SIZEOF(ase_char_t)*(str->capa+1)); - ASE_MMGR_FREE (str->mmgr, str->buf); - } + /* let the user determine the new capacity */ + ncapa = str->sizer (str); } - str->capa = capa; - str->buf = tmp; + if (ase_str_setcapa (str, ncapa) == (ase_size_t)-1) + { + return (ase_size_t)-1; + } } - str->size += ase_strncpy (&str->buf[str->size], s, len); - str->buf[str->size] = ASE_T('\0'); + if (len > str->capa - str->size) + { + /* copy as many characters as the number of cells available */ + len = str->capa - str->size; + } + + if (len > 0) + { + ASE_MEMCPY (&str->buf[str->size], s, len*ASE_SIZEOF(*s)); + str->size += len; + str->buf[str->size] = ASE_T('\0'); + } return str->size; }