X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=ccl%2Fccltoken.c;h=51cdf0e2831a4ee39b55b3f21d12f95f0b760159;hb=ddccceb2d9e85c93eca315233f73adf6743bc2bf;hp=adbf1f6c16da935a4867459684c31d4bfa55d85a;hpb=68727e97f4ab17a7008c5a8552796ec123af031c;p=egate.git diff --git a/ccl/ccltoken.c b/ccl/ccltoken.c index adbf1f6..51cdf0e 100644 --- a/ccl/ccltoken.c +++ b/ccl/ccltoken.c @@ -2,7 +2,30 @@ * Europagate, 1995 * * $Log: ccltoken.c,v $ - * Revision 1.1 1995/02/13 12:35:21 adam + * Revision 1.8 1995/05/11 14:03:57 adam + * Changes in the reading of qualifier(s). New function: ccl_qual_fitem. + * New variable ccl_case_sensitive, which controls whether reserved + * words and field names are case sensitive or not. + * + * Revision 1.7 1995/04/19 12:11:24 adam + * Minor change. + * + * Revision 1.6 1995/04/17 09:31:48 adam + * Improved handling of qualifiers. Aliases or reserved words. + * + * Revision 1.5 1995/02/23 08:32:00 adam + * Changed header. + * + * Revision 1.3 1995/02/15 17:42:16 adam + * Minor changes of the api of this module. FILE* argument added + * to ccl_pr_tree. + * + * Revision 1.2 1995/02/14 19:55:13 adam + * Header files ccl.h/cclp.h are gone! They have been merged an + * moved to ../include/ccl.h. + * Node kind(s) in ccl_rpn_node have changed names. + * + * Revision 1.1 1995/02/13 12:35:21 adam * First version of CCL. Qualifiers aren't handled yet. * */ @@ -12,23 +35,53 @@ #include #include -#include "cclp.h" +#include + +const char *ccl_token_and = "and"; +const char *ccl_token_or = "or"; +const char *ccl_token_not = "not andnot"; +const char *ccl_token_set = "set"; +int ccl_case_sensitive = 1; -static int strin (const char *s, const char *cset) +/* + * token_cmp: Compare token with keyword(s) + * kw: Keyword list. Each keyword is separated by space. + * token: CCL token. + * return: 1 if token string matches one of the keywords in list; + * 0 otherwise. + */ +static int token_cmp (const char *kw, struct ccl_token *token) { - while (*cset) + const char *cp1 = kw; + const char *cp2; + if (!kw) + return 0; + while ((cp2 = strchr (cp1, ' '))) { - if (*cset++ == *s) - return 1; + if (token->len == cp2-cp1) + if (ccl_case_sensitive) + { + if (!memcmp (cp1, token->name, token->len)) + return 1; + } + else + { + if (!ccl_memicmp (cp1, token->name, token->len)) + return 1; + } + cp1 = cp2+1; } - return 0; + if (ccl_case_sensitive) + return token->len == strlen(cp1) + && !memcmp (cp1, token->name, token->len); + return token->len == strlen(cp1) && + !ccl_memicmp (cp1, token->name, token->len); } -char *ccl_token_and = "and"; -char *ccl_token_or = "or"; -char *ccl_token_not = "not"; -char *ccl_token_set = "set"; - +/* + * ccl_tokenize: tokenize CCL command string. + * return: CCL token list. + */ struct ccl_token *ccl_tokenize (const char *command) { const char *cp = command; @@ -37,7 +90,7 @@ struct ccl_token *ccl_tokenize (const char *command) while (1) { - while (*cp && strin (cp, " \t\r\n")) + while (*cp && strchr (" \t\r\n", *cp)) { cp++; continue; @@ -111,23 +164,19 @@ struct ccl_token *ccl_tokenize (const char *command) cp++; break; default: - while (*cp && !strin (cp, "(),%!><=- \t\n\r")) + while (*cp && !strchr ("(),%!><=- \t\n\r", *cp)) { cp++; ++ last->len; } - if (strlen (ccl_token_and)==last->len && - !memcmp (ccl_token_and, last->name, last->len)) - last->kind = CCL_TOK_AND; - else if (strlen (ccl_token_or)==last->len && - !memcmp (ccl_token_or, last->name, last->len)) - last->kind = CCL_TOK_OR; - else if (strlen (ccl_token_not)==last->len && - !memcmp (ccl_token_not, last->name, last->len)) - last->kind = CCL_TOK_NOT; - else if (strlen (ccl_token_set)==last->len && - !memcmp (ccl_token_set, last->name, last->len)) - last->kind = CCL_TOK_SET; + if (token_cmp (ccl_token_and, last)) + last->kind = CCL_TOK_AND; + else if (token_cmp (ccl_token_or, last)) + last->kind = CCL_TOK_OR; + else if (token_cmp (ccl_token_not, last)) + last->kind = CCL_TOK_NOT; + else if (token_cmp (ccl_token_set, last)) + last->kind = CCL_TOK_SET; else last->kind = CCL_TOK_TERM; }