renamed qse_lda_t to qse_arr_t

This commit is contained in:
2016-09-23 14:53:51 +00:00
parent dfdc6ae045
commit 7f24950536
19 changed files with 1777 additions and 1777 deletions

View File

@ -31,7 +31,7 @@
#include <qse/cmn/chr.h>
#include <qse/cmn/str.h>
#include <qse/cmn/htb.h>
#include <qse/cmn/lda.h>
#include <qse/cmn/arr.h>
#include <qse/cmn/rex.h>
#include <qse/cmn/rbt.h>
@ -176,13 +176,13 @@ struct qse_awk_t
qse_htb_t* named;
/* global variables */
qse_lda_t* gbls;
qse_arr_t* gbls;
/* local variables */
qse_lda_t* lcls;
qse_arr_t* lcls;
/* parameters to a function */
qse_lda_t* params;
qse_arr_t* params;
/* maximum number of local variables */
qse_size_t nlcls_max;

View File

@ -194,9 +194,9 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm)
awk->parse.funs = qse_htb_open (mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1);
awk->parse.named = qse_htb_open (mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1);
awk->parse.gbls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 128);
awk->parse.lcls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 64);
awk->parse.params = qse_lda_open (mmgr, QSE_SIZEOF(awk), 32);
awk->parse.gbls = qse_arr_open (mmgr, QSE_SIZEOF(awk), 128);
awk->parse.lcls = qse_arr_open (mmgr, QSE_SIZEOF(awk), 64);
awk->parse.params = qse_arr_open (mmgr, QSE_SIZEOF(awk), 32);
awk->fnc.sys = QSE_NULL;
awk->fnc.user = qse_htb_open (mmgr, QSE_SIZEOF(awk), 512, 70, QSE_SIZEOF(qse_char_t), 1);
@ -225,16 +225,16 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm)
qse_htb_setstyle (awk->parse.named, qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER));
*(qse_awk_t**)QSE_XTN(awk->parse.gbls) = awk;
qse_lda_setscale (awk->parse.gbls, QSE_SIZEOF(qse_char_t));
qse_lda_setcopier (awk->parse.gbls, QSE_LDA_COPIER_INLINE);
qse_arr_setscale (awk->parse.gbls, QSE_SIZEOF(qse_char_t));
qse_arr_setcopier (awk->parse.gbls, QSE_ARR_COPIER_INLINE);
*(qse_awk_t**)QSE_XTN(awk->parse.lcls) = awk;
qse_lda_setscale (awk->parse.lcls, QSE_SIZEOF(qse_char_t));
qse_lda_setcopier (awk->parse.lcls, QSE_LDA_COPIER_INLINE);
qse_arr_setscale (awk->parse.lcls, QSE_SIZEOF(qse_char_t));
qse_arr_setcopier (awk->parse.lcls, QSE_ARR_COPIER_INLINE);
*(qse_awk_t**)QSE_XTN(awk->parse.params) = awk;
qse_lda_setscale (awk->parse.params, QSE_SIZEOF(qse_char_t));
qse_lda_setcopier (awk->parse.params, QSE_LDA_COPIER_INLINE);
qse_arr_setscale (awk->parse.params, QSE_SIZEOF(qse_char_t));
qse_arr_setcopier (awk->parse.params, QSE_ARR_COPIER_INLINE);
*(qse_awk_t**)QSE_XTN(awk->fnc.user) = awk;
qse_htb_setstyle (awk->fnc.user, &fncusercbs);
@ -252,9 +252,9 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm)
oops:
if (awk->modtab) qse_rbt_close (awk->modtab);
if (awk->fnc.user) qse_htb_close (awk->fnc.user);
if (awk->parse.params) qse_lda_close (awk->parse.params);
if (awk->parse.lcls) qse_lda_close (awk->parse.lcls);
if (awk->parse.gbls) qse_lda_close (awk->parse.gbls);
if (awk->parse.params) qse_arr_close (awk->parse.params);
if (awk->parse.lcls) qse_arr_close (awk->parse.lcls);
if (awk->parse.gbls) qse_arr_close (awk->parse.gbls);
if (awk->parse.named) qse_htb_close (awk->parse.named);
if (awk->parse.funs) qse_htb_close (awk->parse.funs);
if (awk->tree.funs) qse_htb_close (awk->tree.funs);
@ -279,9 +279,9 @@ void qse_awk_fini (qse_awk_t* awk)
qse_rbt_close (awk->modtab);
qse_htb_close (awk->fnc.user);
qse_lda_close (awk->parse.params);
qse_lda_close (awk->parse.lcls);
qse_lda_close (awk->parse.gbls);
qse_arr_close (awk->parse.params);
qse_arr_close (awk->parse.lcls);
qse_arr_close (awk->parse.gbls);
qse_htb_close (awk->parse.named);
qse_htb_close (awk->parse.funs);
@ -329,14 +329,14 @@ void qse_awk_clear (qse_awk_t* awk)
qse_rbt_walk (awk->modtab, unload_module, awk);
qse_rbt_clear (awk->modtab);
QSE_ASSERT (QSE_LDA_SIZE(awk->parse.gbls) == awk->tree.ngbls);
QSE_ASSERT (QSE_ARR_SIZE(awk->parse.gbls) == awk->tree.ngbls);
/* delete all non-builtin global variables */
qse_lda_delete (
qse_arr_delete (
awk->parse.gbls, awk->tree.ngbls_base,
QSE_LDA_SIZE(awk->parse.gbls) - awk->tree.ngbls_base);
QSE_ARR_SIZE(awk->parse.gbls) - awk->tree.ngbls_base);
qse_lda_clear (awk->parse.lcls);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.lcls);
qse_arr_clear (awk->parse.params);
qse_htb_clear (awk->parse.named);
qse_htb_clear (awk->parse.funs);

View File

@ -523,10 +523,10 @@ static void unget_char (qse_awk_t* awk, const qse_awk_sio_lxc_t* c)
const qse_char_t* qse_awk_getgblname (
qse_awk_t* awk, qse_size_t idx, qse_size_t* len)
{
QSE_ASSERT (idx < QSE_LDA_SIZE(awk->parse.gbls));
QSE_ASSERT (idx < QSE_ARR_SIZE(awk->parse.gbls));
*len = QSE_LDA_DLEN(awk->parse.gbls,idx);
return QSE_LDA_DPTR(awk->parse.gbls,idx);
*len = QSE_ARR_DLEN(awk->parse.gbls,idx);
return QSE_ARR_DPTR(awk->parse.gbls,idx);
}
void qse_awk_getkwname (qse_awk_t* awk, qse_awk_kwid_t id, qse_cstr_t* s)
@ -604,7 +604,7 @@ static int parse (qse_awk_t* awk)
}
}
QSE_ASSERT (awk->tree.ngbls == QSE_LDA_SIZE(awk->parse.gbls));
QSE_ASSERT (awk->tree.ngbls == QSE_ARR_SIZE(awk->parse.gbls));
ret = 0;
oops:
@ -853,13 +853,13 @@ static int parse_progunit (qse_awk_t* awk)
if (get_token(awk) <= -1) return -1;
QSE_ASSERT (awk->tree.ngbls == QSE_LDA_SIZE(awk->parse.gbls));
QSE_ASSERT (awk->tree.ngbls == QSE_ARR_SIZE(awk->parse.gbls));
ngbls = awk->tree.ngbls;
if (collect_globals (awk) == QSE_NULL)
{
qse_lda_delete (
qse_arr_delete (
awk->parse.gbls, ngbls,
QSE_LDA_SIZE(awk->parse.gbls) - ngbls);
QSE_ARR_SIZE(awk->parse.gbls) - ngbls);
awk->tree.ngbls = ngbls;
return -1;
}
@ -1117,7 +1117,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
/* check if it conflicts with a named variable */
(qse_htb_search (awk->parse.named, name.ptr, name.len) != QSE_NULL && (rederr = QSE_AWK_EVARRED)) ||
/* check if it coincides to be a global variable name */
(((g = find_global (awk, &name)) != QSE_LDA_NIL) && (rederr = QSE_AWK_EGBLRED)))
(((g = find_global (awk, &name)) != QSE_ARR_NIL) && (rederr = QSE_AWK_EGBLRED)))
{
qse_awk_seterror (awk, rederr, &name, &awk->tok.loc);
return QSE_NULL;
@ -1155,7 +1155,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
}
/* make sure that parameter table is empty */
QSE_ASSERT (QSE_LDA_SIZE(awk->parse.params) == 0);
QSE_ASSERT (QSE_ARR_SIZE(awk->parse.params) == 0);
/* read parameter list */
if (MATCH(awk,TOK_RPAREN))
@ -1177,7 +1177,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (!MATCH(awk,TOK_IDENT))
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
SETERR_TOK (awk, QSE_AWK_EBADPAR);
return QSE_NULL;
}
@ -1197,10 +1197,10 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
* name or other parameters */
if (((awk->opt.trait & QSE_AWK_STRICTNAMING) &&
qse_strxncmp (pa, pal, name.ptr, name.len) == 0) ||
qse_lda_search (awk->parse.params, 0, pa, pal) != QSE_LDA_NIL)
qse_arr_search (awk->parse.params, 0, pa, pal) != QSE_ARR_NIL)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
SETERR_ARG_LOC (
awk, QSE_AWK_EDUPPAR,
pa, pal, &awk->tok.loc);
@ -1208,21 +1208,21 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
}
/* push the parameter to the parameter list */
if (QSE_LDA_SIZE(awk->parse.params) >= QSE_AWK_MAX_PARAMS)
if (QSE_ARR_SIZE(awk->parse.params) >= QSE_AWK_MAX_PARAMS)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
SETERR_LOC (awk, QSE_AWK_EPARTM, &awk->tok.loc);
return QSE_NULL;
}
if (qse_lda_insert (
if (qse_arr_insert (
awk->parse.params,
QSE_LDA_SIZE(awk->parse.params),
pa, pal) == QSE_LDA_NIL)
QSE_ARR_SIZE(awk->parse.params),
pa, pal) == QSE_ARR_NIL)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc);
return QSE_NULL;
}
@ -1230,7 +1230,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (get_token (awk) <= -1)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
return QSE_NULL;
}
@ -1239,7 +1239,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (!MATCH(awk,TOK_COMMA))
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
SETERR_TOK (awk, QSE_AWK_ECOMMA);
return QSE_NULL;
}
@ -1249,7 +1249,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (get_token(awk) <= -1)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
return QSE_NULL;
}
}
@ -1259,7 +1259,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (get_token(awk) <= -1)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
return QSE_NULL;
}
}
@ -1273,7 +1273,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (get_token(awk) <= -1)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
return QSE_NULL;
}
}
@ -1282,7 +1282,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (!MATCH(awk,TOK_LBRACE))
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
SETERR_TOK (awk, QSE_AWK_ELBRACE);
return QSE_NULL;
@ -1290,7 +1290,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (get_token(awk) <= -1)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
return QSE_NULL;
}
@ -1310,15 +1310,15 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (body == QSE_NULL)
{
QSE_AWK_FREE (awk, name.ptr);
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
return QSE_NULL;
}
/* TODO: study furthur if the parameter names should be saved
* for some reasons - might be needed for better deparsing output */
nargs = QSE_LDA_SIZE(awk->parse.params);
nargs = QSE_ARR_SIZE(awk->parse.params);
/* parameter names are not required anymore. clear them */
qse_lda_clear (awk->parse.params);
qse_arr_clear (awk->parse.params);
fun = (qse_awk_fun_t*) qse_awk_callocmem (awk, QSE_SIZEOF(*fun));
if (fun == QSE_NULL)
@ -1462,7 +1462,7 @@ static qse_awk_nde_t* parse_block (
qse_awk_nde_blk_t* block;
qse_size_t nlcls, nlcls_max, tmp;
nlcls = QSE_LDA_SIZE(awk->parse.lcls);
nlcls = QSE_ARR_SIZE(awk->parse.lcls);
nlcls_max = awk->parse.nlcls_max;
/* local variable declarations */
@ -1499,17 +1499,17 @@ static qse_awk_nde_t* parse_block (
/* @local ... */
if (get_token(awk) <= -1)
{
qse_lda_delete (
qse_arr_delete (
awk->parse.lcls, nlcls,
QSE_LDA_SIZE(awk->parse.lcls)-nlcls);
QSE_ARR_SIZE(awk->parse.lcls)-nlcls);
return QSE_NULL;
}
if (collect_locals (awk, nlcls, istop) == QSE_NULL)
{
qse_lda_delete (
qse_arr_delete (
awk->parse.lcls, nlcls,
QSE_LDA_SIZE(awk->parse.lcls)-nlcls);
QSE_ARR_SIZE(awk->parse.lcls)-nlcls);
return QSE_NULL;
}
}
@ -1530,9 +1530,9 @@ static qse_awk_nde_t* parse_block (
/* if EOF is met before the right brace, this is an error */
if (MATCH(awk,TOK_EOF))
{
qse_lda_delete (
qse_arr_delete (
awk->parse.lcls, nlcls,
QSE_LDA_SIZE(awk->parse.lcls) - nlcls);
QSE_ARR_SIZE(awk->parse.lcls) - nlcls);
if (head != QSE_NULL) qse_awk_clrpt (awk, head);
SETERR_LOC (awk, QSE_AWK_EEOF, &awk->tok.loc);
return QSE_NULL;
@ -1543,9 +1543,9 @@ static qse_awk_nde_t* parse_block (
{
if (get_token(awk) <= -1)
{
qse_lda_delete (
qse_arr_delete (
awk->parse.lcls, nlcls,
QSE_LDA_SIZE(awk->parse.lcls)-nlcls);
QSE_ARR_SIZE(awk->parse.lcls)-nlcls);
if (head != QSE_NULL) qse_awk_clrpt (awk, head);
return QSE_NULL;
}
@ -1583,9 +1583,9 @@ static qse_awk_nde_t* parse_block (
if (nde == QSE_NULL)
{
qse_lda_delete (
qse_arr_delete (
awk->parse.lcls, nlcls,
QSE_LDA_SIZE(awk->parse.lcls)-nlcls);
QSE_ARR_SIZE(awk->parse.lcls)-nlcls);
if (head != QSE_NULL) qse_awk_clrpt (awk, head);
return QSE_NULL;
}
@ -1613,19 +1613,19 @@ static qse_awk_nde_t* parse_block (
block = (qse_awk_nde_blk_t*) qse_awk_callocmem (awk, QSE_SIZEOF(*block));
if (block == QSE_NULL)
{
qse_lda_delete (
qse_arr_delete (
awk->parse.lcls, nlcls,
QSE_LDA_SIZE(awk->parse.lcls)-nlcls);
QSE_ARR_SIZE(awk->parse.lcls)-nlcls);
qse_awk_clrpt (awk, head);
ADJERR_LOC (awk, xloc);
return QSE_NULL;
}
tmp = QSE_LDA_SIZE(awk->parse.lcls);
tmp = QSE_ARR_SIZE(awk->parse.lcls);
if (tmp > awk->parse.nlcls_max) awk->parse.nlcls_max = tmp;
/* remove all lcls to move it up to the top level */
qse_lda_delete (awk->parse.lcls, nlcls, tmp - nlcls);
qse_arr_delete (awk->parse.lcls, nlcls, tmp - nlcls);
/* adjust the number of lcls for a block without any statements */
/* if (head == QSE_NULL) tmp = 0; */
@ -1687,12 +1687,12 @@ int qse_awk_initgbls (qse_awk_t* awk)
{
qse_size_t g;
g = qse_lda_insert (
g = qse_arr_insert (
awk->parse.gbls,
QSE_LDA_SIZE(awk->parse.gbls),
QSE_ARR_SIZE(awk->parse.gbls),
(qse_char_t*)gtab[id].name,
gtab[id].namelen);
if (g == QSE_LDA_NIL) return -1;
if (g == QSE_ARR_NIL) return -1;
QSE_ASSERT ((int)g == id);
@ -1716,11 +1716,11 @@ static void adjust_static_globals (qse_awk_t* awk)
{
if ((awk->opt.trait & gtab[id].trait) != gtab[id].trait)
{
QSE_LDA_DLEN(awk->parse.gbls,id) = 0;
QSE_ARR_DLEN(awk->parse.gbls,id) = 0;
}
else
{
QSE_LDA_DLEN(awk->parse.gbls,id) = gtab[id].namelen;
QSE_ARR_DLEN(awk->parse.gbls,id) = gtab[id].namelen;
}
}
}
@ -1728,33 +1728,33 @@ static void adjust_static_globals (qse_awk_t* awk)
static qse_size_t get_global (qse_awk_t* awk, const qse_cstr_t* name)
{
qse_size_t i;
qse_lda_t* gbls = awk->parse.gbls;
qse_arr_t* gbls = awk->parse.gbls;
for (i = QSE_LDA_SIZE(gbls); i > 0; )
for (i = QSE_ARR_SIZE(gbls); i > 0; )
{
i--;
if (qse_strxncmp (
QSE_LDA_DPTR(gbls,i), QSE_LDA_DLEN(gbls,i),
QSE_ARR_DPTR(gbls,i), QSE_ARR_DLEN(gbls,i),
name->ptr, name->len) == 0) return i;
}
return QSE_LDA_NIL;
return QSE_ARR_NIL;
}
static qse_size_t find_global (qse_awk_t* awk, const qse_cstr_t* name)
{
qse_size_t i;
qse_lda_t* gbls = awk->parse.gbls;
qse_arr_t* gbls = awk->parse.gbls;
for (i = 0; i < QSE_LDA_SIZE(gbls); i++)
for (i = 0; i < QSE_ARR_SIZE(gbls); i++)
{
if (qse_strxncmp (
QSE_LDA_DPTR(gbls,i), QSE_LDA_DLEN(gbls,i),
QSE_ARR_DPTR(gbls,i), QSE_ARR_DLEN(gbls,i),
name->ptr, name->len) == 0) return i;
}
return QSE_LDA_NIL;
return QSE_ARR_NIL;
}
static int add_global (
@ -1793,7 +1793,7 @@ static int add_global (
}
/* check if it conflicts with other global variable names */
if (find_global (awk, name) != QSE_LDA_NIL)
if (find_global (awk, name) != QSE_ARR_NIL)
{
SETERR_ARG_LOC (awk, QSE_AWK_EDUPGBL, name->ptr, name->len, xloc);
return -1;
@ -1813,28 +1813,28 @@ static int add_global (
}
#endif
ngbls = QSE_LDA_SIZE (awk->parse.gbls);
ngbls = QSE_ARR_SIZE (awk->parse.gbls);
if (ngbls >= QSE_AWK_MAX_GBLS)
{
SETERR_LOC (awk, QSE_AWK_EGBLTM, xloc);
return -1;
}
if (qse_lda_insert (awk->parse.gbls,
QSE_LDA_SIZE(awk->parse.gbls),
(qse_char_t*)name->ptr, name->len) == QSE_LDA_NIL)
if (qse_arr_insert (awk->parse.gbls,
QSE_ARR_SIZE(awk->parse.gbls),
(qse_char_t*)name->ptr, name->len) == QSE_ARR_NIL)
{
SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc);
return -1;
}
QSE_ASSERT (ngbls == QSE_LDA_SIZE(awk->parse.gbls) - 1);
QSE_ASSERT (ngbls == QSE_ARR_SIZE(awk->parse.gbls) - 1);
/* the disabled item is inserted normally but
* the name length is reset to zero. */
if (disabled) QSE_LDA_DLEN(awk->parse.gbls,ngbls) = 0;
if (disabled) QSE_ARR_DLEN(awk->parse.gbls,ngbls) = 0;
awk->tree.ngbls = QSE_LDA_SIZE (awk->parse.gbls);
awk->tree.ngbls = QSE_ARR_SIZE (awk->parse.gbls);
QSE_ASSERT (ngbls == awk->tree.ngbls-1);
/* return the id which is the index to the gbl table. */
@ -1888,9 +1888,9 @@ int qse_awk_delgbl (qse_awk_t* awk, const qse_char_t* name)
return -1;
}
n = qse_lda_search (awk->parse.gbls,
n = qse_arr_search (awk->parse.gbls,
QSE_AWK_NUM_STATIC_GBLS, ncs.ptr, ncs.len);
if (n == QSE_LDA_NIL)
if (n == QSE_ARR_NIL)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &ncs);
return -1;
@ -1905,7 +1905,7 @@ int qse_awk_delgbl (qse_awk_t* awk, const qse_char_t* name)
awk->parse.gbls.buf[n].name.ptr[0] = QSE_T('\0');
awk->parse.gbls.buf[n].name.len = 0;
*/
n = qse_lda_uplete (awk->parse.gbls, n, 1);
n = qse_arr_uplete (awk->parse.gbls, n, 1);
QSE_ASSERT (n == 1);
return 0;
@ -1919,9 +1919,9 @@ int qse_awk_findgbl (qse_awk_t* awk, const qse_char_t* name)
ncs.ptr = (qse_char_t*)name;
ncs.len = qse_strlen (name);
n = qse_lda_search (awk->parse.gbls,
n = qse_arr_search (awk->parse.gbls,
QSE_AWK_NUM_STATIC_GBLS, ncs.ptr, ncs.len);
if (n == QSE_LDA_NIL)
if (n == QSE_ARR_NIL)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &ncs);
return -1;
@ -2023,9 +2023,9 @@ static qse_awk_t* collect_locals (
/* check if it conflicts with a parameter name.
* the first level declaration is treated as the same
* scope as the parameter list */
n = qse_lda_search (
n = qse_arr_search (
awk->parse.params, 0, lcl.ptr, lcl.len);
if (n != QSE_LDA_NIL)
if (n != QSE_ARR_NIL)
{
SETERR_ARG_LOC (
awk, QSE_AWK_EPARRED,
@ -2053,8 +2053,8 @@ static qse_awk_t* collect_locals (
}
/* check if it conflicts with other local variable names */
n = qse_lda_search (awk->parse.lcls, nlcls, lcl.ptr, lcl.len);
if (n != QSE_LDA_NIL)
n = qse_arr_search (awk->parse.lcls, nlcls, lcl.ptr, lcl.len);
if (n != QSE_ARR_NIL)
{
SETERR_ARG_LOC (
awk, QSE_AWK_EDUPLCL,
@ -2064,7 +2064,7 @@ static qse_awk_t* collect_locals (
/* check if it conflicts with global variable names */
n = find_global (awk, &lcl);
if (n != QSE_LDA_NIL)
if (n != QSE_ARR_NIL)
{
if (n < awk->tree.ngbls_base)
{
@ -2077,16 +2077,16 @@ static qse_awk_t* collect_locals (
}
}
if (QSE_LDA_SIZE(awk->parse.lcls) >= QSE_AWK_MAX_LCLS)
if (QSE_ARR_SIZE(awk->parse.lcls) >= QSE_AWK_MAX_LCLS)
{
SETERR_LOC (awk, QSE_AWK_ELCLTM, &awk->tok.loc);
return QSE_NULL;
}
if (qse_lda_insert (
if (qse_arr_insert (
awk->parse.lcls,
QSE_LDA_SIZE(awk->parse.lcls),
lcl.ptr, lcl.len) == QSE_LDA_NIL)
QSE_ARR_SIZE(awk->parse.lcls),
lcl.ptr, lcl.len) == QSE_ARR_NIL)
{
SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc);
return QSE_NULL;
@ -4989,17 +4989,17 @@ static qse_awk_nde_t* parse_primary_ident_noseg (
{
nde = parse_hashidx (awk, name, xloc);
}
else if ((idxa = qse_lda_rsearch (awk->parse.lcls, QSE_LDA_SIZE(awk->parse.lcls), name->ptr, name->len)) != QSE_LDA_NIL)
else if ((idxa = qse_arr_rsearch (awk->parse.lcls, QSE_ARR_SIZE(awk->parse.lcls), name->ptr, name->len)) != QSE_ARR_NIL)
{
/* local variable */
nde = parse_variable (awk, xloc, QSE_AWK_NDE_LCL, name, idxa);
}
else if ((idxa = qse_lda_search (awk->parse.params, 0, name->ptr, name->len)) != QSE_LDA_NIL)
else if ((idxa = qse_arr_search (awk->parse.params, 0, name->ptr, name->len)) != QSE_ARR_NIL)
{
/* parameter */
nde = parse_variable (awk, xloc, QSE_AWK_NDE_ARG, name, idxa);
}
else if ((idxa = get_global (awk, name)) != QSE_LDA_NIL)
else if ((idxa = get_global (awk, name)) != QSE_ARR_NIL)
{
/* global variable */
nde = parse_variable (awk, xloc, QSE_AWK_NDE_GBL, name, idxa);
@ -5306,12 +5306,12 @@ static qse_awk_nde_t* parse_hashidx (
}
/* search the local variable list */
idxa = qse_lda_rsearch (
idxa = qse_arr_rsearch (
awk->parse.lcls,
QSE_LDA_SIZE(awk->parse.lcls),
QSE_ARR_SIZE(awk->parse.lcls),
name->ptr, name->len
);
if (idxa != QSE_LDA_NIL)
if (idxa != QSE_ARR_NIL)
{
nde->type = QSE_AWK_NDE_LCLIDX;
nde->loc = *xloc;
@ -5325,8 +5325,8 @@ static qse_awk_nde_t* parse_hashidx (
}
/* search the parameter name list */
idxa = qse_lda_search (awk->parse.params, 0, name->ptr, name->len);
if (idxa != QSE_LDA_NIL)
idxa = qse_arr_search (awk->parse.params, 0, name->ptr, name->len);
if (idxa != QSE_ARR_NIL)
{
nde->type = QSE_AWK_NDE_ARGIDX;
nde->loc = *xloc;
@ -5341,7 +5341,7 @@ static qse_awk_nde_t* parse_hashidx (
/* gets the global variable index */
idxa = get_global (awk, name);
if (idxa != QSE_LDA_NIL)
if (idxa != QSE_ARR_NIL)
{
nde->type = QSE_AWK_NDE_GBLIDX;
nde->loc = *xloc;
@ -6394,8 +6394,8 @@ static int deparse (qse_awk_t* awk)
/* use the actual name if no named variable
* is allowed */
if (qse_awk_putsrcstrn (awk,
QSE_LDA_DPTR(awk->parse.gbls,i),
QSE_LDA_DLEN(awk->parse.gbls,i)) <= -1)
QSE_ARR_DPTR(awk->parse.gbls,i),
QSE_ARR_DLEN(awk->parse.gbls,i)) <= -1)
{
EXIT_DEPARSE ();
}
@ -6419,8 +6419,8 @@ static int deparse (qse_awk_t* awk)
if (!(awk->opt.trait & QSE_AWK_IMPLICIT))
{
if (qse_awk_putsrcstrn (awk,
QSE_LDA_DPTR(awk->parse.gbls,i),
QSE_LDA_DLEN(awk->parse.gbls,i)) <= -1)
QSE_ARR_DPTR(awk->parse.gbls,i),
QSE_ARR_DLEN(awk->parse.gbls,i)) <= -1)
{
EXIT_DEPARSE ();
}

View File

@ -35,6 +35,7 @@ libqsecmn_la_SOURCES = \
alg-rand.c \
alg-search.c \
alg-sort.c \
arr.c \
assert.c \
chr.c \
dll.c \
@ -46,7 +47,6 @@ libqsecmn_la_SOURCES = \
fmt-out.c \
hton.c \
ipad.c \
lda.c \
main.c \
mb8.c \
mbwc.c \

View File

@ -133,8 +133,8 @@ am__DEPENDENCIES_1 =
libqsecmn_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \
alg-sort.c assert.c chr.c dll.c env.c gdl.c htb.c fma.c \
fmt-intmax.c fmt-out.c hton.c ipad.c lda.c main.c mb8.c mbwc.c \
alg-sort.c arr.c assert.c chr.c dll.c env.c gdl.c htb.c fma.c \
fmt-intmax.c fmt-out.c hton.c ipad.c main.c mb8.c mbwc.c \
mbwc-str.c mem.c oht.c opt.c path-base.c path-canon.c \
path-core.c path-merge.c pma.c rbt.c rex.c sll.c slmb.c \
str-beg.c str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c \
@ -148,8 +148,8 @@ am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \
@ENABLE_BUNDLED_UNICODE_TRUE@am__objects_1 = uni.lo
@ENABLE_XCMGRS_TRUE@am__objects_2 = cp949.lo cp950.lo
am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \
alg-sort.lo assert.lo chr.lo dll.lo env.lo gdl.lo htb.lo \
fma.lo fmt-intmax.lo fmt-out.lo hton.lo ipad.lo lda.lo main.lo \
alg-sort.lo arr.lo assert.lo chr.lo dll.lo env.lo gdl.lo \
htb.lo fma.lo fmt-intmax.lo fmt-out.lo hton.lo ipad.lo main.lo \
mb8.lo mbwc.lo mbwc-str.lo mem.lo oht.lo opt.lo path-base.lo \
path-canon.lo path-core.lo path-merge.lo pma.lo rbt.lo rex.lo \
sll.lo slmb.lo str-beg.lo str-cat.lo str-chr.lo str-cnv.lo \
@ -467,18 +467,18 @@ noinst_HEADERS = \
uni-trait.h
libqsecmn_la_SOURCES = alg-base64.c alg-rand.c alg-search.c alg-sort.c \
assert.c chr.c dll.c env.c gdl.c htb.c fma.c fmt-intmax.c \
fmt-out.c hton.c ipad.c lda.c main.c mb8.c mbwc.c mbwc-str.c \
mem.c oht.c opt.c path-base.c path-canon.c path-core.c \
path-merge.c pma.c rbt.c rex.c sll.c slmb.c str-beg.c \
str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c str-del.c \
str-dup.c str-dyn.c str-end.c str-excl.c str-fcpy.c str-fmt.c \
str-fnmat.c str-incl.c str-join.c str-len.c str-pac.c \
str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c str-spl.c \
str-spn.c str-str.c str-subst.c str-tok.c str-trm.c str-word.c \
time.c tmr.c tre.c tre-ast.c tre-compile.c tre-match-bt.c \
tre-match-pa.c tre-parse.c tre-stack.c uri.c utf8.c xma.c \
$(am__append_1) $(am__append_2)
arr.c assert.c chr.c dll.c env.c gdl.c htb.c fma.c \
fmt-intmax.c fmt-out.c hton.c ipad.c main.c mb8.c mbwc.c \
mbwc-str.c mem.c oht.c opt.c path-base.c path-canon.c \
path-core.c path-merge.c pma.c rbt.c rex.c sll.c slmb.c \
str-beg.c str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c \
str-del.c str-dup.c str-dyn.c str-end.c str-excl.c str-fcpy.c \
str-fmt.c str-fnmat.c str-incl.c str-join.c str-len.c \
str-pac.c str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c \
str-spl.c str-spn.c str-str.c str-subst.c str-tok.c str-trm.c \
str-word.c time.c tmr.c tre.c tre-ast.c tre-compile.c \
tre-match-bt.c tre-match-pa.c tre-parse.c tre-stack.c uri.c \
utf8.c xma.c $(am__append_1) $(am__append_2)
libqsecmn_la_LDFLAGS = -version-info 1:0:0 -no-undefined
libqsecmn_la_LIBADD = $(SOCKET_LIBS) $(QUADMATH_LIBS)
@ENABLE_CXX_TRUE@libqsecmnxx_la_SOURCES = \
@ -578,6 +578,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alg-rand.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alg-search.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alg-sort.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arr.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assert.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chr.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp949.Plo@am__quote@
@ -591,7 +592,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htb.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hton.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipad.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mb8.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc-str.Plo@am__quote@

700
qse/lib/cmn/arr.c Normal file
View File

@ -0,0 +1,700 @@
/*
* $Id$
*
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <qse/cmn/arr.h>
#include "mem-prv.h"
#define arr_t qse_arr_t
#define slot_t qse_arr_slot_t
#define copier_t qse_arr_copier_t
#define freeer_t qse_arr_freeer_t
#define comper_t qse_arr_comper_t
#define sizer_t qse_arr_sizer_t
#define keeper_t qse_arr_keeper_t
#define walker_t qse_arr_walker_t
#define mmgr_t qse_mmgr_t
#define size_t qse_size_t
#define TOB(arr,len) ((len)*(arr)->scale)
#define DPTR(slot) ((slot)->val.ptr)
#define DLEN(slot) ((slot)->val.len)
static int default_comparator (arr_t* arr,
const void* dptr1, size_t dlen1,
const void* dptr2, size_t dlen2)
{
/*
if (dlen1 == dlen2) return QSE_MEMCMP (dptr1, dptr2, TOB(arr,dlen1));
return 1;
*/
size_t min = (dlen1 < dlen2)? dlen1: dlen2;
int n = QSE_MEMCMP (dptr1, dptr2, TOB(arr,min));
if (n == 0 && dlen1 != dlen2)
{
n = (dlen1 > dlen2)? 1: -1;
}
return n;
}
static QSE_INLINE slot_t* alloc_slot (arr_t* arr, void* dptr, size_t dlen)
{
slot_t* n;
if (arr->copier == QSE_ARR_COPIER_SIMPLE)
{
n = QSE_MMGR_ALLOC (arr->mmgr, QSE_SIZEOF(slot_t));
if (n == QSE_NULL) return QSE_NULL;
DPTR(n) = dptr;
}
else if (arr->copier == QSE_ARR_COPIER_INLINE)
{
n = QSE_MMGR_ALLOC (arr->mmgr,
QSE_SIZEOF(slot_t) + TOB(arr,dlen));
if (n == QSE_NULL) return QSE_NULL;
QSE_MEMCPY (n + 1, dptr, TOB(arr,dlen));
DPTR(n) = n + 1;
}
else
{
n = QSE_MMGR_ALLOC (arr->mmgr, QSE_SIZEOF(slot_t));
if (n == QSE_NULL) return QSE_NULL;
DPTR(n) = arr->copier (arr, dptr, dlen);
if (DPTR(n) == QSE_NULL)
{
QSE_MMGR_FREE (arr->mmgr, n);
return QSE_NULL;
}
}
DLEN(n) = dlen;
return n;
}
arr_t* qse_arr_open (mmgr_t* mmgr, size_t xtnsize, size_t capa)
{
arr_t* arr;
arr = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(arr_t) + xtnsize);
if (arr == QSE_NULL) return QSE_NULL;
if (qse_arr_init (arr, mmgr, capa) <= -1)
{
QSE_MMGR_FREE (mmgr, arr);
return QSE_NULL;
}
QSE_MEMSET (QSE_XTN(arr), 0, xtnsize);
return arr;
}
void qse_arr_close (arr_t* arr)
{
qse_arr_fini (arr);
QSE_MMGR_FREE (arr->mmgr, arr);
}
int qse_arr_init (arr_t* arr, mmgr_t* mmgr, size_t capa)
{
QSE_MEMSET (arr, 0, QSE_SIZEOF(*arr));
arr->mmgr = mmgr;
arr->size = 0;
arr->capa = 0;
arr->slot = QSE_NULL;
arr->scale = 1;
arr->copier = QSE_ARR_COPIER_SIMPLE;
arr->comper = default_comparator;
return (qse_arr_setcapa (arr, capa) == QSE_NULL)? -1: 0;
}
void qse_arr_fini (arr_t* arr)
{
qse_arr_clear (arr);
if (arr->slot != QSE_NULL)
{
QSE_MMGR_FREE (arr->mmgr, arr->slot);
arr->slot = QSE_NULL;
arr->capa = 0;
}
}
qse_mmgr_t* qse_arr_getmmgr (qse_arr_t* arr)
{
return arr->mmgr;
}
void* qse_arr_getxtn (qse_arr_t* arr)
{
return QSE_XTN (arr);
}
int qse_arr_getscale (arr_t* arr)
{
return arr->scale;
}
void qse_arr_setscale (arr_t* arr, int scale)
{
QSE_ASSERTX (scale > 0 && scale <= QSE_TYPE_MAX(qse_byte_t),
"The scale should be larger than 0 and less than or equal to the maximum value that the qse_byte_t type can hold");
if (scale <= 0) scale = 1;
if (scale > QSE_TYPE_MAX(qse_byte_t)) scale = QSE_TYPE_MAX(qse_byte_t);
arr->scale = scale;
}
copier_t qse_arr_getcopier (arr_t* arr)
{
return arr->copier;
}
void qse_arr_setcopier (arr_t* arr, copier_t copier)
{
if (copier == QSE_NULL) copier = QSE_ARR_COPIER_SIMPLE;
arr->copier = copier;
}
freeer_t qse_arr_getfreeer (arr_t* arr)
{
return arr->freeer;
}
void qse_arr_setfreeer (arr_t* arr, freeer_t freeer)
{
arr->freeer = freeer;
}
comper_t qse_arr_getcomper (arr_t* arr)
{
return arr->comper;
}
void qse_arr_setcomper (arr_t* arr, comper_t comper)
{
if (comper == QSE_NULL) comper = default_comparator;
arr->comper = comper;
}
keeper_t qse_arr_getkeeper (arr_t* arr)
{
return arr->keeper;
}
void qse_arr_setkeeper (arr_t* arr, keeper_t keeper)
{
arr->keeper = keeper;
}
sizer_t qse_arr_getsizer (arr_t* arr)
{
return arr->sizer;
}
void qse_arr_setsizer (arr_t* arr, sizer_t sizer)
{
arr->sizer = sizer;
}
size_t qse_arr_getsize (arr_t* arr)
{
return arr->size;
}
size_t qse_arr_getcapa (arr_t* arr)
{
return arr->capa;
}
arr_t* qse_arr_setcapa (arr_t* arr, size_t capa)
{
void* tmp;
if (capa == arr->capa) return arr;
if (arr->size > capa)
{
/* to trigger freeers on the items truncated */
qse_arr_delete (arr, capa, arr->size - capa);
QSE_ASSERT (arr->size <= capa);
}
if (capa > 0)
{
if (arr->mmgr->realloc != QSE_NULL && arr->slot != QSE_NULL)
{
tmp = (slot_t**) QSE_MMGR_REALLOC (
arr->mmgr, arr->slot,
QSE_SIZEOF(*arr->slot)*capa);
if (tmp == QSE_NULL) return QSE_NULL;
}
else
{
tmp = (slot_t**) QSE_MMGR_ALLOC (
arr->mmgr, QSE_SIZEOF(*arr->slot)*capa);
if (tmp == QSE_NULL) return QSE_NULL;
if (arr->slot != QSE_NULL)
{
size_t x;
x = (capa > arr->capa)? arr->capa: capa;
QSE_MEMCPY (tmp, arr->slot,
QSE_SIZEOF(*arr->slot)*x);
QSE_MMGR_FREE (arr->mmgr, arr->slot);
}
}
}
else
{
if (arr->slot != QSE_NULL)
{
qse_arr_clear (arr);
QSE_MMGR_FREE (arr->mmgr, arr->slot);
}
tmp = QSE_NULL;
}
arr->slot = tmp;
arr->capa = capa;
return arr;
}
size_t qse_arr_search (arr_t* arr, size_t pos, const void* dptr, size_t dlen)
{
size_t i;
for (i = pos; i < arr->size; i++)
{
if (arr->slot[i] == QSE_NULL) continue;
if (arr->comper (arr,
DPTR(arr->slot[i]), DLEN(arr->slot[i]),
dptr, dlen) == 0) return i;
}
return QSE_ARR_NIL;
}
size_t qse_arr_rsearch (arr_t* arr, size_t pos, const void* dptr, size_t dlen)
{
size_t i;
if (arr->size > 0)
{
if (pos >= arr->size) pos = arr->size - 1;
for (i = pos + 1; i-- > 0; )
{
if (arr->slot[i] == QSE_NULL) continue;
if (arr->comper (arr,
DPTR(arr->slot[i]), DLEN(arr->slot[i]),
dptr, dlen) == 0) return i;
}
}
return QSE_ARR_NIL;
}
size_t qse_arr_upsert (arr_t* arr, size_t pos, void* dptr, size_t dlen)
{
if (pos < arr->size) return qse_arr_update (arr, pos, dptr, dlen);
return qse_arr_insert (arr, pos, dptr, dlen);
}
size_t qse_arr_insert (arr_t* arr, size_t pos, void* dptr, size_t dlen)
{
size_t i;
slot_t* slot;
/* allocate the slot first */
slot = alloc_slot (arr, dptr, dlen);
if (slot == QSE_NULL) return QSE_ARR_NIL;
/* do resizeing if necessary.
* resizing is performed after slot allocation because that way, it
* doesn't modify arr on any errors */
if (pos >= arr->capa || arr->size >= arr->capa)
{
size_t capa, mincapa;
/* get the minimum capacity needed */
mincapa = (pos >= arr->size)? (pos + 1): (arr->size + 1);
if (arr->sizer)
{
capa = arr->sizer (arr, mincapa);
}
else
{
if (arr->capa <= 0)
{
QSE_ASSERT (arr->size <= 0);
capa = (pos < 16)? 16: (pos + 1);
}
else
{
size_t bound = (pos >= arr->size)? pos: arr->size;
do { capa = arr->capa * 2; } while (capa <= bound);
}
}
do
{
if (qse_arr_setcapa(arr,capa) != QSE_NULL) break;
if (capa <= mincapa)
{
if (arr->freeer)
arr->freeer (arr, DPTR(slot), DLEN(slot));
QSE_MMGR_FREE (arr->mmgr, slot);
return QSE_ARR_NIL;
}
capa--; /* let it retry after lowering the capacity */
}
while (1);
}
if (pos >= arr->capa || arr->size >= arr->capa)
{
/* the buffer is not still enough after resizing */
if (arr->freeer)
arr->freeer (arr, DPTR(slot), DLEN(slot));
QSE_MMGR_FREE (arr->mmgr, slot);
return QSE_ARR_NIL;
}
/* fill in the gap with QSE_NULL */
for (i = arr->size; i < pos; i++) arr->slot[i] = QSE_NULL;
/* shift values to the next cell */
for (i = arr->size; i > pos; i--) arr->slot[i] = arr->slot[i-1];
/* set the value */
arr->slot[pos] = slot;
if (pos > arr->size) arr->size = pos + 1;
else arr->size++;
return pos;
}
size_t qse_arr_update (arr_t* arr, size_t pos, void* dptr, size_t dlen)
{
slot_t* c;
if (pos >= arr->size) return QSE_ARR_NIL;
c = arr->slot[pos];
if (c == QSE_NULL)
{
/* no previous data */
arr->slot[pos] = alloc_slot (arr, dptr, dlen);
if (arr->slot[pos] == QSE_NULL) return QSE_ARR_NIL;
}
else
{
if (dptr == DPTR(c) && dlen == DLEN(c))
{
/* updated to the same data */
if (arr->keeper) arr->keeper (arr, dptr, dlen);
}
else
{
/* updated to different data */
slot_t* slot = alloc_slot (arr, dptr, dlen);
if (slot == QSE_NULL) return QSE_ARR_NIL;
if (arr->freeer != QSE_NULL)
arr->freeer (arr, DPTR(c), DLEN(c));
QSE_MMGR_FREE (arr->mmgr, c);
arr->slot[pos] = slot;
}
}
return pos;
}
size_t qse_arr_delete (arr_t* arr, size_t index, size_t count)
{
size_t i;
if (index >= arr->size) return 0;
if (count > arr->size - index) count = arr->size - index;
i = index;
for (i = index; i < index + count; i++)
{
slot_t* c = arr->slot[i];
if (c != QSE_NULL)
{
if (arr->freeer != QSE_NULL)
arr->freeer (arr, DPTR(c), DLEN(c));
QSE_MMGR_FREE (arr->mmgr, c);
arr->slot[i] = QSE_NULL;
}
}
for (i = index + count; i < arr->size; i++)
{
arr->slot[i-count] = arr->slot[i];
}
arr->slot[arr->size-1] = QSE_NULL;
arr->size -= count;
return count;
}
size_t qse_arr_uplete (arr_t* arr, size_t index, size_t count)
{
size_t i;
if (index >= arr->size) return 0;
if (count > arr->size - index) count = arr->size - index;
i = index;
for (i = index; i < index + count; i++)
{
slot_t* c = arr->slot[i];
if (c != QSE_NULL)
{
if (arr->freeer != QSE_NULL)
arr->freeer (arr, DPTR(c), DLEN(c));
QSE_MMGR_FREE (arr->mmgr, c);
arr->slot[i] = QSE_NULL;
}
}
return count;
}
void qse_arr_clear (arr_t* arr)
{
size_t i;
for (i = 0; i < arr->size; i++)
{
slot_t* c = arr->slot[i];
if (c != QSE_NULL)
{
if (arr->freeer)
arr->freeer (arr, DPTR(c), DLEN(c));
QSE_MMGR_FREE (arr->mmgr, c);
arr->slot[i] = QSE_NULL;
}
}
arr->size = 0;
}
size_t qse_arr_walk (arr_t* arr, walker_t walker, void* ctx)
{
qse_arr_walk_t w = QSE_ARR_WALK_FORWARD;
size_t i = 0, nwalks = 0;
if (arr->size <= 0) return 0;
while (1)
{
if (arr->slot[i] != QSE_NULL)
{
w = walker (arr, i, ctx);
nwalks++;
}
if (w == QSE_ARR_WALK_STOP) break;
if (w == QSE_ARR_WALK_FORWARD)
{
i++;
if (i >= arr->size) break;
}
if (w == QSE_ARR_WALK_BACKWARD)
{
if (i <= 0) break;
i--;
}
}
return nwalks;
}
size_t qse_arr_rwalk (arr_t* arr, walker_t walker, void* ctx)
{
qse_arr_walk_t w = QSE_ARR_WALK_BACKWARD;
size_t i, nwalks = 0;
if (arr->size <= 0) return 0;
i = arr->size - 1;
while (1)
{
if (arr->slot[i] != QSE_NULL)
{
w = walker (arr, i, ctx);
nwalks++;
}
if (w == QSE_ARR_WALK_STOP) break;
if (w == QSE_ARR_WALK_FORWARD)
{
i++;
if (i >= arr->size) break;
}
if (w == QSE_ARR_WALK_BACKWARD)
{
if (i <= 0) break;
i--;
}
}
return nwalks;
}
size_t qse_arr_pushstack (arr_t* arr, void* dptr, size_t dlen)
{
return qse_arr_insert (arr, arr->size, dptr, dlen);
}
void qse_arr_popstack (arr_t* arr)
{
QSE_ASSERT (arr->size > 0);
qse_arr_delete (arr, arr->size - 1, 1);
}
#define HEAP_PARENT(x) (((x)-1) / 2)
#define HEAP_LEFT(x) ((x)*2 + 1)
#define HEAP_RIGHT(x) ((x)*2 + 2)
size_t qse_arr_pushheap (arr_t* arr, void* dptr, size_t dlen)
{
size_t cur, par;
int n;
/* add a value to the bottom */
cur = arr->size;
if (qse_arr_insert (arr, cur, dptr, dlen) == QSE_ARR_NIL)
return QSE_ARR_NIL;
while (cur != 0)
{
slot_t* tmp;
/* compare with the parent */
par = HEAP_PARENT(cur);
n = arr->comper (arr,
DPTR(arr->slot[cur]), DLEN(arr->slot[cur]),
DPTR(arr->slot[par]), DLEN(arr->slot[par]));
if (n <= 0) break; /* ok */
/* swap the current with the parent */
tmp = arr->slot[cur];
arr->slot[cur] = arr->slot[par];
arr->slot[par] = tmp;
cur = par;
}
return arr->size;
}
void qse_arr_popheap (arr_t* arr)
{
size_t cur, child;
slot_t* tmp;
QSE_ASSERT (arr->size > 0);
/* destroy the top */
tmp = arr->slot[0];
if (arr->freeer) arr->freeer (arr, DPTR(tmp), DLEN(tmp));
QSE_MMGR_FREE (arr->mmgr, tmp);
/* move the last item to the top position also shrink the size */
arr->slot[0] = arr->slot[--arr->size];
if (arr->size <= 1) return; /* only 1 element. nothing further to do */
for (cur = 0; cur < arr->size; cur = child)
{
size_t left, right;
int n;
left = HEAP_LEFT(cur);
right = HEAP_RIGHT(cur);
if (left >= arr->size)
{
/* the left child does not exist.
* reached the bottom. abort exchange */
break;
}
if (right >= arr->size)
{
/* the right child does not exist. only the left */
child = left;
}
else
{
/* get the larger child of the two */
n = arr->comper (arr,
DPTR(arr->slot[left]), DLEN(arr->slot[left]),
DPTR(arr->slot[right]), DLEN(arr->slot[right]));
child = (n > 0)? left: right;
}
/* compare the current one with the child */
n = arr->comper (arr,
DPTR(arr->slot[cur]), DLEN(arr->slot[cur]),
DPTR(arr->slot[child]), DLEN(arr->slot[child]));
if (n > 0) break; /* current one is larger. stop exchange */
/* swap the current with the child */
tmp = arr->slot[cur];
arr->slot[cur] = arr->slot[child];
arr->slot[child] = tmp;
}
}

View File

@ -1,700 +0,0 @@
/*
* $Id$
*
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <qse/cmn/lda.h>
#include "mem-prv.h"
#define lda_t qse_lda_t
#define slot_t qse_lda_slot_t
#define copier_t qse_lda_copier_t
#define freeer_t qse_lda_freeer_t
#define comper_t qse_lda_comper_t
#define sizer_t qse_lda_sizer_t
#define keeper_t qse_lda_keeper_t
#define walker_t qse_lda_walker_t
#define mmgr_t qse_mmgr_t
#define size_t qse_size_t
#define TOB(lda,len) ((len)*(lda)->scale)
#define DPTR(slot) ((slot)->val.ptr)
#define DLEN(slot) ((slot)->val.len)
static int default_comparator (lda_t* lda,
const void* dptr1, size_t dlen1,
const void* dptr2, size_t dlen2)
{
/*
if (dlen1 == dlen2) return QSE_MEMCMP (dptr1, dptr2, TOB(lda,dlen1));
return 1;
*/
size_t min = (dlen1 < dlen2)? dlen1: dlen2;
int n = QSE_MEMCMP (dptr1, dptr2, TOB(lda,min));
if (n == 0 && dlen1 != dlen2)
{
n = (dlen1 > dlen2)? 1: -1;
}
return n;
}
static QSE_INLINE slot_t* alloc_slot (lda_t* lda, void* dptr, size_t dlen)
{
slot_t* n;
if (lda->copier == QSE_LDA_COPIER_SIMPLE)
{
n = QSE_MMGR_ALLOC (lda->mmgr, QSE_SIZEOF(slot_t));
if (n == QSE_NULL) return QSE_NULL;
DPTR(n) = dptr;
}
else if (lda->copier == QSE_LDA_COPIER_INLINE)
{
n = QSE_MMGR_ALLOC (lda->mmgr,
QSE_SIZEOF(slot_t) + TOB(lda,dlen));
if (n == QSE_NULL) return QSE_NULL;
QSE_MEMCPY (n + 1, dptr, TOB(lda,dlen));
DPTR(n) = n + 1;
}
else
{
n = QSE_MMGR_ALLOC (lda->mmgr, QSE_SIZEOF(slot_t));
if (n == QSE_NULL) return QSE_NULL;
DPTR(n) = lda->copier (lda, dptr, dlen);
if (DPTR(n) == QSE_NULL)
{
QSE_MMGR_FREE (lda->mmgr, n);
return QSE_NULL;
}
}
DLEN(n) = dlen;
return n;
}
lda_t* qse_lda_open (mmgr_t* mmgr, size_t xtnsize, size_t capa)
{
lda_t* lda;
lda = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(lda_t) + xtnsize);
if (lda == QSE_NULL) return QSE_NULL;
if (qse_lda_init (lda, mmgr, capa) <= -1)
{
QSE_MMGR_FREE (mmgr, lda);
return QSE_NULL;
}
QSE_MEMSET (QSE_XTN(lda), 0, xtnsize);
return lda;
}
void qse_lda_close (lda_t* lda)
{
qse_lda_fini (lda);
QSE_MMGR_FREE (lda->mmgr, lda);
}
int qse_lda_init (lda_t* lda, mmgr_t* mmgr, size_t capa)
{
QSE_MEMSET (lda, 0, QSE_SIZEOF(*lda));
lda->mmgr = mmgr;
lda->size = 0;
lda->capa = 0;
lda->slot = QSE_NULL;
lda->scale = 1;
lda->copier = QSE_LDA_COPIER_SIMPLE;
lda->comper = default_comparator;
return (qse_lda_setcapa (lda, capa) == QSE_NULL)? -1: 0;
}
void qse_lda_fini (lda_t* lda)
{
qse_lda_clear (lda);
if (lda->slot != QSE_NULL)
{
QSE_MMGR_FREE (lda->mmgr, lda->slot);
lda->slot = QSE_NULL;
lda->capa = 0;
}
}
qse_mmgr_t* qse_lda_getmmgr (qse_lda_t* lda)
{
return lda->mmgr;
}
void* qse_lda_getxtn (qse_lda_t* lda)
{
return QSE_XTN (lda);
}
int qse_lda_getscale (lda_t* lda)
{
return lda->scale;
}
void qse_lda_setscale (lda_t* lda, int scale)
{
QSE_ASSERTX (scale > 0 && scale <= QSE_TYPE_MAX(qse_byte_t),
"The scale should be larger than 0 and less than or equal to the maximum value that the qse_byte_t type can hold");
if (scale <= 0) scale = 1;
if (scale > QSE_TYPE_MAX(qse_byte_t)) scale = QSE_TYPE_MAX(qse_byte_t);
lda->scale = scale;
}
copier_t qse_lda_getcopier (lda_t* lda)
{
return lda->copier;
}
void qse_lda_setcopier (lda_t* lda, copier_t copier)
{
if (copier == QSE_NULL) copier = QSE_LDA_COPIER_SIMPLE;
lda->copier = copier;
}
freeer_t qse_lda_getfreeer (lda_t* lda)
{
return lda->freeer;
}
void qse_lda_setfreeer (lda_t* lda, freeer_t freeer)
{
lda->freeer = freeer;
}
comper_t qse_lda_getcomper (lda_t* lda)
{
return lda->comper;
}
void qse_lda_setcomper (lda_t* lda, comper_t comper)
{
if (comper == QSE_NULL) comper = default_comparator;
lda->comper = comper;
}
keeper_t qse_lda_getkeeper (lda_t* lda)
{
return lda->keeper;
}
void qse_lda_setkeeper (lda_t* lda, keeper_t keeper)
{
lda->keeper = keeper;
}
sizer_t qse_lda_getsizer (lda_t* lda)
{
return lda->sizer;
}
void qse_lda_setsizer (lda_t* lda, sizer_t sizer)
{
lda->sizer = sizer;
}
size_t qse_lda_getsize (lda_t* lda)
{
return lda->size;
}
size_t qse_lda_getcapa (lda_t* lda)
{
return lda->capa;
}
lda_t* qse_lda_setcapa (lda_t* lda, size_t capa)
{
void* tmp;
if (capa == lda->capa) return lda;
if (lda->size > capa)
{
/* to trigger freeers on the items truncated */
qse_lda_delete (lda, capa, lda->size - capa);
QSE_ASSERT (lda->size <= capa);
}
if (capa > 0)
{
if (lda->mmgr->realloc != QSE_NULL && lda->slot != QSE_NULL)
{
tmp = (slot_t**) QSE_MMGR_REALLOC (
lda->mmgr, lda->slot,
QSE_SIZEOF(*lda->slot)*capa);
if (tmp == QSE_NULL) return QSE_NULL;
}
else
{
tmp = (slot_t**) QSE_MMGR_ALLOC (
lda->mmgr, QSE_SIZEOF(*lda->slot)*capa);
if (tmp == QSE_NULL) return QSE_NULL;
if (lda->slot != QSE_NULL)
{
size_t x;
x = (capa > lda->capa)? lda->capa: capa;
QSE_MEMCPY (tmp, lda->slot,
QSE_SIZEOF(*lda->slot)*x);
QSE_MMGR_FREE (lda->mmgr, lda->slot);
}
}
}
else
{
if (lda->slot != QSE_NULL)
{
qse_lda_clear (lda);
QSE_MMGR_FREE (lda->mmgr, lda->slot);
}
tmp = QSE_NULL;
}
lda->slot = tmp;
lda->capa = capa;
return lda;
}
size_t qse_lda_search (lda_t* lda, size_t pos, const void* dptr, size_t dlen)
{
size_t i;
for (i = pos; i < lda->size; i++)
{
if (lda->slot[i] == QSE_NULL) continue;
if (lda->comper (lda,
DPTR(lda->slot[i]), DLEN(lda->slot[i]),
dptr, dlen) == 0) return i;
}
return QSE_LDA_NIL;
}
size_t qse_lda_rsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen)
{
size_t i;
if (lda->size > 0)
{
if (pos >= lda->size) pos = lda->size - 1;
for (i = pos + 1; i-- > 0; )
{
if (lda->slot[i] == QSE_NULL) continue;
if (lda->comper (lda,
DPTR(lda->slot[i]), DLEN(lda->slot[i]),
dptr, dlen) == 0) return i;
}
}
return QSE_LDA_NIL;
}
size_t qse_lda_upsert (lda_t* lda, size_t pos, void* dptr, size_t dlen)
{
if (pos < lda->size) return qse_lda_update (lda, pos, dptr, dlen);
return qse_lda_insert (lda, pos, dptr, dlen);
}
size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen)
{
size_t i;
slot_t* slot;
/* allocate the slot first */
slot = alloc_slot (lda, dptr, dlen);
if (slot == QSE_NULL) return QSE_LDA_NIL;
/* do resizeing if necessary.
* resizing is performed after slot allocation because that way, it
* doesn't modify lda on any errors */
if (pos >= lda->capa || lda->size >= lda->capa)
{
size_t capa, mincapa;
/* get the minimum capacity needed */
mincapa = (pos >= lda->size)? (pos + 1): (lda->size + 1);
if (lda->sizer)
{
capa = lda->sizer (lda, mincapa);
}
else
{
if (lda->capa <= 0)
{
QSE_ASSERT (lda->size <= 0);
capa = (pos < 16)? 16: (pos + 1);
}
else
{
size_t bound = (pos >= lda->size)? pos: lda->size;
do { capa = lda->capa * 2; } while (capa <= bound);
}
}
do
{
if (qse_lda_setcapa(lda,capa) != QSE_NULL) break;
if (capa <= mincapa)
{
if (lda->freeer)
lda->freeer (lda, DPTR(slot), DLEN(slot));
QSE_MMGR_FREE (lda->mmgr, slot);
return QSE_LDA_NIL;
}
capa--; /* let it retry after lowering the capacity */
}
while (1);
}
if (pos >= lda->capa || lda->size >= lda->capa)
{
/* the buffer is not still enough after resizing */
if (lda->freeer)
lda->freeer (lda, DPTR(slot), DLEN(slot));
QSE_MMGR_FREE (lda->mmgr, slot);
return QSE_LDA_NIL;
}
/* fill in the gap with QSE_NULL */
for (i = lda->size; i < pos; i++) lda->slot[i] = QSE_NULL;
/* shift values to the next cell */
for (i = lda->size; i > pos; i--) lda->slot[i] = lda->slot[i-1];
/* set the value */
lda->slot[pos] = slot;
if (pos > lda->size) lda->size = pos + 1;
else lda->size++;
return pos;
}
size_t qse_lda_update (lda_t* lda, size_t pos, void* dptr, size_t dlen)
{
slot_t* c;
if (pos >= lda->size) return QSE_LDA_NIL;
c = lda->slot[pos];
if (c == QSE_NULL)
{
/* no previous data */
lda->slot[pos] = alloc_slot (lda, dptr, dlen);
if (lda->slot[pos] == QSE_NULL) return QSE_LDA_NIL;
}
else
{
if (dptr == DPTR(c) && dlen == DLEN(c))
{
/* updated to the same data */
if (lda->keeper) lda->keeper (lda, dptr, dlen);
}
else
{
/* updated to different data */
slot_t* slot = alloc_slot (lda, dptr, dlen);
if (slot == QSE_NULL) return QSE_LDA_NIL;
if (lda->freeer != QSE_NULL)
lda->freeer (lda, DPTR(c), DLEN(c));
QSE_MMGR_FREE (lda->mmgr, c);
lda->slot[pos] = slot;
}
}
return pos;
}
size_t qse_lda_delete (lda_t* lda, size_t index, size_t count)
{
size_t i;
if (index >= lda->size) return 0;
if (count > lda->size - index) count = lda->size - index;
i = index;
for (i = index; i < index + count; i++)
{
slot_t* c = lda->slot[i];
if (c != QSE_NULL)
{
if (lda->freeer != QSE_NULL)
lda->freeer (lda, DPTR(c), DLEN(c));
QSE_MMGR_FREE (lda->mmgr, c);
lda->slot[i] = QSE_NULL;
}
}
for (i = index + count; i < lda->size; i++)
{
lda->slot[i-count] = lda->slot[i];
}
lda->slot[lda->size-1] = QSE_NULL;
lda->size -= count;
return count;
}
size_t qse_lda_uplete (lda_t* lda, size_t index, size_t count)
{
size_t i;
if (index >= lda->size) return 0;
if (count > lda->size - index) count = lda->size - index;
i = index;
for (i = index; i < index + count; i++)
{
slot_t* c = lda->slot[i];
if (c != QSE_NULL)
{
if (lda->freeer != QSE_NULL)
lda->freeer (lda, DPTR(c), DLEN(c));
QSE_MMGR_FREE (lda->mmgr, c);
lda->slot[i] = QSE_NULL;
}
}
return count;
}
void qse_lda_clear (lda_t* lda)
{
size_t i;
for (i = 0; i < lda->size; i++)
{
slot_t* c = lda->slot[i];
if (c != QSE_NULL)
{
if (lda->freeer)
lda->freeer (lda, DPTR(c), DLEN(c));
QSE_MMGR_FREE (lda->mmgr, c);
lda->slot[i] = QSE_NULL;
}
}
lda->size = 0;
}
size_t qse_lda_walk (lda_t* lda, walker_t walker, void* ctx)
{
qse_lda_walk_t w = QSE_LDA_WALK_FORWARD;
size_t i = 0, nwalks = 0;
if (lda->size <= 0) return 0;
while (1)
{
if (lda->slot[i] != QSE_NULL)
{
w = walker (lda, i, ctx);
nwalks++;
}
if (w == QSE_LDA_WALK_STOP) break;
if (w == QSE_LDA_WALK_FORWARD)
{
i++;
if (i >= lda->size) break;
}
if (w == QSE_LDA_WALK_BACKWARD)
{
if (i <= 0) break;
i--;
}
}
return nwalks;
}
size_t qse_lda_rwalk (lda_t* lda, walker_t walker, void* ctx)
{
qse_lda_walk_t w = QSE_LDA_WALK_BACKWARD;
size_t i, nwalks = 0;
if (lda->size <= 0) return 0;
i = lda->size - 1;
while (1)
{
if (lda->slot[i] != QSE_NULL)
{
w = walker (lda, i, ctx);
nwalks++;
}
if (w == QSE_LDA_WALK_STOP) break;
if (w == QSE_LDA_WALK_FORWARD)
{
i++;
if (i >= lda->size) break;
}
if (w == QSE_LDA_WALK_BACKWARD)
{
if (i <= 0) break;
i--;
}
}
return nwalks;
}
size_t qse_lda_pushstack (lda_t* lda, void* dptr, size_t dlen)
{
return qse_lda_insert (lda, lda->size, dptr, dlen);
}
void qse_lda_popstack (lda_t* lda)
{
QSE_ASSERT (lda->size > 0);
qse_lda_delete (lda, lda->size - 1, 1);
}
#define HEAP_PARENT(x) (((x)-1) / 2)
#define HEAP_LEFT(x) ((x)*2 + 1)
#define HEAP_RIGHT(x) ((x)*2 + 2)
size_t qse_lda_pushheap (lda_t* lda, void* dptr, size_t dlen)
{
size_t cur, par;
int n;
/* add a value to the bottom */
cur = lda->size;
if (qse_lda_insert (lda, cur, dptr, dlen) == QSE_LDA_NIL)
return QSE_LDA_NIL;
while (cur != 0)
{
slot_t* tmp;
/* compare with the parent */
par = HEAP_PARENT(cur);
n = lda->comper (lda,
DPTR(lda->slot[cur]), DLEN(lda->slot[cur]),
DPTR(lda->slot[par]), DLEN(lda->slot[par]));
if (n <= 0) break; /* ok */
/* swap the current with the parent */
tmp = lda->slot[cur];
lda->slot[cur] = lda->slot[par];
lda->slot[par] = tmp;
cur = par;
}
return lda->size;
}
void qse_lda_popheap (lda_t* lda)
{
size_t cur, child;
slot_t* tmp;
QSE_ASSERT (lda->size > 0);
/* destroy the top */
tmp = lda->slot[0];
if (lda->freeer) lda->freeer (lda, DPTR(tmp), DLEN(tmp));
QSE_MMGR_FREE (lda->mmgr, tmp);
/* move the last item to the top position also shrink the size */
lda->slot[0] = lda->slot[--lda->size];
if (lda->size <= 1) return; /* only 1 element. nothing further to do */
for (cur = 0; cur < lda->size; cur = child)
{
size_t left, right;
int n;
left = HEAP_LEFT(cur);
right = HEAP_RIGHT(cur);
if (left >= lda->size)
{
/* the left child does not exist.
* reached the bottom. abort exchange */
break;
}
if (right >= lda->size)
{
/* the right child does not exist. only the left */
child = left;
}
else
{
/* get the larger child of the two */
n = lda->comper (lda,
DPTR(lda->slot[left]), DLEN(lda->slot[left]),
DPTR(lda->slot[right]), DLEN(lda->slot[right]));
child = (n > 0)? left: right;
}
/* compare the current one with the child */
n = lda->comper (lda,
DPTR(lda->slot[cur]), DLEN(lda->slot[cur]),
DPTR(lda->slot[child]), DLEN(lda->slot[child]));
if (n > 0) break; /* current one is larger. stop exchange */
/* swap the current with the child */
tmp = lda->slot[cur];
lda->slot[cur] = lda->slot[child];
lda->slot[child] = tmp;
}
}

View File

@ -27,7 +27,7 @@
#include <qse/cmn/rex.h>
#include <qse/cmn/chr.h>
#include <qse/cmn/str.h>
#include <qse/cmn/lda.h>
#include <qse/cmn/arr.h>
#include "mem-prv.h"
#define OCC_MAX QSE_TYPE_MAX(qse_size_t)
@ -75,7 +75,7 @@ struct exec_t
{
int active;
int pending;
qse_lda_t set[2]; /* candidate arrays */
qse_arr_t set[2]; /* candidate arrays */
} cand;
qse_size_t nmatches;
@ -1379,9 +1379,9 @@ static int addsimplecand (
cand.group = group;
cand.mptr = mptr;
if (qse_lda_search (
if (qse_arr_search (
&e->cand.set[e->cand.pending],
0, &cand, 1) != QSE_LDA_NIL)
0, &cand, 1) != QSE_ARR_NIL)
{
/* exclude any existing entries in the array.
* see comp_cand() for the equality test used.
@ -1395,10 +1395,10 @@ static int addsimplecand (
return 0;
}
if (qse_lda_insert (
if (qse_arr_insert (
&e->cand.set[e->cand.pending],
QSE_LDA_SIZE(&e->cand.set[e->cand.pending]),
&cand, 1) == QSE_LDA_NIL)
QSE_ARR_SIZE(&e->cand.set[e->cand.pending]),
&cand, 1) == QSE_ARR_NIL)
{
e->rex->errnum = QSE_REX_ENOMEM;
return -1;
@ -1704,11 +1704,11 @@ static int charset_matched (exec_t* e, qse_rex_node_t* node, qse_char_t c)
return matched;
}
static qse_lda_walk_t walk_cands_for_match (
qse_lda_t* lda, qse_size_t index, void* ctx)
static qse_arr_walk_t walk_cands_for_match (
qse_arr_t* arr, qse_size_t index, void* ctx)
{
exec_t* e = (exec_t*)ctx;
cand_t* cand = QSE_LDA_DPTR(lda,index);
cand_t* cand = QSE_ARR_DPTR(arr,index);
qse_rex_node_t* node = cand->node;
const qse_char_t* nmptr = QSE_NULL;
@ -1807,7 +1807,7 @@ static qse_lda_walk_t walk_cands_for_match (
if (cand->occ < node->occ.max && cand->group != QSE_NULL)
{
gx = dupgroupstack (e, cand->group);
if (gx == QSE_NULL) return QSE_LDA_WALK_STOP;
if (gx == QSE_NULL) return QSE_ARR_WALK_STOP;
}
else gx = cand->group;
@ -1816,7 +1816,7 @@ static qse_lda_walk_t walk_cands_for_match (
n = addcands (e, gx, node, node->next, nmptr);
refdowngroupstack (gx, e->rex->mmgr);
if (n <= -1) return QSE_LDA_WALK_STOP;
if (n <= -1) return QSE_ARR_WALK_STOP;
}
if (cand->occ < node->occ.max)
@ -1828,11 +1828,11 @@ static qse_lda_walk_t walk_cands_for_match (
node, cand->occ + 1, nmptr);
refdowngroupstack (cand->group, e->rex->mmgr);
if (n <= -1) return QSE_LDA_WALK_STOP;
if (n <= -1) return QSE_ARR_WALK_STOP;
}
}
return QSE_LDA_WALK_FORWARD;
return QSE_ARR_WALK_FORWARD;
}
static int exec (exec_t* e)
@ -1846,7 +1846,7 @@ static int exec (exec_t* e)
e->cand.active = 1;
/* empty the pending set to collect the initial candidates */
qse_lda_clear (&e->cand.set[e->cand.pending]);
qse_arr_clear (&e->cand.set[e->cand.pending]);
/* the first node must be the START node */
QSE_ASSERT (e->rex->code->id == QSE_REX_NODE_START);
@ -1874,7 +1874,7 @@ static int exec (exec_t* e)
e->cand.pending = e->cand.active;
e->cand.active = tmp;
ncands_active = QSE_LDA_SIZE(&e->cand.set[e->cand.active]);
ncands_active = QSE_ARR_SIZE(&e->cand.set[e->cand.active]);
if (ncands_active <= 0)
{
/* we can't go on with no candidates in the
@ -1883,7 +1883,7 @@ static int exec (exec_t* e)
}
/* clear the pending set */
qse_lda_clear (&e->cand.set[e->cand.pending]);
qse_arr_clear (&e->cand.set[e->cand.pending]);
#ifdef XTRA_DEBUG
{
@ -1891,7 +1891,7 @@ static int exec (exec_t* e)
qse_printf (QSE_T("SET="));
for (i = 0; i < ncands_active; i++)
{
cand_t* cand = QSE_LDA_DPTR(&e->cand.set[e->cand.active],i);
cand_t* cand = QSE_ARR_DPTR(&e->cand.set[e->cand.active],i);
qse_rex_node_t* node = cand->node;
if (node->id == QSE_REX_NODE_CHAR)
@ -1907,7 +1907,7 @@ static int exec (exec_t* e)
}
#endif
if (qse_lda_walk (
if (qse_arr_walk (
&e->cand.set[e->cand.active],
walk_cands_for_match, e) != ncands_active)
{
@ -1932,13 +1932,13 @@ static int exec (exec_t* e)
return (e->nmatches > 0)? 1: 0;
}
static void refdowngroupstack_incand (qse_lda_t* lda, void* dptr, qse_size_t dlen)
static void refdowngroupstack_incand (qse_arr_t* arr, void* dptr, qse_size_t dlen)
{
QSE_ASSERT (dlen == 1);
refdowngroupstack (((cand_t*)dptr)->group, lda->mmgr);
refdowngroupstack (((cand_t*)dptr)->group, arr->mmgr);
}
static int comp_cand (qse_lda_t* lda,
static int comp_cand (qse_arr_t* arr,
const void* dptr1, qse_size_t dlen1,
const void* dptr2, qse_size_t dlen2)
{
@ -1953,37 +1953,37 @@ static int comp_cand (qse_lda_t* lda,
static int init_exec_dds (exec_t* e, qse_mmgr_t* mmgr)
{
/* initializes dynamic data structures */
if (qse_lda_init (&e->cand.set[0], mmgr, 100) <= -1)
if (qse_arr_init (&e->cand.set[0], mmgr, 100) <= -1)
{
e->rex->errnum = QSE_REX_ENOMEM;
return -1;
}
if (qse_lda_init (&e->cand.set[1], mmgr, 100) <= -1)
if (qse_arr_init (&e->cand.set[1], mmgr, 100) <= -1)
{
e->rex->errnum = QSE_REX_ENOMEM;
qse_lda_fini (&e->cand.set[0]);
qse_arr_fini (&e->cand.set[0]);
return -1;
}
qse_lda_setscale (&e->cand.set[0], QSE_SIZEOF(cand_t));
qse_lda_setscale (&e->cand.set[1], QSE_SIZEOF(cand_t));
qse_arr_setscale (&e->cand.set[0], QSE_SIZEOF(cand_t));
qse_arr_setscale (&e->cand.set[1], QSE_SIZEOF(cand_t));
qse_lda_setcopier (&e->cand.set[0], QSE_LDA_COPIER_INLINE);
qse_lda_setcopier (&e->cand.set[1], QSE_LDA_COPIER_INLINE);
qse_arr_setcopier (&e->cand.set[0], QSE_ARR_COPIER_INLINE);
qse_arr_setcopier (&e->cand.set[1], QSE_ARR_COPIER_INLINE);
qse_lda_setfreeer (&e->cand.set[0], refdowngroupstack_incand);
qse_lda_setfreeer (&e->cand.set[1], refdowngroupstack_incand);
qse_arr_setfreeer (&e->cand.set[0], refdowngroupstack_incand);
qse_arr_setfreeer (&e->cand.set[1], refdowngroupstack_incand);
qse_lda_setcomper (&e->cand.set[0], comp_cand);
qse_lda_setcomper (&e->cand.set[1], comp_cand);
qse_arr_setcomper (&e->cand.set[0], comp_cand);
qse_arr_setcomper (&e->cand.set[1], comp_cand);
return 0;
}
static void fini_exec_dds (exec_t* e)
{
qse_lda_fini (&e->cand.set[1]);
qse_lda_fini (&e->cand.set[0]);
qse_arr_fini (&e->cand.set[1]);
qse_arr_fini (&e->cand.set[0]);
}
int qse_rex_exec (

View File

@ -28,7 +28,7 @@
#include <qse/cmn/str.h>
#include <qse/cmn/mbwc.h>
#include <qse/cmn/path.h>
#include <qse/cmn/lda.h>
#include <qse/cmn/arr.h>
#include "../cmn/mem-prv.h"
#if defined(_WIN32)
@ -74,7 +74,7 @@ struct qse_dir_t
qse_wcs_t wbuf;
qse_mbs_t mbuf;
qse_lda_t* stab;
qse_arr_t* stab;
int status;
#if defined(_WIN32)
@ -148,7 +148,7 @@ qse_dir_errnum_t qse_dir_geterrnum (qse_dir_t* dir)
return dir->errnum;
}
static int compare_dirent (qse_lda_t* lda, const void* dptr1, qse_size_t dlen1, const void* dptr2, qse_size_t dlen2)
static int compare_dirent (qse_arr_t* arr, const void* dptr1, qse_size_t dlen1, const void* dptr2, qse_size_t dlen2)
{
int n = QSE_MEMCMP (dptr1, dptr2, ((dlen1 < dlen2)? dlen1: dlen2));
if (n == 0 && dlen1 != dlen2) n = (dlen1 > dlen2)? 1: -1;
@ -190,19 +190,19 @@ int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* path, int
if (dir->flags & QSE_DIR_SORT)
{
dir->stab = qse_lda_open (dir->mmgr, 0, 128);
dir->stab = qse_arr_open (dir->mmgr, 0, 128);
if (dir->stab == QSE_NULL) goto oops_3;
/*qse_lda_setscale (dir->stab, 1);*/
qse_lda_setcopier (dir->stab, QSE_LDA_COPIER_INLINE);
qse_lda_setcomper (dir->stab, compare_dirent);
/*qse_arr_setscale (dir->stab, 1);*/
qse_arr_setcopier (dir->stab, QSE_ARR_COPIER_INLINE);
qse_arr_setcomper (dir->stab, compare_dirent);
if (read_ahead_and_sort (dir, path) <= -1) goto oops_4;
}
return n;
oops_4:
qse_lda_close (dir->stab);
qse_arr_close (dir->stab);
oops_3:
close_dir_safely (dir);
oops_2:
@ -249,7 +249,7 @@ void qse_dir_fini (qse_dir_t* dir)
qse_mbs_fini (&dir->mbuf);
qse_wcs_fini (&dir->wbuf);
if (dir->stab) qse_lda_close (dir->stab);
if (dir->stab) qse_arr_close (dir->stab);
}
static qse_mchar_t* wcs_to_mbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_mbs_t* mbuf)
@ -607,7 +607,7 @@ int qse_dir_reset (qse_dir_t* dir, const qse_char_t* path)
if (dir->flags & QSE_DIR_SORT)
{
qse_lda_clear (dir->stab);
qse_arr_clear (dir->stab);
if (read_ahead_and_sort (dir, path) <= -1)
{
dir->status |= STATUS_SORT_ERR;
@ -852,7 +852,7 @@ static int read_ahead_and_sort (qse_dir_t* dir, const qse_char_t* path)
else
size = (qse_wcslen(name) + 1) * QSE_SIZEOF(qse_wchar_t);
if (qse_lda_pushheap (dir->stab, name, size) == (qse_size_t)-1)
if (qse_arr_pushheap (dir->stab, name, size) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
@ -873,12 +873,12 @@ int qse_dir_read (qse_dir_t* dir, qse_dir_ent_t* ent)
{
if (dir->status & STATUS_SORT_ERR) return -1;
if (dir->status & STATUS_POPHEAP) qse_lda_popheap (dir->stab);
if (dir->status & STATUS_POPHEAP) qse_arr_popheap (dir->stab);
else dir->status |= STATUS_POPHEAP;
if (QSE_LDA_SIZE(dir->stab) <= 0) return 0; /* no more entry */
if (QSE_ARR_SIZE(dir->stab) <= 0) return 0; /* no more entry */
ent->name = QSE_LDA_DPTR(dir->stab, 0);
ent->name = QSE_ARR_DPTR(dir->stab, 0);
return 1;
}
else