*
*/
+/** \file ccl.h
+ \brief Header with public definitions for CCL.
+*/
+
/*
* CCL - header file
*
- * $Log: ccl.h,v $
- * Revision 1.8 2000-11-16 09:58:02 adam
- * Implemented local AttributeSet setting for CCL field maps.
- *
- * Revision 1.7 2000/11/01 14:47:00 adam
- * Added CCL support for WIN32.
- *
- * Revision 1.6 2000/10/17 19:50:28 adam
- * Implemented and-list and or-list for CCL module.
- *
- * Revision 1.5 2000/05/02 17:19:58 adam
- * Removed MINUS token.
- *
- * Revision 1.4 2000/03/14 09:06:11 adam
- * Added POSIX threads support for frontend server.
- *
- * 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++.
+ * $Id: ccl.h,v 1.23 2005-06-25 15:46:01 adam Exp $
*
- * 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.
#include <yaz/yconfig.h>
#include <stdio.h>
+#include <yaz/xmalloc.h>
+#include <yaz/wrbuf.h>
YAZ_BEGIN_CDECL
#define CCL_ERR_TRUNC_NOT_BOTH 11
#define CCL_ERR_TRUNC_NOT_RIGHT 12
-/* attribute pair (type, value) */
+/** attribute node (type, value) pair as used in RPN */
struct ccl_rpn_attr {
+ /** next node */
struct ccl_rpn_attr *next;
+ /** attribute set */
char *set;
+ /** attribute type, Bib-1: 1=use, 2=relation, 3=position, .. */
int type;
- int value;
+ /** attribute value type (numeric or string) */
+ int kind;
+#define CCL_RPN_ATTR_NUMERIC 1
+#define CCL_RPN_ATTR_STRING 2
+ union {
+ /** numeric attribute value */
+ int numeric;
+ /** string attribute value */
+ char *str;
+ } value;
};
#define CCL_RPN_AND 1
#define CCL_RPN_SET 5
#define CCL_RPN_PROX 6
-/* RPN tree structure */
+/** RPN tree structure node */
struct ccl_rpn_node {
+ /** RPN tree node type */
int kind;
union {
- struct ccl_rpn_node *p[2];
- struct {
- char *term;
- struct ccl_rpn_attr *attr_list;
- } t;
- char *setname;
+ /** Boolean including proximity 0=left, 2=right, 3=prox parms */
+ struct ccl_rpn_node *p[3];
+ /** Attributes + Term */
+ struct {
+ char *term;
+ struct ccl_rpn_attr *attr_list;
+ } t;
+ /** Result set */
+ char *setname;
} u;
};
#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)
#define CCL_TOK_NOT 10
#define CCL_TOK_SET 11
-/* CCL token */
+/** CCL token */
struct ccl_token {
char kind;
- size_t len;
- const char *name;
+ size_t len; /* length of name below */
+ const char *name; /* string / name of token */
struct ccl_token *next;
struct ccl_token *prev;
+ const char *ws_prefix_buf; /* leading white space buf */
+ size_t ws_prefix_len; /* leading white space len */
};
-/* CCL Qualifier */
+/** CCL Qualifier */
struct ccl_qualifier {
char *name;
+ int no_sub;
+ struct ccl_qualifier **sub;
struct ccl_rpn_attr *attr_list;
struct ccl_qualifier *next;
};
+/** CCL parser structure */
struct ccl_parser {
-/* current lookahead token */
+ /** current lookahead token */
struct ccl_token *look_token;
-/* holds error code if error occur (and approx position of error) */
+ /** holds error code if error occur */
int error_code;
+ /** if error occurs, this holds position (starting from 0). */
const char *error_pos;
-/* current bibset */
+ /** current bibset */
CCL_bibset bibset;
+ /** names of and operator */
char *ccl_token_and;
+ /** names of or operator */
char *ccl_token_or;
+ /** names of not operator */
char *ccl_token_not;
+ /** names of set operator */
char *ccl_token_set;
+ /** 1=CCL parser is case sensitive, 0=case insensitive */
int ccl_case_sensitive;
};
typedef struct ccl_parser *CCL_parser;
-/* Generate tokens from command string - obeys all CCL opererators */
-YAZ_EXPORT struct ccl_token *ccl_parser_tokenize (CCL_parser cclp,
- const char *command);
-YAZ_EXPORT struct ccl_token *ccl_tokenize (const char *command);
+/**
+ * Splits CCL command string into individual tokens using
+ * a CCL parser.
+ */
+YAZ_EXPORT
+struct ccl_token *ccl_parser_tokenize (CCL_parser cclp, const char *command);
+
+/**
+ * Splits CCL command string into tokens using temporary parser.
+ *
+ * Use ccl_parser_tokenize instead and provide a parser - it is
+ * more flexible and efficient.
+ */
+YAZ_EXPORT
+struct ccl_token *ccl_tokenize (const char *command);
-/* Generate tokens from command string - oebeys only simple tokens and
- quoted strings */
-YAZ_EXPORT struct ccl_token *ccl_token_simple (const char *command);
+/**
+ * Deletes token list
+ */
+YAZ_EXPORT
+void ccl_token_del (struct ccl_token *list);
-/* Delete token list */
-YAZ_EXPORT void ccl_token_del (struct ccl_token *list);
+/**
+ * Add single token after a given onde.
+ */
+YAZ_EXPORT
+struct ccl_token *ccl_token_add (struct ccl_token *at);
-/* Parse CCL Find command - NULL-terminated string */
-YAZ_EXPORT struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset,
+/**
+ * Parses a CCL Find command in a simple C string. Returns CCL parse
+ * tree node describing RPN if parsing is successful. If parsing is
+ * unsuccesful, NULL is returned and error and pos is set accordingly.
+ */
+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 */
-YAZ_EXPORT struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
+/**
+ * Parses CCL Find command from a list of CCL tokens. Otherwise similar to
+ * ccl_find_str.
+ */
+YAZ_EXPORT
+struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
int *error, const char **pos);
-/* Parse CCL Find command */
-YAZ_EXPORT struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list);
+/**
+ * Parses a CCL Find command from a list of CCL tokens and given a CCL
+ * parser. Otherwise similar to ccl_find_str.
+ */
+YAZ_EXPORT
+struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list);
+
+/** Set names for AND operator in parser */
+YAZ_EXPORT
+void ccl_parser_set_op_and (CCL_parser p, const char *op);
+
+/** Set names for OR operator in parser */
+YAZ_EXPORT
+void ccl_parser_set_op_or (CCL_parser p, const char *op);
+
+/** Set names for ANDNOT operator in parser */
+YAZ_EXPORT
+void ccl_parser_set_op_not (CCL_parser p, const char *op);
-/* Set various OPs */
-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);
+/** Set names for ResultSet in parser */
+YAZ_EXPORT
+void ccl_parser_set_op_set (CCL_parser p, const char *op);
-YAZ_EXPORT void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag);
+/** Set case sensitivity for parser */
+YAZ_EXPORT
+void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag);
-/* Return english-readable error message */
-YAZ_EXPORT const char *ccl_err_msg (int ccl_errno);
+/** Return english-readable error message for CCL parser error number */
+YAZ_EXPORT
+const char *ccl_err_msg (int ccl_errno);
-/* Delete RPN tree returned by ccl_find */
-YAZ_EXPORT void ccl_rpn_delete (struct ccl_rpn_node *rpn);
+/** Delete RPN tree returned by ccl_find */
+YAZ_EXPORT
+void ccl_rpn_delete (struct ccl_rpn_node *rpn);
-/* Dump RPN tree in readable format to fd_out */
-YAZ_EXPORT void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out);
+/** Dump RPN tree in readable format to fd_out */
+YAZ_EXPORT
+void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out);
-/* Add CCL qualifier */
-YAZ_EXPORT void ccl_qual_add (CCL_bibset b, const char *name, int no,
- int *attr);
+/** Add qualifier and supply attribute pairs for it */
+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 *attr, char **attsets);
+/** Add qualifier and supply attributes pairs+attribute set for it */
+YAZ_EXPORT
+void ccl_qual_add_set (CCL_bibset b, const char *name, int no,
+ int *type, int *value, char **svalue, char **attsets);
-/* Read CCL qualifier list spec from file inf */
-YAZ_EXPORT void ccl_qual_file (CCL_bibset bibset, FILE *inf);
+/** Add special qualifier */
+YAZ_EXPORT
+void ccl_qual_add_special (CCL_bibset bibset, const char *n, const char *v);
-/* Read CCL qualifier list spec from file inf */
-YAZ_EXPORT int ccl_qual_fname (CCL_bibset bibset, const char *fname);
+/** Add combo qualifier */
+YAZ_EXPORT
+void ccl_qual_add_combi (CCL_bibset b, const char *n, const char *names);
-/* Add CCL qualifier by using single-line spec */
-YAZ_EXPORT void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name);
+/** Read CCL qualifier list spec from file inf */
+YAZ_EXPORT
+void ccl_qual_file (CCL_bibset bibset, FILE *inf);
-/* Make CCL qualifier set */
-YAZ_EXPORT CCL_bibset ccl_qual_mk (void);
+/** Read CCL qualifier list spec from file inf */
+YAZ_EXPORT
+int ccl_qual_fname (CCL_bibset bibset, const char *fname);
-/* Delete CCL qualifier set */
-YAZ_EXPORT void ccl_qual_rm (CCL_bibset *b);
+/** Add CCL qualifier as buf spec (multiple lines). */
+YAZ_EXPORT
+void ccl_qual_buf(CCL_bibset bibset, const char *buf);
-/* Char-to-upper function */
+/** 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 */
+YAZ_EXPORT
+CCL_bibset ccl_qual_mk (void);
+
+/** Delete CCL qualifier set */
+YAZ_EXPORT
+void ccl_qual_rm (CCL_bibset *b);
+
+/** Char-to-upper function */
extern int (*ccl_toupper)(int c);
-/* String utilities */
-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);
+/** CCL version of ccl_stricmp */
+YAZ_EXPORT
+int ccl_stricmp (const char *s1, const char *s2);
+
+/** CCL version of ccl_memicmp */
+YAZ_EXPORT
+int ccl_memicmp (const char *s1, const char *s2, size_t n);
-/* Search for qualifier 'name' in set 'b'. */
-YAZ_EXPORT struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp, const char *name,
- size_t len);
+/** Search for qualifier 'name' in set 'b'. */
+YAZ_EXPORT
+struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp, const char *name,
+ size_t len, int seq);
-/* Create CCL parser */
-YAZ_EXPORT CCL_parser ccl_parser_create (void);
+/** Create CCL parser */
+YAZ_EXPORT
+CCL_parser ccl_parser_create (void);
-/* Destroy CCL parser */
-YAZ_EXPORT void ccl_parser_destroy (CCL_parser p);
+/** Destroy CCL parser */
+YAZ_EXPORT
+void ccl_parser_destroy (CCL_parser p);
+/** String dup utility (ala strdup) */
+YAZ_EXPORT
+char *ccl_strdup (const char *str);
+
+/** Search for special qualifier */
+YAZ_EXPORT
+const char *ccl_qual_search_special (CCL_bibset b,
+ const char *name);
+/** Pretty-print CCL RPN node tree to WRBUF */
+YAZ_EXPORT
+void ccl_pquery (WRBUF w, struct ccl_rpn_node *p);
#ifndef ccl_assert
#define ccl_assert(x) ;
#endif
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+