added code to accept a number as a xli value.
renamed pair->name to pair->alias and related functions. enhanced xli reader to support string escaping
This commit is contained in:
@ -25,6 +25,12 @@ static int get_char (qse_xli_t* xli);
|
||||
static int get_token (qse_xli_t* xli);
|
||||
static int read_list (qse_xli_t* xli, qse_xli_list_t* list);
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
TOK_STATUS_ENABLE_NSTR = (1 << 0)
|
||||
};
|
||||
|
||||
static int close_current_stream (qse_xli_t* xli)
|
||||
{
|
||||
qse_ssize_t n;
|
||||
@ -51,6 +57,7 @@ enum tok_t
|
||||
TOK_COMMA,
|
||||
TOK_DQSTR,
|
||||
TOK_SQSTR,
|
||||
TOK_NSTR,
|
||||
TOK_IDENT,
|
||||
TOK_TEXT,
|
||||
|
||||
@ -458,12 +465,10 @@ retry:
|
||||
type = classify_ident (xli, QSE_STR_CSTR(tok->name));
|
||||
SET_TOKEN_TYPE (xli, tok, type);
|
||||
}
|
||||
else if (c == QSE_T('\'') || c == QSE_T('\"'))
|
||||
else if (c == QSE_T('\''))
|
||||
{
|
||||
/* single-quoted string - no escaping */
|
||||
qse_cint_t cc = c;
|
||||
|
||||
SET_TOKEN_TYPE (xli, tok, ((cc == QSE_T('\''))? TOK_SQSTR: TOK_DQSTR));
|
||||
SET_TOKEN_TYPE (xli, tok, TOK_SQSTR);
|
||||
|
||||
while (1)
|
||||
{
|
||||
@ -476,7 +481,7 @@ retry:
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (c == cc)
|
||||
if (c == QSE_T('\''))
|
||||
{
|
||||
/* terminating quote */
|
||||
GET_CHAR (xli);
|
||||
@ -486,6 +491,58 @@ retry:
|
||||
ADD_TOKEN_CHAR (xli, tok, c);
|
||||
}
|
||||
}
|
||||
else if (c == QSE_T('\"'))
|
||||
{
|
||||
/* double-quoted string - support escaping */
|
||||
int escaped = 0;
|
||||
|
||||
SET_TOKEN_TYPE (xli, tok, TOK_DQSTR);
|
||||
|
||||
while (1)
|
||||
{
|
||||
GET_CHAR_TO (xli, c);
|
||||
|
||||
if (c == QSE_CHAR_EOF)
|
||||
{
|
||||
/* the string is not closed */
|
||||
qse_xli_seterror (xli, QSE_XLI_ESTRNC, QSE_NULL, &xli->tok.loc);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!escaped)
|
||||
{
|
||||
if (c == QSE_T('\\'))
|
||||
{
|
||||
escaped = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c == QSE_T('\"'))
|
||||
{
|
||||
/* terminating quote */
|
||||
GET_CHAR (xli);
|
||||
break;
|
||||
}
|
||||
|
||||
ADD_TOKEN_CHAR (xli, tok, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
ADD_TOKEN_CHAR (xli, tok, c);
|
||||
escaped = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((xli->tok_status & TOK_STATUS_ENABLE_NSTR) && QSE_ISDIGIT(c))
|
||||
{
|
||||
SET_TOKEN_TYPE (xli, tok, TOK_NSTR);
|
||||
do
|
||||
{
|
||||
ADD_TOKEN_CHAR (xli, tok, c);
|
||||
GET_CHAR_TO (xli, c);
|
||||
}
|
||||
while (QSE_ISDIGIT(c));
|
||||
}
|
||||
else
|
||||
{
|
||||
n = get_symbols (xli, c, tok);
|
||||
@ -570,12 +627,14 @@ static int read_pair (qse_xli_t* xli)
|
||||
goto oops;
|
||||
}
|
||||
|
||||
xli->tok_status |= TOK_STATUS_ENABLE_NSTR;
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
|
||||
if (xli->opt.trait & QSE_XLI_KEYNAME)
|
||||
if (xli->opt.trait & QSE_XLI_KEYALIAS)
|
||||
{
|
||||
/* the name part must be unique for the same key(s) */
|
||||
if (MATCH (xli, TOK_IDENT) || MATCH (xli, TOK_DQSTR) || MATCH (xli, TOK_SQSTR))
|
||||
if (MATCH (xli, TOK_IDENT) || MATCH (xli, TOK_DQSTR) || MATCH (xli, TOK_SQSTR) || MATCH(xli, TOK_NSTR))
|
||||
{
|
||||
qse_xli_atom_t* atom;
|
||||
|
||||
@ -583,9 +642,9 @@ static int read_pair (qse_xli_t* xli)
|
||||
while (atom)
|
||||
{
|
||||
if (atom->type == QSE_XLI_PAIR &&
|
||||
((qse_xli_pair_t*)atom)->name &&
|
||||
((qse_xli_pair_t*)atom)->alias &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->key, key) == 0 &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->name, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->alias, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EEXIST, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
@ -608,7 +667,7 @@ static int read_pair (qse_xli_t* xli)
|
||||
{
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
|
||||
if (MATCH (xli, TOK_SQSTR) || MATCH (xli, TOK_DQSTR) || MATCH (xli, TOK_IDENT))
|
||||
if (MATCH (xli, TOK_SQSTR) || MATCH (xli, TOK_DQSTR) || MATCH(xli, TOK_NSTR) || MATCH (xli, TOK_IDENT))
|
||||
{
|
||||
qse_xli_str_t* curstrseg;
|
||||
|
||||
@ -626,7 +685,7 @@ static int read_pair (qse_xli_t* xli)
|
||||
{
|
||||
if (get_token (xli) <= -1) goto oops; /* skip the comma */
|
||||
|
||||
if (!MATCH (xli, TOK_SQSTR) && !MATCH (xli, TOK_DQSTR) && !MATCH (xli, TOK_IDENT))
|
||||
if (!MATCH (xli, TOK_SQSTR) && !MATCH (xli, TOK_DQSTR) && !MATCH (xli, TOK_NSTR) && !MATCH (xli, TOK_IDENT))
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_ESYNTAX, QSE_NULL, &xli->tok.loc);
|
||||
goto oops;
|
||||
@ -656,9 +715,12 @@ static int read_pair (qse_xli_t* xli)
|
||||
qse_xli_seterror (xli, QSE_XLI_EPAVAL, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
}
|
||||
else if (MATCH (xli, TOK_LBRACE))
|
||||
{
|
||||
xli->tok_status &= ~TOK_STATUS_ENABLE_NSTR;
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
|
||||
/* insert a pair with an empty list */
|
||||
@ -684,8 +746,10 @@ static int read_pair (qse_xli_t* xli)
|
||||
}
|
||||
else if (MATCH (xli, TOK_SEMICOLON))
|
||||
{
|
||||
xli->tok_status &= ~TOK_STATUS_ENABLE_NSTR;
|
||||
|
||||
/* no value has been specified for the pair */
|
||||
pair = qse_xli_insertpair (xli, parlist, QSE_NULL, key, name, &xli->xnil);
|
||||
pair = qse_xli_insertpair (xli, parlist, QSE_NULL, key, name, (qse_xli_val_t*)&xli->xnil);
|
||||
if (pair == QSE_NULL) goto oops;
|
||||
|
||||
/* skip the semicolon */
|
||||
@ -702,6 +766,7 @@ static int read_pair (qse_xli_t* xli)
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
xli->tok_status &= ~TOK_STATUS_ENABLE_NSTR;
|
||||
if (name) QSE_MMGR_FREE (xli->mmgr, name);
|
||||
if (key) QSE_MMGR_FREE (xli->mmgr, key);
|
||||
return -1;
|
||||
|
@ -145,13 +145,12 @@ static int write_to_current_stream (qse_xli_t* xli, const qse_char_t* ptr, qse_s
|
||||
{
|
||||
if (arg->b.len + 2 > QSE_COUNTOF(arg->b.buf) && flush (xli, arg) <= -1) return -1;
|
||||
arg->b.buf[arg->b.len++] = QSE_T('\\');
|
||||
arg->b.buf[arg->b.len++] = ptr[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (arg->b.len + 1 > QSE_COUNTOF(arg->b.buf) && flush (xli, arg) <= -1) return -1;
|
||||
arg->b.buf[arg->b.len++] = ptr[i];
|
||||
}
|
||||
arg->b.buf[arg->b.len++] = ptr[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -177,10 +176,10 @@ static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth)
|
||||
|
||||
if (write_to_current_stream (xli, pair->key, qse_strlen(pair->key), 0) <= -1) return -1;
|
||||
|
||||
if (pair->name)
|
||||
if (pair->alias)
|
||||
{
|
||||
if (write_to_current_stream (xli, QSE_T(" \""), 2, 0) <= -1 ||
|
||||
write_to_current_stream (xli, pair->name, qse_strlen(pair->name), 1) <= -1 ||
|
||||
write_to_current_stream (xli, pair->alias, qse_strlen(pair->alias), 1) <= -1 ||
|
||||
write_to_current_stream (xli, QSE_T("\""), 1, 0) <= -1) return -1;
|
||||
}
|
||||
|
||||
|
@ -52,18 +52,10 @@ void qse_xli_close (qse_xli_t* xli)
|
||||
|
||||
int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr)
|
||||
{
|
||||
qse_size_t i;
|
||||
|
||||
QSE_MEMSET (xli, 0, QSE_SIZEOF(*xli));
|
||||
xli->mmgr = mmgr;
|
||||
xli->errstr = qse_xli_dflerrstr;
|
||||
|
||||
for (i = 0; i < QSE_COUNTOF(xli->tmp); i++)
|
||||
{
|
||||
xli->tmp[i] = qse_str_open (mmgr, 0, 128);
|
||||
if (xli->tmp[i] == QSE_NULL) goto oops;
|
||||
}
|
||||
|
||||
xli->tok.name = qse_str_open (mmgr, 0, 128);
|
||||
if (xli->tok.name == QSE_NULL) goto oops;
|
||||
|
||||
@ -74,26 +66,14 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr)
|
||||
oops:
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
if (xli->tok.name) qse_str_close (xli->tok.name);
|
||||
|
||||
for (i = QSE_COUNTOF(xli->tmp); i > 0; )
|
||||
{
|
||||
if (xli->tmp[--i]) qse_str_close (xli->tmp[i]);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void qse_xli_fini (qse_xli_t* xli)
|
||||
{
|
||||
qse_size_t i;
|
||||
|
||||
qse_xli_clear (xli);
|
||||
qse_str_close (xli->tok.name);
|
||||
|
||||
for (i = QSE_COUNTOF(xli->tmp); i > 0; )
|
||||
{
|
||||
if (xli->tmp[--i]) qse_str_close (xli->tmp[i]);
|
||||
}
|
||||
|
||||
qse_xli_clearrionames (xli);
|
||||
qse_xli_clearwionames (xli);
|
||||
}
|
||||
@ -181,7 +161,6 @@ qse_xli_list_t* qse_xli_getroot (qse_xli_t* xli)
|
||||
return &xli->root;
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------ */
|
||||
|
||||
static void insert_atom (
|
||||
@ -218,19 +197,19 @@ static void insert_atom (
|
||||
|
||||
qse_xli_pair_t* qse_xli_insertpair (
|
||||
qse_xli_t* xli, qse_xli_list_t* parent, qse_xli_atom_t* peer,
|
||||
const qse_char_t* key, const qse_char_t* name, qse_xli_val_t* value)
|
||||
const qse_char_t* key, const qse_char_t* alias, qse_xli_val_t* value)
|
||||
{
|
||||
qse_xli_pair_t* pair;
|
||||
qse_size_t klen, nlen;
|
||||
qse_char_t* kptr, * nptr;
|
||||
|
||||
klen = qse_strlen (key);
|
||||
nlen = name? qse_strlen (name): 0;
|
||||
nlen = alias? qse_strlen (alias): 0;
|
||||
|
||||
pair = qse_xli_callocmem (xli,
|
||||
QSE_SIZEOF(*pair) +
|
||||
((klen + 1) * QSE_SIZEOF(*key)) +
|
||||
((nlen + 1) * QSE_SIZEOF(*name)));
|
||||
((nlen + 1) * QSE_SIZEOF(*alias)));
|
||||
if (pair == QSE_NULL) return QSE_NULL;
|
||||
|
||||
kptr = (qse_char_t*)(pair + 1);
|
||||
@ -238,11 +217,11 @@ qse_xli_pair_t* qse_xli_insertpair (
|
||||
|
||||
pair->type = QSE_XLI_PAIR;
|
||||
pair->key = kptr;
|
||||
if (name)
|
||||
if (alias)
|
||||
{
|
||||
nptr = kptr + klen + 1;
|
||||
qse_strcpy (nptr, name);
|
||||
pair->name = nptr;
|
||||
qse_strcpy (nptr, alias);
|
||||
pair->alias = nptr;
|
||||
}
|
||||
pair->val = value; /* this assumes it points to a dynamically allocated atom */
|
||||
|
||||
@ -252,7 +231,7 @@ qse_xli_pair_t* qse_xli_insertpair (
|
||||
|
||||
qse_xli_pair_t* qse_xli_insertpairwithemptylist (
|
||||
qse_xli_t* xli, qse_xli_list_t* parent, qse_xli_atom_t* peer,
|
||||
const qse_char_t* key, const qse_char_t* name)
|
||||
const qse_char_t* key, const qse_char_t* alias)
|
||||
{
|
||||
qse_xli_list_t* val;
|
||||
qse_xli_pair_t* tmp;
|
||||
@ -261,14 +240,14 @@ qse_xli_pair_t* qse_xli_insertpairwithemptylist (
|
||||
if (val == QSE_NULL) return QSE_NULL;
|
||||
|
||||
val->type = QSE_XLI_LIST;
|
||||
tmp = qse_xli_insertpair (xli, parent, peer, key, name, (qse_xli_val_t*)val);
|
||||
tmp = qse_xli_insertpair (xli, parent, peer, key, alias, (qse_xli_val_t*)val);
|
||||
if (tmp == QSE_NULL) qse_xli_freemem (xli, val);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
qse_xli_pair_t* qse_xli_insertpairwithstr (
|
||||
qse_xli_t* xli, qse_xli_list_t* parent, qse_xli_atom_t* peer,
|
||||
const qse_char_t* key, const qse_char_t* name, const qse_cstr_t* value)
|
||||
const qse_char_t* key, const qse_char_t* alias, const qse_cstr_t* value)
|
||||
{
|
||||
qse_xli_str_t* val;
|
||||
qse_xli_pair_t* tmp;
|
||||
@ -282,7 +261,7 @@ qse_xli_pair_t* qse_xli_insertpairwithstr (
|
||||
val->ptr = (const qse_char_t*)(val + 1);
|
||||
val->len = value->len;
|
||||
|
||||
tmp = qse_xli_insertpair (xli, parent, peer, key, name, (qse_xli_val_t*)val);
|
||||
tmp = qse_xli_insertpair (xli, parent, peer, key, alias, (qse_xli_val_t*)val);
|
||||
if (tmp == QSE_NULL) qse_xli_freemem (xli, val);
|
||||
return tmp;
|
||||
}
|
||||
@ -398,9 +377,9 @@ void qse_xli_clear (qse_xli_t* xli)
|
||||
free_list (xli, &xli->root);
|
||||
}
|
||||
|
||||
static qse_size_t count_pair_byname (
|
||||
static qse_size_t count_pair_byalias (
|
||||
qse_xli_t* xli, const qse_xli_list_t* list,
|
||||
const qse_cstr_t* key, const qse_cstr_t* name)
|
||||
const qse_cstr_t* key, const qse_cstr_t* alias)
|
||||
{
|
||||
qse_xli_atom_t* p;
|
||||
qse_size_t count = 0;
|
||||
@ -414,8 +393,8 @@ static qse_size_t count_pair_byname (
|
||||
qse_xli_pair_t* pair = (qse_xli_pair_t*)p;
|
||||
if (qse_strxcmp (key->ptr, key->len, pair->key) == 0)
|
||||
{
|
||||
if (name == QSE_NULL ||
|
||||
qse_strxcmp (name->ptr, name->len, pair->name) == 0) count++;
|
||||
if (alias == QSE_NULL ||
|
||||
qse_strxcmp (alias->ptr, alias->len, pair->alias) == 0) count++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -425,9 +404,9 @@ static qse_size_t count_pair_byname (
|
||||
return count;
|
||||
}
|
||||
|
||||
static qse_xli_pair_t* find_pair_byname (
|
||||
static qse_xli_pair_t* find_pair_byalias (
|
||||
qse_xli_t* xli, const qse_xli_list_t* list,
|
||||
const qse_cstr_t* key, const qse_cstr_t* name)
|
||||
const qse_cstr_t* key, const qse_cstr_t* alias)
|
||||
{
|
||||
qse_xli_atom_t* p;
|
||||
|
||||
@ -440,8 +419,8 @@ static qse_xli_pair_t* find_pair_byname (
|
||||
qse_xli_pair_t* pair = (qse_xli_pair_t*)p;
|
||||
if (qse_strxcmp (key->ptr, key->len, pair->key) == 0)
|
||||
{
|
||||
if (name == QSE_NULL ||
|
||||
qse_strxcmp (name->ptr, name->len, pair->name) == 0) return pair;
|
||||
if (alias == QSE_NULL ||
|
||||
qse_strxcmp (alias->ptr, alias->len, pair->alias) == 0) return pair;
|
||||
}
|
||||
}
|
||||
|
||||
@ -478,7 +457,7 @@ static qse_xli_pair_t* find_pair_byindex (
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* name)
|
||||
qse_xli_pair_t* qse_xli_findpairbyalias (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* alias)
|
||||
{
|
||||
const qse_char_t* ptr;
|
||||
const qse_xli_list_t* curlist;
|
||||
@ -487,7 +466,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li
|
||||
|
||||
curlist = list? list: &xli->root;
|
||||
|
||||
ptr = name;
|
||||
ptr = alias;
|
||||
while (1)
|
||||
{
|
||||
seg.ptr = ptr;
|
||||
@ -500,7 +479,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li
|
||||
/* check the type of curlist. this check is needed
|
||||
* because of the unconditional switching at the bottom of the
|
||||
* this loop. this implementation strategy has been chosen
|
||||
* to provide the segment name easily. */
|
||||
* to provide the segment alias easily. */
|
||||
goto noent;
|
||||
}
|
||||
|
||||
@ -540,7 +519,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li
|
||||
|
||||
if (*ptr != QSE_T(']')) goto inval;
|
||||
|
||||
pair = find_pair_byname (xli, curlist, &seg, &idx);
|
||||
pair = find_pair_byalias (xli, curlist, &seg, &idx);
|
||||
if (pair == QSE_NULL)
|
||||
{
|
||||
seg.len += idx.len + 2; /* adjustment for error message */
|
||||
@ -559,7 +538,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li
|
||||
if (*ptr != cc) goto inval;
|
||||
if (*++ptr != QSE_T(']')) goto inval;
|
||||
|
||||
pair = find_pair_byname (xli, curlist, &seg, &idx);
|
||||
pair = find_pair_byalias (xli, curlist, &seg, &idx);
|
||||
if (pair == QSE_NULL)
|
||||
{
|
||||
seg.len += idx.len + 4; /* adjustment for error message */
|
||||
@ -575,7 +554,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li
|
||||
}
|
||||
else
|
||||
{
|
||||
pair = find_pair_byname (xli, curlist, &seg, QSE_NULL);
|
||||
pair = find_pair_byalias (xli, curlist, &seg, QSE_NULL);
|
||||
if (pair == QSE_NULL) goto noent;
|
||||
|
||||
if (*ptr == QSE_T('\0')) break; /* no more segments */
|
||||
@ -587,7 +566,7 @@ qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* li
|
||||
|
||||
/* switch to the value regardless of its type.
|
||||
* check if it is a list in the beginning of the loop
|
||||
* just after having gotten the next segment name */
|
||||
* just after having gotten the next segment alias */
|
||||
curlist = (qse_xli_list_t*)pair->val;
|
||||
}
|
||||
|
||||
@ -602,7 +581,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* name)
|
||||
qse_size_t qse_xli_getnumpairsbyalias (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* alias)
|
||||
{
|
||||
const qse_char_t* ptr;
|
||||
const qse_xli_list_t* curlist;
|
||||
@ -611,7 +590,7 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
|
||||
|
||||
curlist = list? list: &xli->root;
|
||||
|
||||
ptr = name;
|
||||
ptr = alias;
|
||||
while (1)
|
||||
{
|
||||
seg.ptr = ptr;
|
||||
@ -624,7 +603,7 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
|
||||
/* check the type of curlist. this check is needed
|
||||
* because of the unconditional switching at the bottom of the
|
||||
* this loop. this implementation strategy has been chosen
|
||||
* to provide the segment name easily. */
|
||||
* to provide the segment alias easily. */
|
||||
goto noent;
|
||||
}
|
||||
|
||||
@ -664,7 +643,7 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
|
||||
|
||||
if (*ptr != QSE_T(']')) goto inval;
|
||||
|
||||
pair = find_pair_byname (xli, curlist, &seg, &idx);
|
||||
pair = find_pair_byalias (xli, curlist, &seg, &idx);
|
||||
if (pair == QSE_NULL)
|
||||
{
|
||||
seg.len += idx.len + 2; /* adjustment for error message */
|
||||
@ -683,7 +662,7 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
|
||||
if (*ptr != cc) goto inval;
|
||||
if (*++ptr != QSE_T(']')) goto inval;
|
||||
|
||||
pair = find_pair_byname (xli, curlist, &seg, &idx);
|
||||
pair = find_pair_byalias (xli, curlist, &seg, &idx);
|
||||
if (pair == QSE_NULL)
|
||||
{
|
||||
seg.len += idx.len + 4; /* adjustment for error message */
|
||||
@ -703,16 +682,16 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
|
||||
}
|
||||
else
|
||||
{
|
||||
pair = find_pair_byname (xli, curlist, &seg, QSE_NULL);
|
||||
pair = find_pair_byalias (xli, curlist, &seg, QSE_NULL);
|
||||
if (pair == QSE_NULL) goto noent;
|
||||
|
||||
if (*ptr == QSE_T('\0'))
|
||||
{
|
||||
return count_pair_byname (xli, curlist, &seg, QSE_NULL);
|
||||
return count_pair_byalias (xli, curlist, &seg, QSE_NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
pair = find_pair_byname (xli, curlist, &seg, QSE_NULL);
|
||||
pair = find_pair_byalias (xli, curlist, &seg, QSE_NULL);
|
||||
if (pair == QSE_NULL) goto noent;
|
||||
}
|
||||
}
|
||||
@ -723,7 +702,7 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
|
||||
|
||||
/* switch to the value regardless of its type.
|
||||
* check if it is a list in the beginning of the loop
|
||||
* just after having gotten the next segment name */
|
||||
* just after having gotten the next segment alias */
|
||||
curlist = (qse_xli_list_t*)pair->val;
|
||||
}
|
||||
|
||||
@ -776,7 +755,6 @@ qse_char_t* qse_xli_dupflatstr (qse_xli_t* xli, qse_xli_str_t* str, qse_size_t*
|
||||
}
|
||||
tmp[x] = QSE_T('\0');
|
||||
|
||||
|
||||
if (len) *len = x;
|
||||
if (nsegs) *nsegs = y;
|
||||
|
||||
|
@ -59,11 +59,11 @@ struct qse_xli_t
|
||||
qse_xli_ecb_t* ecb;
|
||||
|
||||
qse_xli_nil_t xnil;
|
||||
qse_xli_list_t root;
|
||||
qse_xli_list_t root;
|
||||
qse_xli_list_link_t* parlink;
|
||||
|
||||
qse_str_t* tmp[1];
|
||||
qse_xli_tok_t tok;
|
||||
int tok_status;
|
||||
struct
|
||||
{
|
||||
qse_xli_io_impl_t impl; /* input handler */
|
||||
|
Reference in New Issue
Block a user