Add YAZ_EXPORT to cql_transform_r fixes YAZ-793
[yaz-moved-to-github.git] / include / yaz / cql.h
index 148a9e0..bed8e85 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2011 Index Data.
+ * Copyright (C) Index Data.
  * All rights reserved.
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
  * All rights reserved.
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -33,6 +33,7 @@
 #define CQL_H_INCLUDED
 #include <stdio.h>
 #include <yaz/nmem.h>
 #define CQL_H_INCLUDED
 #include <stdio.h>
 #include <yaz/nmem.h>
+#include <yaz/wrbuf.h>
 
 YAZ_BEGIN_CDECL
 
 
 YAZ_BEGIN_CDECL
 
@@ -41,10 +42,10 @@ typedef struct cql_parser *CQL_parser;
 
 /** \brief creates a CQL parser.
     \returns CCL parser
 
 /** \brief creates a CQL parser.
     \returns CCL parser
-    
+
     Returns CQL parser or NULL if parser could not be created.
  */
     Returns CQL parser or NULL if parser could not be created.
  */
-YAZ_EXPORT 
+YAZ_EXPORT
 CQL_parser cql_parser_create(void);
 
 /** \brief destroys a CQL parser.
 CQL_parser cql_parser_create(void);
 
 /** \brief destroys a CQL parser.
@@ -52,7 +53,7 @@ CQL_parser cql_parser_create(void);
 
     This function does nothing if NULL if received.
  */
 
     This function does nothing if NULL if received.
  */
-YAZ_EXPORT 
+YAZ_EXPORT
 void cql_parser_destroy(CQL_parser cp);
 
 /** \brief parses a CQL query (string)
 void cql_parser_destroy(CQL_parser cp);
 
 /** \brief parses a CQL query (string)
@@ -61,7 +62,7 @@ void cql_parser_destroy(CQL_parser cp);
     \retval 0 success
     \retval !=0 failure
  */
     \retval 0 success
     \retval !=0 failure
  */
-YAZ_EXPORT 
+YAZ_EXPORT
 int cql_parser_string(CQL_parser cp, const char *str);
 
 /** \brief parses CQL query (query stream)
 int cql_parser_string(CQL_parser cp, const char *str);
 
 /** \brief parses CQL query (query stream)
@@ -71,14 +72,14 @@ int cql_parser_string(CQL_parser cp, const char *str);
     \param client_data data to be passed to stream functions
     \retval 0 success
     \retval !=0 failure
     \param client_data data to be passed to stream functions
     \retval 0 success
     \retval !=0 failure
-    
+
     This function is similar to cql_parser_string but takes a
     functions to read each query character from a stream.
     This function is similar to cql_parser_string but takes a
     functions to read each query character from a stream.
-    
+
     The functions pointers getbytes, ungetbyte are similar to
     that known from stdios getc, ungetc.
 */
     The functions pointers getbytes, ungetbyte are similar to
     that known from stdios getc, ungetc.
 */
-YAZ_EXPORT 
+YAZ_EXPORT
 int cql_parser_stream(CQL_parser cp,
                       int (*getbyte)(void *client_data),
                       void (*ungetbyte)(int b, void *client_data),
 int cql_parser_stream(CQL_parser cp,
                       int (*getbyte)(void *client_data),
                       void (*ungetbyte)(int b, void *client_data),
@@ -89,13 +90,23 @@ int cql_parser_stream(CQL_parser cp,
     \param f file where query is read from
     \retval 0 success
     \retval !=0 failure
     \param f file where query is read from
     \retval 0 success
     \retval !=0 failure
-    
-    This function is similar to cql_parser_string but reads from 
+
+    This function is similar to cql_parser_string but reads from
     stdio FILE handle instead.
 */
 YAZ_EXPORT
 int cql_parser_stdio(CQL_parser cp, FILE *f);
 
     stdio FILE handle instead.
 */
 YAZ_EXPORT
 int cql_parser_stdio(CQL_parser cp, FILE *f);
 
+/** \brief configures strict mode
+    \param cp CQL parser
+    \param mode 1=enable strict mode, 0=disable strict mode
+
+    This function is similar to cql_parser_string but reads from
+    stdio FILE handle instead.
+*/
+YAZ_EXPORT
+void cql_parser_strict(CQL_parser cp, int mode);
+
 /** \brief Node type: search term */
 #define CQL_NODE_ST 1
 /** \brief Node type: boolean */
 /** \brief Node type: search term */
 #define CQL_NODE_ST 1
 /** \brief Node type: boolean */
@@ -132,7 +143,7 @@ struct cql_node {
             char *value;
             /** left operand */
             struct cql_node *left;
             char *value;
             /** left operand */
             struct cql_node *left;
-            /** right operand */ 
+            /** right operand */
             struct cql_node *right;
             /** modifiers (NULL for no list) */
             struct cql_node *modifiers;
             struct cql_node *right;
             /** modifiers (NULL for no list) */
             struct cql_node *modifiers;
@@ -224,7 +235,7 @@ struct cql_node *cql_parser_sort_result(CQL_parser cp);
     \param client_data data to be passed to pr function
  */
 YAZ_EXPORT
     \param client_data data to be passed to pr function
  */
 YAZ_EXPORT
-void cql_to_xml(struct cql_node *cn, 
+void cql_to_xml(struct cql_node *cn,
                 void (*pr)(const char *buf, void *client_data),
                 void *client_data);
 /** \brief converts CQL tree to XCQL and writes to file
                 void (*pr)(const char *buf, void *client_data),
                 void *client_data);
 /** \brief converts CQL tree to XCQL and writes to file
@@ -249,7 +260,7 @@ int cql_to_xml_buf(struct cql_node *cn, char *out, int max);
     \param client_data data to be passed to pr function
  */
 YAZ_EXPORT
     \param client_data data to be passed to pr function
  */
 YAZ_EXPORT
-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);
 
                void (*pr)(const char *buf, void *client_data),
                void *client_data);
 
@@ -264,7 +275,9 @@ void cql_to_ccl_stdio(struct cql_node *cn, FILE *f);
     \param cn CQL node (tree)
     \param out buffer
     \param max size of buffer (max chars to write)
     \param cn CQL node (tree)
     \param out buffer
     \param max size of buffer (max chars to write)
-    \returns length of resulting buffer
+    \retval 0 OK
+    \retval -1 conversion error
+    \retval -2 buffer too small (truncated)
  */
 YAZ_EXPORT
 int cql_to_ccl_buf(struct cql_node *cn, char *out, int max);
  */
 YAZ_EXPORT
 int cql_to_ccl_buf(struct cql_node *cn, char *out, int max);
@@ -311,7 +324,7 @@ cql_transform_t cql_transform_open_fname(const char *fname);
 YAZ_EXPORT
 int cql_transform_define_pattern(cql_transform_t ct, const char *pattern,
                                  const char *value);
 YAZ_EXPORT
 int cql_transform_define_pattern(cql_transform_t ct, const char *pattern,
                                  const char *value);
-    
+
 
 
 /** \brief destroys a CQL transform handle
 
 
 /** \brief destroys a CQL transform handle
@@ -320,7 +333,7 @@ int cql_transform_define_pattern(cql_transform_t ct, const char *pattern,
 YAZ_EXPORT
 void cql_transform_close(cql_transform_t ct);
 
 YAZ_EXPORT
 void cql_transform_close(cql_transform_t ct);
 
-/** \brief tranforms PQF given a CQL tree
+/** \brief tranforms PQF given a CQL tree (NOT re-entrant)
     \param ct CQL transform handle
     \param cn CQL node tree
     \param pr print function
     \param ct CQL transform handle
     \param cn CQL node tree
     \param pr print function
@@ -336,7 +349,24 @@ int cql_transform(cql_transform_t ct,
                   void (*pr)(const char *buf, void *client_data),
                   void *client_data);
 
                   void (*pr)(const char *buf, void *client_data),
                   void *client_data);
 
-/** \brief transforms PQF given a CQL tree (from FILE)
+/** \brief tranforms PQF given a CQL tree (re-entrant)
+    \param ct CQL transform handle
+    \param cn CQL node tree
+    \param addinfo additional information (if error)
+    \param pr print function
+    \param client_data data to be passed to pr
+    \retval 0 success
+    \retval != 0 error code
+
+    The result is written to a user-defined stream.
+*/
+YAZ_EXPORT
+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);
+
+/** \brief transforms PQF given a CQL tree from FILE (not re-entrant)
     \param ct CQL transform handle
     \param cn CQL tree
     \param f FILE where output is written
     \param ct CQL transform handle
     \param cn CQL tree
     \param f FILE where output is written
@@ -350,7 +380,7 @@ YAZ_EXPORT
 int cql_transform_FILE(cql_transform_t ct,
                        struct cql_node *cn, FILE *f);
 
 int cql_transform_FILE(cql_transform_t ct,
                        struct cql_node *cn, FILE *f);
 
-/** \brief transforms PQF given a CQL tree (from FILE)
+/** \brief transforms PQF given a CQL tree from buffer (not re-entrant)
     \param ct CQL transform handle
     \param cn CQL tree
     \param out buffer for output
     \param ct CQL transform handle
     \param cn CQL tree
     \param out buffer for output
@@ -416,7 +446,7 @@ int cql_strncmp(const char *s1, const char *s2, size_t n);
     \param cn CQL tree
     \param pr print function
     \param client_data data to be passed to pr function
     \param cn CQL tree
     \param pr print function
     \param client_data data to be passed to pr function
-    
+
     This will take CQL_NODE_SORT entries and conver them to
 
     path,schema,ascending,caseSensitive,missingValue
     This will take CQL_NODE_SORT entries and conver them to
 
     path,schema,ascending,caseSensitive,missingValue
@@ -443,7 +473,7 @@ int cql_sortby_to_sortkeys(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);
 
-/** \brief converts CQL sortby to sortkeys .. 
+/** \brief converts CQL sortby to sortkeys ..
     \param cn CQL tree
     \param out result buffer
     \param max size of buffer (allocated)
     \param cn CQL tree
     \param out result buffer
     \param max size of buffer (allocated)