cql2cql: convert mask char '*'=>'?'
[yaz-moved-to-github.git] / src / cql2ccl.c
index 5f2011b..f427e7c 100644 (file)
@@ -3,7 +3,7 @@
  * See the file LICENSE for details.
  */
 /**
- * \file xcqlutil.c
+ * \file cql2ccl.c
  * \brief Implements CQL to XCQL conversion.
  */
 #if HAVE_CONFIG_H
@@ -21,14 +21,24 @@ static int cql_to_ccl_r(struct cql_node *cn,
                         void *client_data);
 
 static void pr_term(struct cql_node *cn,
-                void (*pr)(const char *buf, void *client_data),
-                void *client_data)
+                    void (*pr)(const char *buf, void *client_data),
+                    void *client_data)
 {
     while (cn)
     {
-        pr("\"", client_data);
-        pr(cn->u.st.term, client_data);
-        pr("\"", client_data);
+        const char *cp;
+        cp = cn->u.st.term;
+        while (*cp)
+        {
+            char x[2];
+            if (*cp == '*')
+                x[0] = '?';
+            else
+                x[0] = *cp;
+            x[1] = 0;
+            pr(x, client_data);
+            cp++;
+        }
         if (cn->u.st.extra_terms)
             pr(" ", client_data);
         cn = cn->u.st.extra_terms;
@@ -98,7 +108,10 @@ static int node(struct cql_node *cn,
             while (*cp && *cp != ' ')
             {
                 char x[2];
-                x[0] = *cp;
+                if (*cp == '*')
+                    x[0] = '?';
+                else
+                    x[0] = *cp;
                 x[1] = '\0';
                 pr(x, client_data);
                 cp++;
@@ -111,7 +124,6 @@ static int node(struct cql_node *cn,
             pr(split_op, client_data);
             pr(" ", client_data);            
         }
-        return -1;
     }
     return 0;
 }
@@ -168,7 +180,20 @@ void cql_to_ccl_stdio(struct cql_node *cn, FILE *f)
     cql_to_ccl(cn, cql_fputs, f);
 }
 
-
+int cql_to_ccl_buf(struct cql_node *cn, char *out, int max)
+{
+    struct cql_buf_write_info info;
+    int r;
+    info.off = 0;
+    info.max = max;
+    info.buf = out;
+    r = cql_to_ccl(cn, cql_buf_write_handler, &info);
+    if (info.off >= 0)
+        info.buf[info.off] = '\0';
+    else
+        return -2; /* buffer overflow */
+    return r;
+}
 
 /*
  * Local variables: