touched up gdl.h

This commit is contained in:
2013-11-26 13:47:58 +00:00
parent 5ba15ae2e4
commit 8e6e7f29a6
9 changed files with 370 additions and 393 deletions

View File

@ -1097,15 +1097,15 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
/* note that i'm assigning to rederr in the 'if' conditions below.
* i'm not checking equality */
/* check if it is a builtin function */
if ((qse_awk_findfnc (awk, &name) != QSE_NULL && (rederr = QSE_AWK_EFNCRED)) ||
if ((qse_awk_findfnc (awk, (const qse_cstr_t*)&name) != QSE_NULL && (rederr = QSE_AWK_EFNCRED)) ||
/* check if it has already been defined as a function */
(qse_htb_search (awk->tree.funs, name.ptr, name.len) != QSE_NULL && (rederr = QSE_AWK_EFUNRED)) ||
/* 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, (const qse_cstr_t*)&name)) != QSE_LDA_NIL) && (rederr = QSE_AWK_EGBLRED)))
{
qse_awk_seterror (awk, rederr, &name, &awk->tok.loc);
qse_awk_seterror (awk, rederr, (const qse_cstr_t*)&name, &awk->tok.loc);
return QSE_NULL;
}
@ -1947,7 +1947,7 @@ static qse_awk_t* collect_locals (
/* check if it conflicts with a builtin function name
* function f() { local length; } */
if (qse_awk_findfnc (awk, &lcl) != QSE_NULL)
if (qse_awk_findfnc (awk, (const qse_cstr_t*)&lcl) != QSE_NULL)
{
SETERR_ARG_LOC (
awk, QSE_AWK_EFNCRED,
@ -2000,7 +2000,7 @@ static qse_awk_t* collect_locals (
}
/* check if it conflicts with global variable names */
n = find_global (awk, &lcl);
n = find_global (awk, (const qse_cstr_t*)&lcl);
if (n != QSE_LDA_NIL)
{
if (n < awk->tree.ngbls_base)
@ -4211,7 +4211,7 @@ static QSE_INLINE int isfunname (qse_awk_t* awk, const qse_xstr_t* name)
static QSE_INLINE int isfnname (qse_awk_t* awk, const qse_xstr_t* name)
{
if (qse_awk_findfnc (awk, name) != QSE_NULL)
if (qse_awk_findfnc (awk, (const qse_cstr_t*)name) != QSE_NULL)
{
/* implicit function */
return FNTYPE_FNC;
@ -4856,7 +4856,7 @@ static qse_awk_nde_t* parse_primary_ident_noseg (
qse_awk_nde_t* nde = QSE_NULL;
/* check if name is an intrinsic function name */
fnc = qse_awk_findfnc (awk, name);
fnc = qse_awk_findfnc (awk, (const qse_cstr_t*)name);
if (fnc)
{
if (MATCH(awk,TOK_LPAREN))
@ -5668,17 +5668,6 @@ static int get_string (
return 0;
}
static int get_charstr (qse_awk_t* awk, qse_awk_tok_t* tok, qse_char_t c)
{
if (awk->sio.last.c != QSE_T('\"'))
{
/* the starting quote has been consumed before this function
* has been called */
ADD_TOKEN_CHAR (awk, tok, awk->sio.last.c);
}
return get_string (awk, QSE_T('\"'), QSE_T('\\'), 0, 0, tok);
}
static int get_rexstr (qse_awk_t* awk, qse_awk_tok_t* tok)
{
if (awk->sio.last.c == QSE_T('/'))
@ -6067,7 +6056,6 @@ retry:
{
/* double-quoted string */
SET_TOKEN_TYPE (awk, tok, TOK_STR);
/*if (get_charstr(awk, tok, c) <= -1) return -1;*/
if (get_string (awk, c, QSE_T('\\'), 0, 0, tok) <= -1) return -1;
}
else if (c == QSE_T('\''))

View File

@ -1564,7 +1564,7 @@ int qse_awk_rtx_valtonum (
case QSE_AWK_VAL_REF:
{
return val_ref_to_num (rtx, (qse_awk_val_str_t*)v, l, r);
return val_ref_to_num (rtx, (qse_awk_val_ref_t*)v, l, r);
}
}

View File

@ -79,7 +79,7 @@ int qse_dll_init (qse_dll_t* dll, qse_mmgr_t* mmgr)
dll->comper = default_comper;
dll->copier = QSE_DLL_COPIER_SIMPLE;
QSE_DLL_INIT (dll);
QSE_GDL_INIT (&dll->gdl);
return 0;
}
@ -154,12 +154,14 @@ qse_size_t qse_dll_getsize (qse_dll_t* dll)
qse_dll_node_t* qse_dll_gethead (qse_dll_t* dll)
{
return QSE_DLL_HEAD(dll);
if (QSE_GDL_ISEMPTY(&dll->gdl)) return QSE_NULL;
return QSE_GDL_CONTAINER(QSE_GDL_HEAD(&dll->gdl), qse_dll_node_t, link);
}
qse_dll_node_t* qse_dll_gettail (qse_dll_t* dll)
{
return QSE_DLL_TAIL(dll);
if (QSE_GDL_ISEMPTY(&dll->gdl)) return QSE_NULL;
return QSE_GDL_CONTAINER(QSE_GDL_TAIL(&dll->gdl), qse_dll_node_t, link);
}
static qse_dll_node_t* alloc_node (qse_dll_t* dll, void* dptr, qse_size_t dlen)
@ -212,16 +214,19 @@ static QSE_INLINE void free_node (qse_dll_t* dll, qse_dll_node_t* node)
qse_dll_node_t* qse_dll_search (
qse_dll_t* dll, qse_dll_node_t* pos, const void* dptr, qse_size_t dlen)
{
if (pos == QSE_NULL) pos = QSE_DLL_HEAD(dll);
if (QSE_GDL_ISEMPTY(&dll->gdl)) return QSE_NULL;
while (QSE_DLL_ISMEMBER(dll,pos))
if (pos == QSE_NULL)
pos = QSE_GDL_CONTAINER (QSE_GDL_HEAD(&dll->gdl), qse_dll_node_t, link);
while (QSE_GDL_ISLINK (&dll->gdl, &pos->link))
{
if (dll->comper (dll, DPTR(pos), DLEN(pos), dptr, dlen) == 0)
{
return pos;
}
pos = pos->next;
pos = QSE_GDL_CONTAINER (QSE_GDL_NEXT(&pos->link), qse_dll_node_t, link);
}
return QSE_NULL;
@ -230,16 +235,18 @@ qse_dll_node_t* qse_dll_search (
qse_dll_node_t* qse_dll_rsearch (
qse_dll_t* dll, qse_dll_node_t* pos, const void* dptr, qse_size_t dlen)
{
if (pos == QSE_NULL) pos = QSE_DLL_TAIL(dll);
if (QSE_GDL_ISEMPTY(&dll->gdl)) return QSE_NULL;
if (pos == QSE_NULL)
pos = QSE_GDL_CONTAINER (QSE_GDL_TAIL(&dll->gdl), qse_dll_node_t, link);
while (QSE_DLL_ISMEMBER(dll,pos))
while (QSE_GDL_ISLINK (&dll->gdl, &pos->link))
{
if (dll->comper (dll, DPTR(pos), DLEN(pos), dptr, dlen) == 0)
{
return pos;
}
pos = pos->prev;
pos = QSE_GDL_CONTAINER (QSE_GDL_PREV(&pos->link), qse_dll_node_t, link);
}
return QSE_NULL;
@ -254,12 +261,14 @@ qse_dll_node_t* qse_dll_insert (
if (pos == QSE_NULL)
{
/* insert at the end */
QSE_DLL_ADDTAIL (dll, n);
QSE_GDL_APPEND (&dll->gdl, &n->link);
dll->size++;
}
else
{
/* insert in front of the positional node */
QSE_DLL_CHAIN (dll, pos->prev, n, pos);
QSE_GDL_CHAIN (&dll->gdl, QSE_GDL_PREV(&pos->link), &n->link, &pos->link);
dll->size++;
}
}
@ -268,58 +277,58 @@ qse_dll_node_t* qse_dll_insert (
void qse_dll_delete (qse_dll_t* dll, qse_dll_node_t* pos)
{
if (pos == QSE_NULL || !QSE_DLL_ISMEMBER(dll,pos)) return;
QSE_DLL_UNCHAIN (dll, pos);
if (pos == QSE_NULL || !QSE_GDL_ISLINK(&dll->gdl,&pos->link)) return;
QSE_GDL_UNCHAIN (&dll->gdl, &pos->link);
free_node (dll, pos);
dll->size--;
}
void qse_dll_clear (qse_dll_t* dll)
{
while (!QSE_DLL_ISEMPTY(dll))
while (!QSE_GDL_ISEMPTY(&dll->gdl))
{
qse_dll_delete (dll, QSE_DLL_HEAD(dll));
qse_dll_delete (dll, QSE_GDL_CONTAINER (QSE_GDL_HEAD(&dll->gdl), qse_dll_node_t, link));
}
}
void qse_dll_walk (qse_dll_t* dll, qse_dll_walker_t walker, void* ctx)
{
qse_dll_node_t* n = QSE_DLL_HEAD(dll);
qse_gdl_link_t* n = QSE_GDL_HEAD (&dll->gdl);
qse_dll_walk_t w = QSE_DLL_WALK_FORWARD;
while (QSE_DLL_ISMEMBER(dll,n))
while (QSE_GDL_ISLINK(&dll->gdl,n))
{
qse_dll_node_t* nxt = n->next;
qse_dll_node_t* prv = n->prev;
qse_gdl_link_t tmp = *n;
w = walker (dll, n, ctx);
w = walker (dll, QSE_GDL_CONTAINER (n, qse_dll_node_t, link), ctx);
if (w == QSE_DLL_WALK_FORWARD) n = nxt;
else if (w == QSE_DLL_WALK_BACKWARD) n = prv;
if (w == QSE_DLL_WALK_FORWARD) n = QSE_GDL_NEXT (&tmp);
else if (w == QSE_DLL_WALK_BACKWARD) n = QSE_GDL_PREV (&tmp);
else break;
}
}
void qse_dll_rwalk (qse_dll_t* dll, qse_dll_walker_t walker, void* ctx)
{
qse_dll_node_t* n = QSE_DLL_TAIL(dll);
qse_gdl_link_t* n = QSE_GDL_TAIL (&dll->gdl);
qse_dll_walk_t w = QSE_DLL_WALK_BACKWARD;
while (QSE_DLL_ISMEMBER(dll,n))
while (QSE_GDL_ISLINK(&dll->gdl,n))
{
qse_dll_node_t* nxt = n->next;
qse_dll_node_t* prv = n->prev;
qse_gdl_link_t tmp = *n;
w = walker (dll, n, ctx);
w = walker (dll, QSE_GDL_CONTAINER (n, qse_dll_node_t, link), ctx);
if (w == QSE_DLL_WALK_FORWARD) n = nxt;
else if (w == QSE_DLL_WALK_BACKWARD) n = prv;
if (w == QSE_DLL_WALK_FORWARD) n = QSE_GDL_NEXT (&tmp);
else if (w == QSE_DLL_WALK_BACKWARD) n = QSE_GDL_PREV (&tmp);
else break;
}
}
qse_dll_node_t* qse_dll_pushhead (qse_dll_t* dll, void* data, qse_size_t size)
{
return qse_dll_insert (dll, QSE_DLL_HEAD(dll), data, size);
return qse_dll_insert (dll, QSE_GDL_CONTAINER (QSE_GDL_HEAD (&dll->gdl), qse_dll_node_t, link), data, size);
}
qse_dll_node_t* qse_dll_pushtail (qse_dll_t* dll, void* data, qse_size_t size)
@ -329,14 +338,14 @@ qse_dll_node_t* qse_dll_pushtail (qse_dll_t* dll, void* data, qse_size_t size)
void qse_dll_pophead (qse_dll_t* dll)
{
QSE_ASSERT (!QSE_DLL_ISEMPTY(dll));
QSE_DLL_DELHEAD (dll);
QSE_ASSERT (!QSE_GDL_ISEMPTY(&dll->gdl));
qse_dll_delete (dll, QSE_GDL_CONTAINER (QSE_GDL_HEAD (&dll->gdl), qse_dll_node_t, link));
}
void qse_dll_poptail (qse_dll_t* dll)
{
QSE_ASSERT (!QSE_DLL_ISEMPTY(dll));
QSE_DLL_DELTAIL (dll);
QSE_ASSERT (!QSE_GDL_ISEMPTY(&dll->gdl));
qse_dll_delete (dll, QSE_GDL_CONTAINER (QSE_GDL_TAIL (&dll->gdl), qse_dll_node_t, link));
}

View File

@ -20,14 +20,25 @@
#include <qse/cmn/gdl.h>
void qse_gdl_chain (qse_gdl_t* p, qse_gdl_t* x, qse_gdl_t* n)
void qse_gdl_chain (qse_gdl_t* gdl, qse_gdl_link_t* prev, qse_gdl_link_t* x, qse_gdl_link_t* next)
{
x->prev = p; x->next = n; n->prev = x; p->next = x;
x->prev = prev;
x->next = next;
next->prev = x;
prev->next = x;
}
void qse_gdl_unchain (qse_gdl_t* x)
void qse_gdl_unchain (qse_gdl_t* gdl, qse_gdl_link_t* x)
{
qse_gdl_t* p = x->prev;
qse_gdl_t* n = x->next;
qse_gdl_link_t* p = x->prev;
qse_gdl_link_t* n = x->next;
n->prev = p; p->next = n;
}
void qse_gdl_replace (qse_gdl_t* gdl, qse_gdl_link_t* old_link, qse_gdl_link_t* new_link)
{
new_link->next = old_link->next;
new_link->next->prev = new_link;
new_link->prev = old_link->prev;
new_link->prev->next = new_link;
}