added qse_xli_definepair() and qse_xli_undefinepair().
renamed some xli functions. updated cmd/httpd to utilize qse_xli_definepair()
This commit is contained in:
@ -49,8 +49,10 @@ const qse_char_t* qse_xli_dflerrstr (
|
||||
QSE_T("invalid character '${0}'"),
|
||||
QSE_T("'${0}' not recognized"),
|
||||
QSE_T("@ not followed by a valid word"),
|
||||
QSE_T("illegal key '${0}'"),
|
||||
QSE_T("undefined key '${0}'"),
|
||||
QSE_T("no alias for '${0}'"),
|
||||
QSE_T("illegal value for '${0}'"),
|
||||
QSE_T("no value for '${0}'"),
|
||||
QSE_T("too many string segments for '${0}'")
|
||||
};
|
||||
|
||||
|
@ -600,7 +600,9 @@ static int read_pair (qse_xli_t* xli)
|
||||
qse_xli_pair_t* pair;
|
||||
qse_xli_list_t* parlist;
|
||||
qse_size_t dotted_curkey_len;
|
||||
|
||||
qse_xli_scm_t* scm = QSE_NULL;
|
||||
int key_nodup = 0, key_alias = 0;
|
||||
|
||||
key.ptr = QSE_NULL;
|
||||
name = QSE_NULL;
|
||||
@ -608,7 +610,44 @@ static int read_pair (qse_xli_t* xli)
|
||||
|
||||
parlist = xli->parlink->list;
|
||||
|
||||
if (xli->opt.trait & QSE_XLI_KEYNODUP)
|
||||
if (xli->opt.trait & QSE_XLI_KEYNODUP) key_nodup = 1;
|
||||
if (xli->opt.trait & QSE_XLI_KEYALIAS) key_alias = 1;
|
||||
|
||||
kloc = xli->tok.loc;
|
||||
key.len = QSE_STR_LEN(xli->tok.name);
|
||||
key.ptr = qse_strdup (QSE_STR_PTR(xli->tok.name), xli->mmgr);
|
||||
if (key.ptr == QSE_NULL)
|
||||
{
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
dotted_curkey_len = QSE_STR_LEN (xli->dotted_curkey);
|
||||
if ((dotted_curkey_len > 0 && qse_str_cat (xli->dotted_curkey, QSE_T(".")) == (qse_size_t)-1) ||
|
||||
qse_str_cat (xli->dotted_curkey, key.ptr) == (qse_size_t)-1)
|
||||
{
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (xli->opt.trait & QSE_XLI_VALIDATE)
|
||||
{
|
||||
qse_rbt_pair_t* pair;
|
||||
|
||||
pair = qse_rbt_search (xli->schema, QSE_STR_PTR(xli->dotted_curkey), QSE_STR_LEN(xli->dotted_curkey));
|
||||
if (pair == QSE_NULL)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EUDKEY, (const qse_cstr_t*)&key, &kloc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
scm = (qse_xli_scm_t*)QSE_RBT_VPTR(pair);
|
||||
|
||||
if (scm->flags & QSE_XLI_SCM_KEYNODUP) key_nodup = 2;
|
||||
if (scm->flags & QSE_XLI_SCM_KEYALIAS) key_alias = 2;
|
||||
}
|
||||
|
||||
if (key_nodup)
|
||||
{
|
||||
qse_xli_atom_t* atom;
|
||||
|
||||
@ -628,47 +667,11 @@ static int read_pair (qse_xli_t* xli)
|
||||
}
|
||||
}
|
||||
|
||||
kloc = xli->tok.loc;
|
||||
key.len = QSE_STR_LEN(xli->tok.name);
|
||||
key.ptr = qse_strdup (QSE_STR_PTR(xli->tok.name), xli->mmgr);
|
||||
if (key.ptr == QSE_NULL)
|
||||
{
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
dotted_curkey_len = QSE_STR_LEN (xli->dotted_curkey);
|
||||
if ((dotted_curkey_len > 0 && qse_str_cat (xli->dotted_curkey, QSE_T(".")) == (qse_size_t)-1) ||
|
||||
qse_str_cat (xli->dotted_curkey, key.ptr) == (qse_size_t)-1)
|
||||
{
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
|
||||
if (xli->opt.trait & QSE_XLI_VALIDATE)
|
||||
{
|
||||
qse_rbt_pair_t* pair;
|
||||
|
||||
pair = qse_rbt_search (xli->schema, QSE_STR_PTR(xli->dotted_curkey), QSE_STR_LEN(xli->dotted_curkey));
|
||||
if (pair == QSE_NULL)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EILKEY, (const qse_cstr_t*)&key, &kloc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
scm = (qse_xli_scm_t*)QSE_RBT_VPTR(pair);
|
||||
|
||||
if (scm->flags & QSE_XLI_SCM_KEY_NODUP)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
xli->tok_status |= TOK_STATUS_ENABLE_NSTR;
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
|
||||
if (xli->opt.trait & QSE_XLI_KEYALIAS)
|
||||
if (key_alias)
|
||||
{
|
||||
/* the name part must be unique for the same key(s) */
|
||||
if (MATCH (xli, TOK_IDENT) || MATCH (xli, TOK_DQSTR) || MATCH (xli, TOK_SQSTR) || MATCH(xli, TOK_NSTR))
|
||||
@ -698,6 +701,13 @@ static int read_pair (qse_xli_t* xli)
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
}
|
||||
else if (key_alias == 2)
|
||||
{
|
||||
/* SCM_KEYALIAS is specified for this particular item. Let the alias be required.
|
||||
* If KEYALIAS is globally specified with the specific one, it's optional. */
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOALI, &key);
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
if (MATCH (xli, TOK_EQ))
|
||||
@ -709,7 +719,7 @@ static int read_pair (qse_xli_t* xli)
|
||||
qse_xli_str_t* curstrseg;
|
||||
qse_size_t segcount = 0;
|
||||
|
||||
if (scm && !(scm->flags & QSE_XLI_SCM_VAL_STR))
|
||||
if (scm && !(scm->flags & QSE_XLI_SCM_VALSTR))
|
||||
{
|
||||
/* check the value type */
|
||||
qse_xli_seterror (xli, QSE_XLI_EILVAL, (const qse_cstr_t*)&key, &kloc);
|
||||
@ -775,7 +785,7 @@ static int read_pair (qse_xli_t* xli)
|
||||
}
|
||||
else if (MATCH (xli, TOK_LBRACE))
|
||||
{
|
||||
if (scm && !(scm->flags & QSE_XLI_SCM_VAL_LIST))
|
||||
if (scm && !(scm->flags & QSE_XLI_SCM_VALLIST))
|
||||
{
|
||||
/* check the value type */
|
||||
qse_xli_seterror (xli, QSE_XLI_EILVAL, (const qse_cstr_t*)&key, &kloc);
|
||||
@ -809,10 +819,11 @@ static int read_pair (qse_xli_t* xli)
|
||||
}
|
||||
else if (MATCH (xli, TOK_SEMICOLON))
|
||||
{
|
||||
if (scm && !(scm->flags & QSE_XLI_SCM_VAL_NIL))
|
||||
if (scm && !(scm->flags & QSE_XLI_SCM_VALNIL) &&
|
||||
!((scm->flags & QSE_XLI_SCM_VALSTR) && scm->str_minseg <= 0))
|
||||
{
|
||||
/* check the value type */
|
||||
qse_xli_seterror (xli, QSE_XLI_EILVAL, (const qse_cstr_t*)&key, &kloc);
|
||||
qse_xli_seterror (xli, QSE_XLI_ENOVAL, (const qse_cstr_t*)&key, &kloc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
|
@ -64,6 +64,7 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr)
|
||||
|
||||
xli->schema = qse_rbt_open (mmgr, 0, QSE_SIZEOF(qse_char_t), 1);
|
||||
if (xli->schema == QSE_NULL) goto oops;
|
||||
qse_rbt_setstyle (xli->schema, qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS));
|
||||
|
||||
xli->root.type = QSE_XLI_LIST;
|
||||
xli->xnil.type = QSE_XLI_NIL;
|
||||
@ -394,10 +395,6 @@ void qse_xli_clearroot (qse_xli_t* xli)
|
||||
free_list (xli, &xli->root);
|
||||
}
|
||||
|
||||
void qse_xli_clearschema (qse_xli_t* xli)
|
||||
{
|
||||
qse_rbt_clear (xli->schema);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------ */
|
||||
|
||||
@ -481,7 +478,7 @@ static qse_xli_pair_t* find_pair_by_key_and_index (
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* dotted_name)
|
||||
qse_xli_pair_t* qse_xli_findpair (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* pair_name)
|
||||
{
|
||||
const qse_char_t* ptr;
|
||||
const qse_xli_list_t* curlist;
|
||||
@ -490,7 +487,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li
|
||||
|
||||
curlist = list? list: &xli->root;
|
||||
|
||||
ptr = dotted_name;
|
||||
ptr = pair_name;
|
||||
while (1)
|
||||
{
|
||||
seg.ptr = ptr;
|
||||
@ -596,7 +593,7 @@ noent:
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* dotted_name)
|
||||
qse_size_t qse_xli_getnumpairs (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* pair_name)
|
||||
{
|
||||
const qse_char_t* ptr;
|
||||
const qse_xli_list_t* curlist;
|
||||
@ -605,7 +602,7 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
|
||||
|
||||
curlist = list? list: &xli->root;
|
||||
|
||||
ptr = dotted_name;
|
||||
ptr = pair_name;
|
||||
while (1)
|
||||
{
|
||||
seg.ptr = ptr;
|
||||
@ -768,20 +765,21 @@ qse_char_t* qse_xli_dupflatstr (qse_xli_t* xli, qse_xli_str_t* str, qse_size_t*
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------ */
|
||||
|
||||
int qse_xli_setschema (qse_xli_t* xli, const qse_char_t* dotted_name, const qse_xli_scm_t* scm)
|
||||
int qse_xli_definepair (qse_xli_t* xli, const qse_char_t* pair_name, const qse_xli_scm_t* scm)
|
||||
{
|
||||
int tmp;
|
||||
|
||||
tmp = scm->flags & (QSE_XLI_SCM_VAL_LIST | QSE_XLI_SCM_VAL_STR | QSE_XLI_SCM_VAL_NIL);
|
||||
if (tmp != QSE_XLI_SCM_VAL_LIST && tmp != QSE_XLI_SCM_VAL_STR && tmp != QSE_XLI_SCM_VAL_NIL)
|
||||
tmp = scm->flags & (QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_VALNIL);
|
||||
if (tmp != QSE_XLI_SCM_VALLIST && tmp != QSE_XLI_SCM_VALSTR && tmp != QSE_XLI_SCM_VALNIL)
|
||||
{
|
||||
/* VAL_LIST, VAL_STR, VAL_NIL can't co-exist */
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (qse_rbt_upsert (xli->schema, dotted_name, qse_strlen(dotted_name), scm, QSE_SIZEOF(scm)) == QSE_NULL)
|
||||
if (qse_rbt_upsert (xli->schema, pair_name, qse_strlen(pair_name), scm, QSE_SIZEOF(*scm)) == QSE_NULL)
|
||||
{
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
return -1;
|
||||
@ -789,3 +787,22 @@ int qse_xli_setschema (qse_xli_t* xli, const qse_char_t* dotted_name, const qse_
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_xli_undefinepair (qse_xli_t* xli, const qse_char_t* pair_name)
|
||||
{
|
||||
if (qse_rbt_delete (xli->schema, pair_name, qse_strlen(pair_name)) <= -1)
|
||||
{
|
||||
qse_cstr_t ea;
|
||||
ea.ptr = pair_name;
|
||||
ea.len = qse_strlen (ea.ptr);
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOENT, &ea);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qse_xli_undefinepairs (qse_xli_t* xli)
|
||||
{
|
||||
qse_rbt_clear (xli->schema);
|
||||
}
|
||||
|
Reference in New Issue
Block a user