Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
[egate.git] / ccl / ccltoken.c
index adbf1f6..51cdf0e 100644 (file)
@@ -2,7 +2,30 @@
  * Europagate, 1995
  *
  * $Log: ccltoken.c,v $
- * Revision 1.1  1995/02/13 12:35:21  adam
+ * Revision 1.8  1995/05/11 14:03:57  adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.7  1995/04/19  12:11:24  adam
+ * Minor change.
+ *
+ * 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.
  *
  */
 #include <stdlib.h>
 #include <assert.h>
 
-#include "cclp.h"
+#include <ccl.h>
+
+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";
+int ccl_case_sensitive = 1;
 
-static int strin (const char *s, const char *cset)
+/*
+ * 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;
+    if (!kw)
+        return 0;
+    while ((cp2 = strchr (cp1, ' ')))
     {
-       if (*cset++ == *s)
-           return 1;
+        if (token->len == cp2-cp1)
+            if (ccl_case_sensitive)
+            {
+                if (!memcmp (cp1, token->name, token->len))
+                    return 1;
+            }
+            else
+            {
+                if (!ccl_memicmp (cp1, token->name, token->len))
+                    return 1;
+            }
+       cp1 = cp2+1;
     }
-    return 0;
+    if (ccl_case_sensitive)
+        return token->len == strlen(cp1) 
+            && !memcmp (cp1, token->name, token->len);
+    return token->len == strlen(cp1) &&
+        !ccl_memicmp (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 +90,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 +164,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;
        }