added the QSE_XLI_CASE_INSENSITIVE trait enumerator and revised macro defintions of string comparision functiosn for supporting the added enumerator
This commit is contained in:
@ -354,7 +354,7 @@ static int read_list (qse_xli_t* xli)
|
||||
while (atom)
|
||||
{
|
||||
if (atom->type == QSE_XLI_PAIR &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->key, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
xli->opt.strcmp(((qse_xli_pair_t*)atom)->key, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EEXIST, QSE_STR_XSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
|
@ -167,6 +167,7 @@ static qse_xli_tok_type_t classify_ident (qse_xli_t* xli, const qse_cstr_t* name
|
||||
mid = left + (right - left) / 2;
|
||||
kwp = &kwtab[mid];
|
||||
|
||||
/* not affected by case-insensitivity */
|
||||
n = qse_strxncmp (kwp->name.ptr, kwp->name.len, name->ptr, name->len);
|
||||
if (n > 0)
|
||||
{
|
||||
@ -539,7 +540,7 @@ static int check_token_for_key_eligibility (qse_xli_t* xli, qse_xli_list_t* parl
|
||||
while (atom)
|
||||
{
|
||||
if (atom->type == QSE_XLI_PAIR &&
|
||||
qse_strcmp(((qse_xli_pair_t*)atom)->key, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
xli->opt.strcmp(((qse_xli_pair_t*)atom)->key, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EEXIST, QSE_STR_XSTR(xli->tok.name), &xli->tok.loc);
|
||||
return -1;
|
||||
|
@ -285,7 +285,8 @@ retry:
|
||||
mid = left + (right - left) / 2;
|
||||
kwp = &kwtabp[mid];
|
||||
|
||||
n = qse_strxncmp (kwp->name.ptr, kwp->name.len, name->ptr, name->len);
|
||||
/* the identifier classification is not affected by case-insensivity */
|
||||
n = qse_strxncmp(kwp->name.ptr, kwp->name.len, name->ptr, name->len);
|
||||
if (n > 0)
|
||||
{
|
||||
/* if left, right, mid were of qse_size_t,
|
||||
@ -809,7 +810,7 @@ static int read_pair (qse_xli_t* xli, const qse_char_t* keytag, const qse_xli_sc
|
||||
while (atom)
|
||||
{
|
||||
if (atom->type == QSE_XLI_PAIR &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->key, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
xli->opt.strcmp(((qse_xli_pair_t*)atom)->key, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EEXIST, QSE_STR_XSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
@ -836,8 +837,8 @@ static int read_pair (qse_xli_t* xli, const qse_char_t* keytag, const qse_xli_sc
|
||||
{
|
||||
if (atom->type == QSE_XLI_PAIR &&
|
||||
((qse_xli_pair_t*)atom)->alias &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->key, key.ptr) == 0 &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->alias, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
xli->opt.strcmp(((qse_xli_pair_t*)atom)->key, key.ptr) == 0 &&
|
||||
xli->opt.strcmp(((qse_xli_pair_t*)atom)->alias, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EEXIST, QSE_STR_XSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
|
@ -70,6 +70,8 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr, qse_size_t rootxtnsize)
|
||||
xli->errstr = qse_xli_dflerrstr;
|
||||
xli->opt.root_xtnsize = rootxtnsize;
|
||||
xli->opt.key_splitter = QSE_T('.');
|
||||
xli->opt.strcmp = qse_strcmp;
|
||||
xli->opt.strxcmp = qse_strxcmp;
|
||||
|
||||
xli->dotted_curkey = qse_str_open (mmgr, 0, 128);
|
||||
if (xli->dotted_curkey == QSE_NULL) goto oops;
|
||||
@ -121,6 +123,16 @@ int qse_xli_setopt (qse_xli_t* xli, qse_xli_opt_t id, const void* value)
|
||||
{
|
||||
case QSE_XLI_TRAIT:
|
||||
xli->opt.trait = *(const int*)value;
|
||||
if (xli->opt.trait & QSE_XLI_CASE_INSENSITIVE)
|
||||
{
|
||||
xli->opt.strcmp = qse_strcasecmp;
|
||||
xli->opt.strxcmp = qse_strxcasecmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
xli->opt.strcmp = qse_strcmp;
|
||||
xli->opt.strxcmp = qse_strxcmp;
|
||||
}
|
||||
return 0;
|
||||
|
||||
case QSE_XLI_PAIRXTNSIZE:
|
||||
@ -648,7 +660,7 @@ static qse_size_t count_pairs_by_key (
|
||||
if (p->type == QSE_XLI_PAIR)
|
||||
{
|
||||
qse_xli_pair_t* pair = (qse_xli_pair_t*)p;
|
||||
if (qse_strxcmp (key->ptr, key->len, pair->key) == 0) count++;
|
||||
if (xli->opt.strxcmp(key->ptr, key->len, pair->key) == 0) count++;
|
||||
}
|
||||
|
||||
p = p->next;
|
||||
@ -670,10 +682,10 @@ static qse_xli_pair_t* find_pair_by_key_and_alias (
|
||||
if (p->type == QSE_XLI_PAIR)
|
||||
{
|
||||
qse_xli_pair_t* pair = (qse_xli_pair_t*)p;
|
||||
if (qse_strxcmp (key->ptr, key->len, pair->key) == 0)
|
||||
if (xli->opt.strxcmp(key->ptr, key->len, pair->key) == 0)
|
||||
{
|
||||
if (alias == QSE_NULL ||
|
||||
qse_strxcmp (alias->ptr, alias->len, pair->alias) == 0) return pair;
|
||||
xli->opt.strxcmp(alias->ptr, alias->len, pair->alias) == 0) return pair;
|
||||
}
|
||||
}
|
||||
|
||||
@ -697,7 +709,7 @@ static qse_xli_pair_t* find_pair_by_key_and_index (
|
||||
if (p->type == QSE_XLI_PAIR)
|
||||
{
|
||||
qse_xli_pair_t* pair = (qse_xli_pair_t*)p;
|
||||
if (qse_strxcmp (key->ptr, key->len, pair->key) == 0)
|
||||
if (xli->opt.strxcmp(key->ptr, key->len, pair->key) == 0)
|
||||
{
|
||||
if (index == count) return pair;
|
||||
count++;
|
||||
|
@ -103,6 +103,9 @@ struct qse_xli_t
|
||||
qse_size_t pair_xtnsize;
|
||||
qse_size_t root_xtnsize;
|
||||
qse_char_t key_splitter; /**< character to use to split a key in the fqpn format */
|
||||
|
||||
int (*strcmp) (const qse_char_t* s1, const qse_char_t* s2);
|
||||
int (*strxcmp) (const qse_char_t* s1, qse_size_t len1, const qse_char_t* s2);
|
||||
} opt;
|
||||
|
||||
qse_xli_ecb_t* ecb;
|
||||
|
Reference in New Issue
Block a user