initially finished code change for the various changes in common routines
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: Awk.cpp 390 2008-09-26 15:30:49Z baconevi $
|
||||
* $Id: Awk.cpp 391 2008-09-27 09:51:23Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -423,7 +423,7 @@ int Awk::Argument::getIndexed (
|
||||
if (pair == ASE_NULL) return 0;
|
||||
|
||||
// if val.init fails, it should return an error
|
||||
return val.init ((val_t*)pair->val);
|
||||
return val.init ((val_t*)ASE_MAP_VPTR(pair));
|
||||
}
|
||||
|
||||
int Awk::Argument::getIndexed (long_t idx, Argument& val) const
|
||||
@ -467,7 +467,7 @@ int Awk::Argument::getIndexed (long_t idx, Argument& val) const
|
||||
if (pair == ASE_NULL) return 0;
|
||||
|
||||
// if val.init fails, it should return an error
|
||||
return val.init ((val_t*)pair->val);
|
||||
return val.init ((val_t*)ASE_MAP_VPTR(pair));
|
||||
}
|
||||
|
||||
int Awk::Argument::getFirstIndex (Awk::Argument& val) const
|
||||
@ -482,7 +482,9 @@ int Awk::Argument::getFirstIndex (Awk::Argument& val) const
|
||||
pair_t* pair = ase_map_getfirstpair (m->map, &buckno);
|
||||
if (pair == ASE_NULL) return 0; // no more key
|
||||
|
||||
if (val.init (pair->key.ptr, pair->key.len) == -1) return -1;
|
||||
if (val.init (
|
||||
(ase_char_t*)ASE_MAP_KPTR(pair),
|
||||
ASE_MAP_KLEN(pair)) == -1) return -1;
|
||||
|
||||
// reuse the string field as an interator.
|
||||
this->str.ptr = (char_t*)pair;
|
||||
@ -506,7 +508,9 @@ int Awk::Argument::getNextIndex (Awk::Argument& val) const
|
||||
pair = ase_map_getnextpair (m->map, pair, &buckno);
|
||||
if (pair == ASE_NULL) return 0;
|
||||
|
||||
if (val.init (pair->key.ptr, pair->key.len) == -1) return -1;
|
||||
if (val.init (
|
||||
(ase_char_t*)ASE_MAP_KPTR(pair),
|
||||
ASE_MAP_KLEN(pair)) == -1) return -1;
|
||||
|
||||
// reuse the string field as an interator.
|
||||
this->str.ptr = (char_t*)pair;
|
||||
@ -617,7 +621,8 @@ 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_upsert (
|
||||
((ase_awk_val_map_t*)x)->map, idx, iln, x2);
|
||||
((ase_awk_val_map_t*)x)->map,
|
||||
(char_t*)idx, iln, x2, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
ase_awk_refdownval (this->run->run, x2);
|
||||
@ -637,7 +642,8 @@ 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_upsert (
|
||||
((ase_awk_val_map_t*)this->val)->map, idx, iln, x2);
|
||||
((ase_awk_val_map_t*)this->val)->map,
|
||||
(char_t*)idx, iln, x2, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
ase_awk_refdownval (this->run->run, x2);
|
||||
@ -678,7 +684,8 @@ 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_upsert (
|
||||
((ase_awk_val_map_t*)x)->map, idx, iln, x2);
|
||||
((ase_awk_val_map_t*)x)->map,
|
||||
(char_t*)idx, iln, x2, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
ase_awk_refdownval (this->run->run, x2);
|
||||
@ -698,7 +705,8 @@ 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_upsert (
|
||||
((ase_awk_val_map_t*)this->val)->map, idx, iln, x2);
|
||||
((ase_awk_val_map_t*)this->val)->map,
|
||||
(char_t*)idx, iln, x2, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
ase_awk_refdownval (this->run->run, x2);
|
||||
@ -739,7 +747,8 @@ 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_upsert (
|
||||
((ase_awk_val_map_t*)x)->map, idx, iln, x2);
|
||||
((ase_awk_val_map_t*)x)->map,
|
||||
(char_t*)idx, iln, x2, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
ase_awk_refdownval (this->run->run, x2);
|
||||
@ -759,7 +768,8 @@ 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_upsert (
|
||||
((ase_awk_val_map_t*)this->val)->map, idx, iln, x2);
|
||||
((ase_awk_val_map_t*)this->val)->map,
|
||||
(char_t*)idx, iln, x2, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
ase_awk_refdownval (this->run->run, x2);
|
||||
@ -1154,9 +1164,12 @@ int Awk::open ()
|
||||
ase_awk_setccls (awk, &ccls);
|
||||
ase_awk_setprmfns (awk, &prmfns);
|
||||
|
||||
|
||||
//functionMap = ase_map_open (
|
||||
// this, 512, 70, freeFunctionMapValue, ASE_NULL,
|
||||
// ase_awk_getmmgr(awk));
|
||||
functionMap = ase_map_open (
|
||||
this, 512, 70, freeFunctionMapValue, ASE_NULL,
|
||||
ase_awk_getmmgr(awk));
|
||||
ase_awk_getmmgr(awk), ASE_SIZEOF(this), 512, 70);
|
||||
if (functionMap == ASE_NULL)
|
||||
{
|
||||
ase_awk_close (awk);
|
||||
@ -1166,6 +1179,11 @@ int Awk::open ()
|
||||
return -1;
|
||||
}
|
||||
|
||||
*(Awk**)ase_map_getextension(functionMap) = this;
|
||||
ase_map_setcopier (functionMap, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE);
|
||||
ase_map_setfreeer (functionMap, ASE_MAP_VAL, freeFunctionMapValue);
|
||||
ase_map_setscale (functionMap, ASE_MAP_KEY, ASE_SIZEOF(ase_char_t));
|
||||
|
||||
int opt =
|
||||
OPT_IMPLICIT |
|
||||
OPT_EXTIO |
|
||||
@ -1366,7 +1384,7 @@ int Awk::dispatchFunction (Run* run, const char_t* name, size_t len)
|
||||
|
||||
//awk = ase_awk_getrunawk (run);
|
||||
|
||||
pair = ase_map_get (functionMap, name, len);
|
||||
pair = ase_map_search (functionMap, name, len);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
run->setError (ERR_FNNONE, 0, name, len);
|
||||
@ -1374,7 +1392,7 @@ int Awk::dispatchFunction (Run* run, const char_t* name, size_t len)
|
||||
}
|
||||
|
||||
FunctionHandler handler;
|
||||
handler = *(FunctionHandler*)ASE_PAIR_VAL(pair);
|
||||
handler = *(FunctionHandler*)ASE_MAP_VPTR(pair);
|
||||
|
||||
size_t i, nargs = ase_awk_getnargs(run->run);
|
||||
|
||||
@ -1464,7 +1482,8 @@ int Awk::addFunction (
|
||||
return -1;
|
||||
}
|
||||
|
||||
pair_t* pair = ase_map_upsert (functionMap, name, nameLen, tmp);
|
||||
pair_t* pair = ase_map_upsert (
|
||||
functionMap, (char_t*)name, nameLen, tmp, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
ase_awk_delfunc (awk, name, nameLen);
|
||||
@ -1484,7 +1503,7 @@ int Awk::deleteFunction (const char_t* name)
|
||||
size_t nameLen = ase_strlen(name);
|
||||
|
||||
int n = ase_awk_delfunc (awk, name, nameLen);
|
||||
if (n == 0) ase_map_remove (functionMap, name, nameLen);
|
||||
if (n == 0) ase_map_delete (functionMap, name, nameLen);
|
||||
else retrieveError ();
|
||||
|
||||
return n;
|
||||
@ -1660,10 +1679,11 @@ int Awk::functionHandler (
|
||||
return awk->dispatchFunction (ctx, name, len);
|
||||
}
|
||||
|
||||
void Awk::freeFunctionMapValue (void* owner, void* value)
|
||||
void Awk::freeFunctionMapValue (map_t* map, void* dptr, size_t dlen)
|
||||
{
|
||||
Awk* awk = (Awk*)owner;
|
||||
ase_awk_free (awk->awk, value);
|
||||
//Awk* awk = (Awk*)owner;
|
||||
Awk* awk = *(Awk**)ase_map_getextension(map);
|
||||
ase_awk_free (awk->awk, dptr);
|
||||
}
|
||||
|
||||
void Awk::onRunStart (run_t* run, void* data)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk.c 389 2008-09-26 08:01:24Z baconevi $
|
||||
* $Id: awk.c 391 2008-09-27 09:51:23Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -107,7 +107,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext)
|
||||
*(ase_awk_t**)ASE_MAP_EXTENSION(awk->tree.afns) = awk;
|
||||
ase_map_setcopier (awk->tree.afns, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE);
|
||||
ase_map_setfreeer (awk->tree.afns, ASE_MAP_VAL, free_afn);
|
||||
ase_map_setcale (awk->tree.afns, ASE_MAP_KEY, ASE_SIZEOF(ase_char_t));
|
||||
ase_map_setscale (awk->tree.afns, ASE_MAP_KEY, ASE_SIZEOF(ase_char_t));
|
||||
|
||||
awk->parse.afns = ase_map_open (mmgr, ASE_SIZEOF(awk), 256, 70);
|
||||
if (awk->parse.afns == ASE_NULL)
|
||||
@ -456,7 +456,7 @@ 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));
|
||||
p = ase_map_search (awk->wtab, kw, len);
|
||||
if (p == ASE_NULL)
|
||||
{
|
||||
SETERRARG (awk, ASE_AWK_ENOENT, 0, kw, len);
|
||||
@ -464,7 +464,7 @@ int ase_awk_unsetword (ase_awk_t* awk, const ase_char_t* kw, ase_size_t len)
|
||||
}
|
||||
|
||||
ase_map_delete (awk->rwtab, ASE_MAP_VPTR(p), ASE_MAP_VLEN(p));
|
||||
ase_map_delete (awk->wtab, kw, ASE_NCHARS_TO_NBYTES(len));
|
||||
ase_map_delete (awk->wtab, kw, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -501,18 +501,16 @@ int ase_awk_setword (ase_awk_t* awk,
|
||||
|
||||
/* set the word */
|
||||
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)
|
||||
(ase_char_t*)okw, olen, (ase_char_t*)nkw, nlen) == ASE_NULL)
|
||||
{
|
||||
SETERR (awk, ASE_AWK_ENOMEM);
|
||||
return -1;
|
||||
}
|
||||
|
||||
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_char_t*)nkw, nlen, (ase_char_t*)okw, olen) == ASE_NULL)
|
||||
{
|
||||
ase_map_delete (awk->wtab, okw, ASE_NCHARS_TO_NBYTES(olen));
|
||||
ase_map_delete (awk->wtab, okw, olen);
|
||||
SETERR (awk, ASE_AWK_ENOMEM);
|
||||
return -1;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: func.c 389 2008-09-26 08:01:24Z baconevi $
|
||||
* $Id: func.c 391 2008-09-27 09:51:23Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -112,7 +112,7 @@ void* ase_awk_addfunc (
|
||||
int ase_awk_delfunc (
|
||||
ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len)
|
||||
{
|
||||
if (ase_map_remove (awk->bfn.user, name, name_len) == -1)
|
||||
if (ase_map_delete (awk->bfn.user, name, name_len) == -1)
|
||||
{
|
||||
ase_cstr_t errarg;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: parse.c 389 2008-09-26 08:01:24Z baconevi $
|
||||
* $Id: parse.c 391 2008-09-27 09:51:23Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -825,7 +825,6 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk)
|
||||
ase_awk_afn_t* afn;
|
||||
ase_size_t nargs, g;
|
||||
ase_map_pair_t* pair;
|
||||
int n;
|
||||
|
||||
/* eat up the keyword 'function' and get the next token */
|
||||
ASE_ASSERT (MATCH(awk,TOKEN_FUNCTION));
|
||||
@ -1080,9 +1079,12 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk)
|
||||
afn->nargs = nargs;
|
||||
afn->body = body;
|
||||
|
||||
n = ase_map_upsertx (awk->tree.afns, name_dup, name_len, afn, &pair);
|
||||
if (n < 0)
|
||||
pair = ase_map_insert (awk->tree.afns, name_dup, name_len, afn, 0);
|
||||
if (pair == ASE_NULL)
|
||||
{
|
||||
/* if ase_map_insert() fails for other reasons than memory
|
||||
* shortage, there should be implementaion errors as duplicate
|
||||
* functions are detected earlier in this function */
|
||||
ASE_AWK_FREE (awk, name_dup);
|
||||
ase_awk_clrpt (awk, body);
|
||||
ASE_AWK_FREE (awk, afn);
|
||||
@ -1091,9 +1093,6 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk)
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
/* duplicate functions should have been detected previously */
|
||||
ASE_ASSERT (n != 0);
|
||||
|
||||
/* 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);
|
||||
@ -1101,7 +1100,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk)
|
||||
ASE_AWK_FREE (awk, name_dup);
|
||||
|
||||
/* remove an undefined function call entry from the parse.afn table */
|
||||
ase_map_remove (awk->parse.afns, afn->name.ptr, name_len);
|
||||
ase_map_delete (awk->parse.afns, afn->name.ptr, name_len);
|
||||
return body;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: run.c 390 2008-09-26 15:30:49Z baconevi $
|
||||
* $Id: run.c 391 2008-09-27 09:51:23Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -2552,7 +2552,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ase_map_remove (map, key, keylen);
|
||||
ase_map_delete (map, key, keylen);
|
||||
if (key != buf) ASE_AWK_FREE (run->awk, key);
|
||||
}
|
||||
else
|
||||
@ -2676,7 +2676,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde)
|
||||
run->errlin = var->line;
|
||||
return -1;
|
||||
}
|
||||
ase_map_remove (map, key, keylen);
|
||||
ase_map_delete (map, key, keylen);
|
||||
if (key != buf) ASE_AWK_FREE (run->awk, key);
|
||||
}
|
||||
else
|
||||
@ -2713,7 +2713,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.ptr, var->id.name.len);
|
||||
ase_map_delete (run->named, var->id.name.ptr, var->id.name.len);
|
||||
}
|
||||
else if (var->type == ASE_AWK_NDE_GLOBAL ||
|
||||
var->type == ASE_AWK_NDE_LOCAL ||
|
||||
|
@ -47,7 +47,7 @@ ase_awk_t* ase_awk_openstd (void)
|
||||
awk = ase_awk_open (ASE_MMGR_GETDFL(), ASE_SIZEOF(ext_t));
|
||||
ase_awk_setccls (awk, ASE_CCLS_GETDFL());
|
||||
|
||||
ext = (ext_t*)ASE_AWK_EXTENSION(awk);
|
||||
ext = (ext_t*)ase_awk_getextension(awk);
|
||||
ext->prmfns.pow = custom_awk_pow;
|
||||
ext->prmfns.sprintf = custom_awk_sprintf;
|
||||
ext->prmfns.dprintf = custom_awk_dprintf;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: map.c 388 2008-09-26 07:26:20Z baconevi $
|
||||
* $Id: map.c 391 2008-09-27 09:51:23Z baconevi $
|
||||
*
|
||||
* {License}
|
||||
*/
|
||||
@ -24,10 +24,10 @@
|
||||
#define NEXT(p) ASE_MAP_NEXT(p)
|
||||
|
||||
#define SIZEOF(x) ASE_SIZEOF(x)
|
||||
#define size_t ase_size_t
|
||||
#define byte_t ase_byte_t
|
||||
#define uint_t ase_uint_t
|
||||
#define mmgr_t ase_mmgr_t
|
||||
#define size_t ase_size_t
|
||||
#define byte_t ase_byte_t
|
||||
#define uint_t ase_uint_t
|
||||
#define mmgr_t ase_mmgr_t
|
||||
|
||||
#define KTOB(map,len) ((len)*(map)->scale[ASE_MAP_KEY])
|
||||
#define VTOB(map,len) ((len)*(map)->scale[ASE_MAP_VAL])
|
||||
@ -108,11 +108,11 @@ static pair_t* alloc_pair (map_t* map,
|
||||
}
|
||||
else
|
||||
{
|
||||
n->vptr = vcop (map, vptr, vlen);
|
||||
if (n->vptr != ASE_NULL)
|
||||
VPTR(n) = vcop (map, vptr, vlen);
|
||||
if (VPTR(n) != ASE_NULL)
|
||||
{
|
||||
if (map->freeer[ASE_MAP_KEY] != ASE_NULL)
|
||||
map->freeer[ASE_MAP_KEY] (map, n->kptr, n->klen);
|
||||
map->freeer[ASE_MAP_KEY] (map, KPTR(n), KLEN(n));
|
||||
ASE_MMGR_FREE (map->mmgr, n);
|
||||
return ASE_NULL;
|
||||
}
|
||||
@ -274,25 +274,29 @@ void ase_map_fini (map_t* map)
|
||||
ASE_MMGR_FREE (map->mmgr, map->bucket);
|
||||
}
|
||||
|
||||
void ase_map_clear (map_t* map)
|
||||
void* ase_map_getextension (map_t* map)
|
||||
{
|
||||
size_t i;
|
||||
pair_t* pair, * next;
|
||||
return map + 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < map->capa; i++)
|
||||
{
|
||||
pair = map->bucket[i];
|
||||
mmgr_t* ase_map_getmmgr (map_t* map)
|
||||
{
|
||||
return map->mmgr;
|
||||
}
|
||||
|
||||
while (pair != ASE_NULL)
|
||||
{
|
||||
next = NEXT(pair);
|
||||
free_pair (map, pair);
|
||||
map->size--;
|
||||
pair = next;
|
||||
}
|
||||
void ase_map_setmmgr (map_t* map, mmgr_t* mmgr)
|
||||
{
|
||||
map->mmgr = mmgr;
|
||||
}
|
||||
|
||||
map->bucket[i] = ASE_NULL;
|
||||
}
|
||||
size_t ase_map_getsize (map_t* map)
|
||||
{
|
||||
return map->size;
|
||||
}
|
||||
|
||||
size_t ase_map_getcapa (map_t* map)
|
||||
{
|
||||
return map->capa;
|
||||
}
|
||||
|
||||
int ase_map_getscale (map_t* map, int id)
|
||||
@ -386,31 +390,6 @@ void ase_map_setsizer (map_t* map, sizer_t sizer)
|
||||
map->sizer = sizer;
|
||||
}
|
||||
|
||||
void* ase_map_getextension (map_t* map)
|
||||
{
|
||||
return map + 1;
|
||||
}
|
||||
|
||||
mmgr_t* ase_map_getmmgr (map_t* map)
|
||||
{
|
||||
return map->mmgr;
|
||||
}
|
||||
|
||||
void ase_map_setmmgr (map_t* map, mmgr_t* mmgr)
|
||||
{
|
||||
map->mmgr = mmgr;
|
||||
}
|
||||
|
||||
size_t ase_map_getsize (map_t* map)
|
||||
{
|
||||
return map->size;
|
||||
}
|
||||
|
||||
size_t ase_map_getcapa (map_t* map)
|
||||
{
|
||||
return map->capa;
|
||||
}
|
||||
|
||||
pair_t* ase_map_search (map_t* map, const void* kptr, size_t klen)
|
||||
{
|
||||
pair_t* pair;
|
||||
@ -605,6 +584,28 @@ int ase_map_delete (map_t* map, const void* kptr, size_t klen)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ase_map_clear (map_t* map)
|
||||
{
|
||||
size_t i;
|
||||
pair_t* pair, * next;
|
||||
|
||||
for (i = 0; i < map->capa; i++)
|
||||
{
|
||||
pair = map->bucket[i];
|
||||
|
||||
while (pair != ASE_NULL)
|
||||
{
|
||||
next = NEXT(pair);
|
||||
free_pair (map, pair);
|
||||
map->size--;
|
||||
pair = next;
|
||||
}
|
||||
|
||||
map->bucket[i] = ASE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ase_map_walk (map_t* map, walker_t walker, void* arg)
|
||||
{
|
||||
size_t i;
|
||||
|
@ -21,6 +21,8 @@
|
||||
#define DLEN(n) ASE_SLL_DLEN(n)
|
||||
#define NEXT(n) ASE_SLL_NEXT(n)
|
||||
|
||||
#define TOB(sll,len) ((len)*(sll)->scale)
|
||||
|
||||
#define size_t ase_size_t
|
||||
#define mmgr_t ase_mmgr_t
|
||||
|
||||
@ -55,6 +57,8 @@ sll_t* ase_sll_init (sll_t* sll, mmgr_t* mmgr)
|
||||
/* do not zero out the extension */
|
||||
ASE_MEMSET (sll, 0, ASE_SIZEOF(sll_t));
|
||||
sll->mmgr = mmgr;
|
||||
sll->size = 0;
|
||||
sll->scale = 1;
|
||||
return sll;
|
||||
}
|
||||
|
||||
@ -63,12 +67,6 @@ void ase_sll_fini (sll_t* sll)
|
||||
ase_sll_clear (sll);
|
||||
}
|
||||
|
||||
void ase_sll_clear (sll_t* sll)
|
||||
{
|
||||
while (HEAD(sll) != ASE_NULL) ase_sll_delete (sll, HEAD(sll));
|
||||
ASE_ASSERT (TAIL(sll) == ASE_NULL);
|
||||
}
|
||||
|
||||
void* ase_sll_getextension (sll_t* sll)
|
||||
{
|
||||
return sll + 1;
|
||||
@ -99,6 +97,22 @@ node_t* ase_sll_gettail (sll_t* sll)
|
||||
return TAIL(sll);
|
||||
}
|
||||
|
||||
int ase_sll_getscale (sll_t* sll)
|
||||
{
|
||||
return sll->scale;
|
||||
}
|
||||
|
||||
void ase_sll_setscale (sll_t* sll, int scale)
|
||||
{
|
||||
ASE_ASSERTX (scale > 0 && scale <= ASE_TYPE_MAX(ase_byte_t),
|
||||
"The scale should be larger than 0 and less than or equal to the maximum value that the ase_byte_t type can hold");
|
||||
|
||||
if (scale <= 0) scale = 1;
|
||||
if (scale > ASE_TYPE_MAX(ase_byte_t)) scale = ASE_TYPE_MAX(ase_byte_t);
|
||||
|
||||
sll->scale = scale;
|
||||
}
|
||||
|
||||
copier_t ase_sll_getcopier (sll_t* sll)
|
||||
{
|
||||
return sll->copier;
|
||||
@ -131,10 +145,11 @@ static node_t* alloc_node (sll_t* sll, void* dptr, size_t dlen)
|
||||
}
|
||||
else if (sll->copier == ASE_SLL_COPIER_INLINE)
|
||||
{
|
||||
n = ASE_MMGR_ALLOC (sll->mmgr, ASE_SIZEOF(node_t) + dlen);
|
||||
n = ASE_MMGR_ALLOC (sll->mmgr,
|
||||
ASE_SIZEOF(node_t) + TOB(sll,dlen));
|
||||
if (n == ASE_NULL) return ASE_NULL;
|
||||
|
||||
ASE_MEMCPY (n + 1, dptr, dlen);
|
||||
ASE_MEMCPY (n + 1, dptr, TOB(sll,dlen));
|
||||
DPTR(n) = n + 1;
|
||||
}
|
||||
else
|
||||
@ -191,16 +206,6 @@ node_t* ase_sll_insert (
|
||||
return n;
|
||||
}
|
||||
|
||||
node_t* ase_sll_pushhead (sll_t* sll, void* data, size_t size)
|
||||
{
|
||||
return ase_sll_insert (sll, HEAD(sll), data, size);
|
||||
}
|
||||
|
||||
node_t* ase_sll_pushtail (sll_t* sll, void* data, size_t size)
|
||||
{
|
||||
return ase_sll_insert (sll, ASE_NULL, data, size);
|
||||
}
|
||||
|
||||
void ase_sll_delete (sll_t* sll, node_t* pos)
|
||||
{
|
||||
if (pos == ASE_NULL) return; /* not a valid node */
|
||||
@ -238,6 +243,22 @@ void ase_sll_delete (sll_t* sll, node_t* pos)
|
||||
SIZE(sll)--;
|
||||
}
|
||||
|
||||
void ase_sll_clear (sll_t* sll)
|
||||
{
|
||||
while (HEAD(sll) != ASE_NULL) ase_sll_delete (sll, HEAD(sll));
|
||||
ASE_ASSERT (TAIL(sll) == ASE_NULL);
|
||||
}
|
||||
|
||||
node_t* ase_sll_pushhead (sll_t* sll, void* data, size_t size)
|
||||
{
|
||||
return ase_sll_insert (sll, HEAD(sll), data, size);
|
||||
}
|
||||
|
||||
node_t* ase_sll_pushtail (sll_t* sll, void* data, size_t size)
|
||||
{
|
||||
return ase_sll_insert (sll, ASE_NULL, data, size);
|
||||
}
|
||||
|
||||
void ase_sll_pophead (sll_t* sll)
|
||||
{
|
||||
ase_sll_delete (sll, HEAD(sll));
|
||||
|
Reference in New Issue
Block a user