Use oid_class rather than int for OID class.
[yaz-moved-to-github.git] / src / cql.y
index f4293e7..20013cb 100644 (file)
--- a/src/cql.y
+++ b/src/cql.y
@@ -1,4 +1,4 @@
-/* $Id: cql.y,v 1.11 2006-10-05 16:19:16 adam Exp $
+/* $Id: cql.y,v 1.15 2007-10-31 21:58:07 adam Exp $
    Copyright (C) 2002-2006
    Index Data ApS
 
@@ -135,13 +135,12 @@ searchClause:
 /* unary NOT search TERM here .. */
 
 boolean: 
-  AND | OR | NOT | PROX 
-  ;
+  AND | OR | NOT | PROX ;
 
 modifiers: modifiers '/' searchTerm
 { 
     struct cql_node *mod = cql_node_mk_sc(((CQL_parser)parm)->nmem,
-                                         $3.buf, "=", 0);
+                                         $3.buf, 0, 0);
 
     mod->u.st.modifiers = $1.cql;
     $$.cql = mod;
@@ -279,8 +278,13 @@ int yylex(YYSTYPE *lval, void *vp)
         while ((c = cp->getbyte(cp->client_data)) != 0 && c != '"')
         {
             if (c == '\\')
+           {
+               putb(lval, cp, c);
                 c = cp->getbyte(cp->client_data);
-            putb(lval, cp, c);
+               if (!c)
+                   break;
+           }
+           putb(lval, cp, c);
         }
         putb(lval, cp, 0);
     }
@@ -289,23 +293,41 @@ int yylex(YYSTYPE *lval, void *vp)
         while (c != 0 && !strchr(" \n()=<>/", c))
         {
             if (c == '\\')
+           {
+               putb(lval, cp, c);
                 c = cp->getbyte(cp->client_data);
+               if (!c)
+                   break;
+           }
             putb(lval, cp, c);
            c = cp->getbyte(cp->client_data);
         }
+       putb(lval, cp, 0);
 #if YYDEBUG
         printf ("got %s\n", lval->buf);
 #endif
         if (c != 0)
             cp->ungetbyte(c, cp->client_data);
         if (!cql_strcmp(lval->buf, "and"))
+       {
+           lval->buf = "and";
             return AND;
+       }
         if (!cql_strcmp(lval->buf, "or"))
+       {
+           lval->buf = "or";
             return OR;
+       }
         if (!cql_strcmp(lval->buf, "not"))
+       {
+           lval->buf = "not";
             return NOT;
+       }
         if (!cql_strcmp(lval->buf, "prox"))
+       {
+           lval->buf = "prox";
             return PROX;
+       }
     }
     return TERM;
 }