/* 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.
#include <ccl.h>
-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;
while (1)
{
- while (*cp && strin (cp, " \t\r\n"))
+ while (*cp && strchr (" \t\r\n", *cp))
{
cp++;
continue;
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;
}