X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=ccl%2Fccltoken.c;h=6930adfe0834df9d133be1d1c80d3388c6299001;hb=db407de046272b028cf37338c9427846d97dfcf3;hp=def3fb824a242c2530db2f394ffc93471b6a7151;hpb=3f6af0f3aa9f114cf562c28f2ed0b954e4c5d659;p=egate.git diff --git a/ccl/ccltoken.c b/ccl/ccltoken.c index def3fb8..6930adf 100644 --- a/ccl/ccltoken.c +++ b/ccl/ccltoken.c @@ -1,7 +1,13 @@ /* CCL - lexical analysis * Europagate, 1995 * - * ccltoken.c,v + * $Log: ccltoken.c,v $ + * 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. @@ -23,21 +29,37 @@ #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); } -const char *ccl_token_and = "and"; -const char *ccl_token_or = "or"; -const char *ccl_token_not = "not"; -const 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; @@ -46,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; @@ -120,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; }