cqltransform: use odr_setprint_noclose
[yaz-moved-to-github.git] / src / cqltransform.c
index f560445..b5fe140 100644 (file)
@@ -44,7 +44,7 @@ struct cql_transform_t_ {
     struct cql_prop_entry *entry;
     yaz_tok_cfg_t tok_cfg;
     int error;
-    char *addinfo;
+    WRBUF addinfo;
     NMEM nmem;
 };
 
@@ -54,7 +54,7 @@ cql_transform_t cql_transform_create(void)
     cql_transform_t ct = (cql_transform_t) xmalloc(sizeof(*ct));
     ct->tok_cfg = yaz_tok_cfg_create();
     ct->error = 0;
-    ct->addinfo = 0;
+    ct->addinfo = wrbuf_alloc();
     ct->entry = 0;
     ct->nmem = nmem_create();
     return ct;
@@ -191,9 +191,8 @@ static int cql_transform_parse_tok_line(cql_transform_t ct,
         {
             ODR pr = odr_createmem(ODR_PRINT);
             Z_AttributeList *alp = &(*pp)->attr_list;
-            odr_setprint(pr, yaz_log_file());
+            odr_setprint_noclose(pr, yaz_log_file());
             z_AttributeList(pr, &alp, 0, 0);
-            odr_setprint(pr, 0);
             odr_destroy(pr);
         }
     }
@@ -267,7 +266,7 @@ void cql_transform_close(cql_transform_t ct)
         xfree(pe);
         pe = pe_next;
     }
-    xfree(ct->addinfo);
+    wrbuf_destroy(ct->addinfo);
     yaz_tok_cfg_destroy(ct->tok_cfg);
     nmem_destroy(ct->nmem);
     xfree(ct);
@@ -382,7 +381,7 @@ static const char *cql_lookup_property(cql_transform_t ct,
     return 0;
 }
 
-int cql_pr_attr_uri(cql_transform_t ct, char **addinfo, const char *category,
+int cql_pr_attr_uri(cql_transform_t ct, WRBUF addinfo, const char *category,
                    const char *uri, const char *val, const char *default_val,
                    void (*pr)(const char *buf, void *client_data),
                    void *client_data,
@@ -464,11 +463,11 @@ int cql_pr_attr_uri(cql_transform_t ct, char **addinfo, const char *category,
     if (errcode == 0)
         return 1; /* signal error, but do not set addinfo */
     if (val)
-        *addinfo = xstrdup(val);
+        wrbuf_puts(addinfo, val);
     return errcode;
 }
 
-int cql_pr_attr(cql_transform_t ct, char **addinfo, const char *category,
+int cql_pr_attr(cql_transform_t ct, WRBUF addinfo, const char *category,
                 const char *val, const char *default_val,
                 void (*pr)(const char *buf, void *client_data),
                 void *client_data,
@@ -491,7 +490,7 @@ static void cql_pr_int(int val,
 
 
 static int cql_pr_prox(cql_transform_t ct, struct cql_node *mods,
-                       char **addinfo,
+                       WRBUF addinfo,
                        void (*pr)(const char *buf, void *client_data),
                        void *client_data)
 {
@@ -523,7 +522,7 @@ static int cql_pr_prox(cql_transform_t ct, struct cql_node *mods,
                 proxrel = 6;
             else
             {
-                *addinfo = xstrdup(relation);
+                wrbuf_puts(addinfo, relation);
                 return YAZ_SRW_UNSUPP_PROX_RELATION;
             }
         }
@@ -543,13 +542,13 @@ static int cql_pr_prox(cql_transform_t ct, struct cql_node *mods,
                 unit = 8;
             else
             {
-                *addinfo = xstrdup(term);
+                wrbuf_puts(addinfo, term);
                 return YAZ_SRW_UNSUPP_PROX_UNIT;
             }
         }
         else
         {
-            *addinfo = xstrdup(name);
+            wrbuf_puts(addinfo, name);
             return YAZ_SRW_UNSUPP_BOOLEAN_MODIFIER;
         }
         mods = mods->u.st.modifiers;
@@ -580,7 +579,7 @@ static int has_modifier(struct cql_node *cn, const char *name) {
 }
 
 static int emit_term(cql_transform_t ct,
-                     struct cql_node *cn, char **addinfo,
+                     struct cql_node *cn, WRBUF addinfo,
                      const char *term, int length,
                      void (*pr)(const char *buf, void *client_data),
                      void *client_data)
@@ -778,7 +777,7 @@ static int emit_term(cql_transform_t ct,
 }
 
 static int emit_terms(cql_transform_t ct, struct cql_node *cn,
-                      char **addinfo,
+                      WRBUF addinfo,
                       void (*pr)(const char *buf, void *client_data),
                       void *client_data,
                       const char *op)
@@ -808,7 +807,7 @@ static int emit_terms(cql_transform_t ct, struct cql_node *cn,
 }
 
 static int emit_wordlist(cql_transform_t ct, struct cql_node *cn,
-                         char **addinfo,
+                         WRBUF addinfo,
                          void (*pr)(const char *buf, void *client_data),
                          void *client_data,
                          const char *op)
@@ -843,10 +842,10 @@ static int emit_wordlist(cql_transform_t ct, struct cql_node *cn,
     return r;
 }
 
-int cql_transform_r(cql_transform_t ct, struct cql_node *cn,
-                    char **addinfo,
-                    void (*pr)(const char *buf, void *client_data),
-                    void *client_data)
+static int emit_node(cql_transform_t ct, struct cql_node *cn,
+                     WRBUF addinfo,
+                     void (*pr)(const char *buf, void *client_data),
+                     void *client_data)
 {
     const char *ns;
     int r = 0;
@@ -871,7 +870,6 @@ int cql_transform_r(cql_transform_t ct, struct cql_node *cn,
         }
         else
         {
-            *addinfo = 0;
             return YAZ_SRW_UNSUPP_CONTEXT_SET;
         }
         cql_pr_attr(ct, addinfo, "always", 0, 0, pr, client_data, 0);
@@ -905,19 +903,19 @@ int cql_transform_r(cql_transform_t ct, struct cql_node *cn,
         else if (mods)
         {
             /* Boolean modifiers other than on proximity not supported */
-            *addinfo = xstrdup(mods->u.st.index);
+            wrbuf_puts(addinfo, mods->u.st.index);
             return YAZ_SRW_UNSUPP_BOOLEAN_MODIFIER;
         }
 
-        r = cql_transform_r(ct, cn->u.boolean.left, addinfo, pr, client_data);
+        r = emit_node(ct, cn->u.boolean.left, addinfo, pr, client_data);
         if (r)
             return r;
-        r = cql_transform_r(ct, cn->u.boolean.right, addinfo, pr, client_data);
+        r = emit_node(ct, cn->u.boolean.right, addinfo, pr, client_data);
         if (r)
             return r;
         break;
     case CQL_NODE_SORT:
-        r = cql_transform_r(ct, cn->u.sort.search, addinfo, pr, client_data);
+        r = emit_node(ct, cn->u.sort.search, addinfo, pr, client_data);
         break;
     default:
         fprintf(stderr, "Fatal: impossible CQL node-type %d\n", cn->which);
@@ -926,10 +924,10 @@ int cql_transform_r(cql_transform_t ct, struct cql_node *cn,
     return r;
 }
 
-int cql_transform_cql2rpn(cql_transform_t ct, struct cql_node *cn,
-                          char **addinfo,
-                          void (*pr)(const char *buf, void *client_data),
-                          void *client_data)
+int cql_transform_r(cql_transform_t ct, struct cql_node *cn,
+                    WRBUF addinfo,
+                    void (*pr)(const char *buf, void *client_data),
+                    void *client_data)
 {
     struct cql_prop_entry *e;
     NMEM nmem = nmem_create();
@@ -942,7 +940,7 @@ int cql_transform_cql2rpn(cql_transform_t ct, struct cql_node *cn,
         else if (!cql_strcmp(e->pattern, "set"))
             cql_apply_prefix(nmem, cn, 0, e->value);
     }
-    r  = cql_transform_r(ct, cn, addinfo, pr, client_data);
+    r  = emit_node(ct, cn, addinfo, pr, client_data);
     nmem_destroy(nmem);
     return r;
 }
@@ -951,10 +949,10 @@ int cql_transform(cql_transform_t ct, struct cql_node *cn,
                   void (*pr)(const char *buf, void *client_data),
                   void *client_data)
 {
-    char *addinfo = 0;
-    int r = cql_transform_cql2rpn(ct, cn, &addinfo, pr, client_data);
-    cql_transform_set_error(ct, r, addinfo);
-    xfree(addinfo);
+    WRBUF addinfo = wrbuf_alloc();
+    int r = cql_transform_r(ct, cn, addinfo, pr, client_data);
+    cql_transform_set_error(ct, r, wrbuf_cstr(addinfo));
+    wrbuf_destroy(addinfo);
     return r;
 }
 
@@ -989,14 +987,15 @@ int cql_transform_buf(cql_transform_t ct, struct cql_node *cn,
 
 int cql_transform_error(cql_transform_t ct, const char **addinfo)
 {
-    *addinfo = ct->addinfo;
+    *addinfo = wrbuf_len(ct->addinfo) ? wrbuf_cstr(ct->addinfo) : 0;
     return ct->error;
 }
 
 void cql_transform_set_error(cql_transform_t ct, int error, const char *addinfo)
 {
-    xfree(ct->addinfo);
-    ct->addinfo = addinfo ? xstrdup(addinfo) : 0;
+    wrbuf_rewind(ct->addinfo);
+    if (addinfo)
+        wrbuf_puts(ct->addinfo, addinfo);
     ct->error = error;
 }