MARC-8: allow all characters 0x01-0x20 YAZ-650
[yaz-moved-to-github.git] / src / cql2ccl.c
index 87881e4..331b6db 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2011 Index Data
+ * Copyright (C) 1995-2013 Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -16,7 +16,7 @@
 
 #include <yaz/cql.h>
 
-static int cql_to_ccl_r(struct cql_node *cn, 
+static int cql_to_ccl_r(struct cql_node *cn,
                         void (*pr)(const char *buf, void *client_data),
                         void *client_data);
 
@@ -29,7 +29,7 @@ static void pr_term(const char **cpp, int stop_at_space,
     for (cp = *cpp; *cp; cp++)
     {
         char x[4];
-        
+
         if (*cp == '\\' && cp[1])
         {
             if (!quote_mode)
@@ -62,7 +62,7 @@ static void pr_term(const char **cpp, int stop_at_space,
             }
             pr("#", client_data);
         }
-        else if (*cp == ' ')
+        else if (*cp == ' ' && stop_at_space)
             break;
         else
         {
@@ -83,7 +83,7 @@ static void pr_term(const char **cpp, int stop_at_space,
     *cpp = cp;
 }
 
-static int node(struct cql_node *cn, 
+static int node(struct cql_node *cn,
                 void (*pr)(const char *buf, void *client_data),
                 void *client_data)
 {
@@ -91,6 +91,7 @@ static int node(struct cql_node *cn,
     const char *split_op = 0;
     const char *ccl_rel = 0;
     const char *rel = cn->u.st.relation;
+    const char *cp;
 
     if (cn->u.st.index && strcmp(cn->u.st.index,
                                  "cql.serverChoice"))
@@ -121,42 +122,33 @@ static int node(struct cql_node *cn,
         /* unsupported relation */
         return -1;
     }
-    for (; cn; cn = cn->u.st.extra_terms)
+    cp = cn->u.st.term;
+    while (1)
     {
-        const char *cp = cn->u.st.term;
-        while (1)
+        if (ccl_field && ccl_rel)
         {
-            if (ccl_field && ccl_rel)
-            {
-                pr(ccl_field, client_data);
-                pr(ccl_rel, client_data);
-            }
-            pr_term(&cp, split_op ? 1 : 0, pr, client_data);
+            pr(ccl_field, client_data);
+            pr(ccl_rel, client_data);
             if (!split_op)
-                break;
-            while (*cp == ' ')
-                cp++;
-            if (*cp == '\0')
-                break;
-            pr(" ", client_data);
-            pr(split_op, client_data);
-            pr(" ", client_data);
+                ccl_rel = 0;
         }
-        if (cn->u.st.extra_terms)
+        pr_term(&cp, split_op ? 1 : 0, pr, client_data);
+        while (*cp == ' ')
+            cp++;
+        if (*cp == '\0')
+            break;
+        pr(" ", client_data);
+        if (split_op)
         {
+            pr(split_op, client_data);
             pr(" ", client_data);
-            if (split_op)
-            {
-                pr(split_op, client_data);
-                pr(" ", client_data);
-            }
         }
     }
     return 0;
 }
 
 
-static int bool(struct cql_node *cn, 
+static int bool(struct cql_node *cn,
                 void (*pr)(const char *buf, void *client_data),
                 void *client_data)
 {
@@ -167,7 +159,7 @@ static int bool(struct cql_node *cn,
     r = cql_to_ccl_r(cn->u.boolean.left, pr, client_data);
     if (r)
         return r;
-    
+
     pr(") ", client_data);
 
     if (strcmp(value, "prox"))
@@ -224,7 +216,7 @@ static int bool(struct cql_node *cn,
     return r;
 }
 
-static int cql_to_ccl_r(struct cql_node *cn, 
+static int cql_to_ccl_r(struct cql_node *cn,
                         void (*pr)(const char *buf, void *client_data),
                         void *client_data)
 {
@@ -243,7 +235,7 @@ static int cql_to_ccl_r(struct cql_node *cn,
     return -1;
 }
 
-int cql_to_ccl(struct cql_node *cn, 
+int cql_to_ccl(struct cql_node *cn,
                void (*pr)(const char *buf, void *client_data),
                void *client_data)
 {