touched up gdl.h
This commit is contained in:
@ -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('\''))
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user