Added CCL facility r=r "range" which is similar to r=o "ordered"
[yaz-moved-to-github.git] / include / yaz / ccl.h
index 53cd583..7724ace 100644 (file)
 /*
  * CCL - header file
  *
- * $Log: ccl.h,v $
- * Revision 1.4  2000-03-14 09:06:11  adam
- * Added POSIX threads support for frontend server.
+ * $Id: ccl.h,v 1.18 2004-09-29 20:37:50 adam Exp $
  *
- * Revision 1.3  2000/02/08 10:39:53  adam
- * Added a few functions to set name of operands, etc.
- *
- * Revision 1.2  2000/01/31 13:15:21  adam
- * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
- * that some characters are not surrounded by spaces in resulting term.
- * ILL-code updates.
- *
- * Revision 1.1  1999/11/30 13:47:11  adam
- * Improved installation. Moved header files to include/yaz.
- *
- * Revision 1.9  1998/02/11 11:53:33  adam
- * Changed code so that it compiles as C++.
- *
- * Revision 1.8  1997/09/29 09:01:19  adam
- * Changed CCL parser to be thread safe. New type, CCL-parser, declared
- * and a create/destructor ccl_parser_create/ccl_parser_destroy has been
- * added.
- *
- * Revision 1.7  1997/09/01 08:49:47  adam
- * New windows NT/95 port using MSV5.0. To export DLL functions the
- * YAZ_EXPORT modifier was added. Defined in yconfig.h.
- *
- * Revision 1.6  1997/05/14 06:53:37  adam
- * C++ support.
- *
- * Revision 1.5  1997/04/30 08:52:08  quinn
- * Null
- *
- * Revision 1.4  1996/10/11  15:02:26  adam
- * CCL parser from Europagate Email gateway 1.0.
+ * Old Europagate Log:
  *
  * Revision 1.10  1996/01/08  08:41:22  adam
  * Minor changes.
 #ifndef CCL_H
 #define CCL_H
 
+#include <yaz/yconfig.h>
 #include <stdio.h>
+#include <yaz/xmalloc.h>
+#include <yaz/wrbuf.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+YAZ_BEGIN_CDECL
     
 /* CCL error numbers */
 #define CCL_ERR_OK                0
@@ -141,8 +110,15 @@ extern "C" {
 /* attribute pair (type, value) */
 struct ccl_rpn_attr {
     struct ccl_rpn_attr *next;
+    char *set;
     int type;
-    int value;
+    int kind;
+#define CCL_RPN_ATTR_NUMERIC 1
+#define CCL_RPN_ATTR_STRING 2
+    union {
+       int numeric;
+       char *str;
+    } value;
 };
 
 #define CCL_RPN_AND 1
@@ -156,7 +132,7 @@ struct ccl_rpn_attr {
 struct ccl_rpn_node {
     int kind;
     union {
-       struct ccl_rpn_node *p[2];
+       struct ccl_rpn_node *p[3];
        struct {
            char *term;
            struct ccl_rpn_attr *attr_list;
@@ -203,7 +179,10 @@ typedef struct ccl_qualifiers *CCL_bibset;
 #define CCL_BIB1_COM 6
 
 #define CCL_BIB1_STR_WP (-1)
+#define CCL_BIB1_STR_AND_LIST (-2)
+#define CCL_BIB1_STR_OR_LIST (-3)
 #define CCL_BIB1_REL_ORDER (-1)
+#define CCL_BIB1_REL_PORDER (-2)
 
 #define CCL_BIB1_TRU_CAN_LEFT (-1)
 #define CCL_BIB1_TRU_CAN_RIGHT (-2)
@@ -221,8 +200,7 @@ typedef struct ccl_qualifiers *CCL_bibset;
 #define CCL_TOK_AND   8
 #define CCL_TOK_OR    9
 #define CCL_TOK_NOT   10
-#define CCL_TOK_MINUS 11
-#define CCL_TOK_SET   12
+#define CCL_TOK_SET   11
 
 /* CCL token */
 struct ccl_token {
@@ -236,6 +214,8 @@ struct ccl_token {
 /* CCL Qualifier */
 struct ccl_qualifier {
     char *name;
+    int no_sub;
+    struct ccl_qualifier **sub;
     struct ccl_rpn_attr *attr_list;
     struct ccl_qualifier *next;
 };
@@ -261,85 +241,115 @@ struct ccl_parser {
 typedef struct ccl_parser *CCL_parser;
     
 /* Generate tokens from command string - obeys all CCL opererators */
-struct ccl_token *ccl_parser_tokenize (CCL_parser cclp,
+YAZ_EXPORT struct ccl_token *ccl_parser_tokenize (CCL_parser cclp,
                                       const char *command);
-struct ccl_token *ccl_tokenize (const char *command);
+YAZ_EXPORT struct ccl_token *ccl_tokenize (const char *command);
     
 /* Generate tokens from command string - oebeys only simple tokens and 
    quoted strings */
-struct ccl_token *ccl_token_simple (const char *command);
+YAZ_EXPORT struct ccl_token *ccl_token_simple (const char *command);
 
 /* Delete token list */
-void ccl_token_del (struct ccl_token *list);
+YAZ_EXPORT void ccl_token_del (struct ccl_token *list);
+
+/* Add single token after node at */
+YAZ_EXPORT struct ccl_token *ccl_token_add (struct ccl_token *at);
 
 /* Parse CCL Find command - NULL-terminated string */
-struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset,
+YAZ_EXPORT struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset,
                                    const char *str, int *error, int *pos);
 
 /* Parse CCL Find command - Tokens read by ccl_tokenize */
-struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
+YAZ_EXPORT struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
                                int *error, const char **pos);
 
 /* Parse CCL Find command */
-struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list);
+YAZ_EXPORT struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list);
 
 /* Set various OPs */
-void ccl_parser_set_op_and (CCL_parser p, const char *op);
-void ccl_parser_set_op_or (CCL_parser p, const char *op);
-void ccl_parser_set_op_not (CCL_parser p, const char *op);
-void ccl_parser_set_op_set (CCL_parser p, const char *op);
+YAZ_EXPORT void ccl_parser_set_op_and (CCL_parser p, const char *op);
+YAZ_EXPORT void ccl_parser_set_op_or (CCL_parser p, const char *op);
+YAZ_EXPORT void ccl_parser_set_op_not (CCL_parser p, const char *op);
+YAZ_EXPORT void ccl_parser_set_op_set (CCL_parser p, const char *op);
 
-void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag);
+YAZ_EXPORT void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag);
 
 /* Return english-readable error message */
-const char *ccl_err_msg (int ccl_errno);
+YAZ_EXPORT const char *ccl_err_msg (int ccl_errno);
 
 /* Delete RPN tree returned by ccl_find */
-void ccl_rpn_delete (struct ccl_rpn_node *rpn);
+YAZ_EXPORT void ccl_rpn_delete (struct ccl_rpn_node *rpn);
 
 /* Dump RPN tree in readable format to fd_out */
-void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out);
+YAZ_EXPORT void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out);
 
 /* Add CCL qualifier */
-void ccl_qual_add (CCL_bibset b, const char *name, int no, int *attr);
+YAZ_EXPORT void ccl_qual_add (CCL_bibset b, const char *name, int no,
+                             int *attr);
+
+YAZ_EXPORT void ccl_qual_add_set (CCL_bibset b, const char *name, int no,
+                                 int *type, int *value, char **svalue,
+                                 char **attsets);
+
+YAZ_EXPORT void ccl_qual_add_special (CCL_bibset bibset,
+                                      const char *n, const char *v);
+
+YAZ_EXPORT void ccl_qual_add_combi (CCL_bibset b, const char *n,
+                                    const char *names);
+
+/* Read CCL qualifier list spec from file inf */
+YAZ_EXPORT void ccl_qual_file (CCL_bibset bibset, FILE *inf);
 
 /* Read CCL qualifier list spec from file inf */
-void ccl_qual_file (CCL_bibset bibset, FILE *inf);
+YAZ_EXPORT int ccl_qual_fname (CCL_bibset bibset, const char *fname);
 
-/* Add CCL qualifier by using single-line spec */
-void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name);
+/* Add CCL qualifier as buf spec (multiple lines). */
+YAZ_EXPORT void ccl_qual_buf(CCL_bibset bibset, const char *buf);
+
+/* Add CCL qualifier as line spec. Note: line is _modified_ */
+YAZ_EXPORT void ccl_qual_line(CCL_bibset bibset, char *line);
+
+/* Add CCL qualifier by using qual_name + value pair */
+YAZ_EXPORT void ccl_qual_fitem (CCL_bibset bibset, const char *value,
+                                const char *qual_name);
 
 /* Make CCL qualifier set */
-CCL_bibset ccl_qual_mk (void);
+YAZ_EXPORT CCL_bibset ccl_qual_mk (void);
 
 /* Delete CCL qualifier set */
-void ccl_qual_rm (CCL_bibset *b);
+YAZ_EXPORT void ccl_qual_rm (CCL_bibset *b);
 
 /* Char-to-upper function */
 extern int (*ccl_toupper)(int c);
 
 /* String utilities */
-int ccl_stricmp (const char *s1, const char *s2);
-int ccl_memicmp (const char *s1, const char *s2, size_t n);
+YAZ_EXPORT int ccl_stricmp (const char *s1, const char *s2);
+YAZ_EXPORT int ccl_memicmp (const char *s1, const char *s2, size_t n);
 
 /* Search for qualifier 'name' in set 'b'. */
-struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp, const char *name,
-                                      size_t len);
+YAZ_EXPORT struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp,
+                                                 const char *name,
+                                                 size_t len,
+                                                 int seq);
 
 /* Create CCL parser */
-CCL_parser ccl_parser_create (void);
+YAZ_EXPORT CCL_parser ccl_parser_create (void);
 
 /* Destroy CCL parser */
-void ccl_parser_destroy (CCL_parser p);
+YAZ_EXPORT void ccl_parser_destroy (CCL_parser p);
+
+YAZ_EXPORT char *ccl_strdup (const char *str);
 
+YAZ_EXPORT const char *ccl_qual_search_special (CCL_bibset b,
+                                               const char *name);
+
+YAZ_EXPORT void ccl_pquery (WRBUF w, struct ccl_rpn_node *p);
 
 #ifndef ccl_assert
 #define ccl_assert(x) ;
 #endif
 
-#ifdef __cplusplus
-}
-#endif
+YAZ_END_CDECL
 
 #endif