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:
2018-01-19 03:53:43 +00:00
parent ffa5514b43
commit e5fa90ec02
7 changed files with 292 additions and 271 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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++;

View File

@ -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;