X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=ccl%2Fccltoken.c;h=6930adfe0834df9d133be1d1c80d3388c6299001;hb=b9bf72fa7af887225b50f567f91c06ce4353d0c8;hp=adbf1f6c16da935a4867459684c31d4bfa55d85a;hpb=68727e97f4ab17a7008c5a8552796ec123af031c;p=egate.git diff --git a/ccl/ccltoken.c b/ccl/ccltoken.c index adbf1f6..6930adf 100644 --- a/ccl/ccltoken.c +++ b/ccl/ccltoken.c @@ -2,7 +2,22 @@ * Europagate, 1995 * * $Log: ccltoken.c,v $ - * Revision 1.1 1995/02/13 12:35:21 adam + * 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 +27,39 @@ #include #include -#include "cclp.h" +#include -static int strin (const char *s, const char *cset) +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"; + +/* + * 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; + while ((cp2 = strchr (cp1, ' '))) { - if (*cset++ == *s) + if (token->len == cp2-cp1 && + !memcmp (cp1, token->name, token->len)) return 1; + cp1 = cp2+1; } - return 0; + return token->len == strlen(cp1) + && !memcmp (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 +68,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 +142,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; }