1 /* CCL - lexical analysis
5 * Revision 1.4 1995-11-01 13:54:22 quinn
8 * Revision 1.3 1995/09/29 17:12:00 quinn
11 * Revision 1.2 1995/09/27 15:02:44 quinn
12 * Modified function heads & prototypes.
14 * Revision 1.1 1995/04/10 10:28:22 quinn
17 * Revision 1.5 1995/02/23 08:32:00 adam
20 * Revision 1.3 1995/02/15 17:42:16 adam
21 * Minor changes of the api of this module. FILE* argument added
24 * Revision 1.2 1995/02/14 19:55:13 adam
25 * Header files ccl.h/cclp.h are gone! They have been merged an
26 * moved to ../include/ccl.h.
27 * Node kind(s) in ccl_rpn_node have changed names.
29 * Revision 1.1 1995/02/13 12:35:21 adam
30 * First version of CCL. Qualifiers aren't handled yet.
41 static int strin (const char *s, const char *cset)
51 const char *ccl_token_and = "and";
52 const char *ccl_token_or = "or";
53 const char *ccl_token_not = "not";
54 const char *ccl_token_set = "set";
56 struct ccl_token *ccl_tokenize (const char *command)
58 const char *cp = command;
59 struct ccl_token *first = NULL;
60 struct ccl_token *last = NULL;
64 while (*cp && strin (cp, " \t\r\n"))
71 first = last = xmalloc (sizeof (*first));
77 last->next = xmalloc (sizeof(*first));
79 last->next->prev = last;
88 last->kind = CCL_TOK_EOL;
91 last->kind = CCL_TOK_LP;
94 last->kind = CCL_TOK_RP;
97 last->kind = CCL_TOK_COMMA;
101 last->kind = CCL_TOK_PROX;
102 while (*cp == '%' || *cp == '!')
111 if (*cp == '=' || *cp == '<' || *cp == '>')
114 last->kind = CCL_TOK_REL;
117 else if (cp[-1] == '=')
118 last->kind = CCL_TOK_EQ;
120 last->kind = CCL_TOK_REL;
123 last->kind = CCL_TOK_MINUS;
126 last->kind = CCL_TOK_TERM;
129 while (*cp && *cp != '\"')
138 while (*cp && !strin (cp, "(),%!><=- \t\n\r"))
143 if (strlen (ccl_token_and)==last->len &&
144 !memcmp (ccl_token_and, last->name, last->len))
145 last->kind = CCL_TOK_AND;
146 else if (strlen (ccl_token_or)==last->len &&
147 !memcmp (ccl_token_or, last->name, last->len))
148 last->kind = CCL_TOK_OR;
149 else if (strlen (ccl_token_not)==last->len &&
150 !memcmp (ccl_token_not, last->name, last->len))
151 last->kind = CCL_TOK_NOT;
152 else if (strlen (ccl_token_set)==last->len &&
153 !memcmp (ccl_token_set, last->name, last->len))
154 last->kind = CCL_TOK_SET;
156 last->kind = CCL_TOK_TERM;