1 /* CCL - lexical analysis
5 * Revision 1.1 1995/02/13 12:35:21 adam
6 * First version of CCL. Qualifiers aren't handled yet.
17 static int strin (const char *s, const char *cset)
27 char *ccl_token_and = "and";
28 char *ccl_token_or = "or";
29 char *ccl_token_not = "not";
30 char *ccl_token_set = "set";
32 struct ccl_token *ccl_tokenize (const char *command)
34 const char *cp = command;
35 struct ccl_token *first = NULL;
36 struct ccl_token *last = NULL;
40 while (*cp && strin (cp, " \t\r\n"))
47 first = last = malloc (sizeof (*first));
53 last->next = malloc (sizeof(*first));
55 last->next->prev = last;
64 last->kind = CCL_TOK_EOL;
67 last->kind = CCL_TOK_LP;
70 last->kind = CCL_TOK_RP;
73 last->kind = CCL_TOK_COMMA;
77 last->kind = CCL_TOK_PROX;
78 while (*cp == '%' || *cp == '!')
87 if (*cp == '=' || *cp == '<' || *cp == '>')
90 last->kind = CCL_TOK_REL;
93 else if (cp[-1] == '=')
94 last->kind = CCL_TOK_EQ;
96 last->kind = CCL_TOK_REL;
99 last->kind = CCL_TOK_MINUS;
102 last->kind = CCL_TOK_TERM;
105 while (*cp && *cp != '\"')
114 while (*cp && !strin (cp, "(),%!><=- \t\n\r"))
119 if (strlen (ccl_token_and)==last->len &&
120 !memcmp (ccl_token_and, last->name, last->len))
121 last->kind = CCL_TOK_AND;
122 else if (strlen (ccl_token_or)==last->len &&
123 !memcmp (ccl_token_or, last->name, last->len))
124 last->kind = CCL_TOK_OR;
125 else if (strlen (ccl_token_not)==last->len &&
126 !memcmp (ccl_token_not, last->name, last->len))
127 last->kind = CCL_TOK_NOT;
128 else if (strlen (ccl_token_set)==last->len &&
129 !memcmp (ccl_token_set, last->name, last->len))
130 last->kind = CCL_TOK_SET;
132 last->kind = CCL_TOK_TERM;