/*
* CCL - header file
*
- * $Id: ccl.h,v 1.24 2007-04-25 20:52:18 adam Exp $
+ * $Id: ccl.h,v 1.25 2007-04-26 09:11:56 adam Exp $
*
* Old Europagate Log:
*
YAZ_BEGIN_CDECL
-/* CCL error numbers */
#define CCL_ERR_OK 0
#define CCL_ERR_TERM_EXPECTED 1
#define CCL_ERR_RP_EXPECTED 2
#define CCL_ERR_TRUNC_NOT_BOTH 11
#define CCL_ERR_TRUNC_NOT_RIGHT 12
-/** attribute node (type, value) pair as used in RPN */
+/** \brief attribute node (type, value) pair as used in RPN */
struct ccl_rpn_attr {
- /** next node */
+ /** \brief next attribute */
struct ccl_rpn_attr *next;
- /** attribute set */
+ /** \brief attribute set */
char *set;
- /** attribute type, Bib-1: 1=use, 2=relation, 3=position, .. */
+ /** \brief attribute type, Bib-1: 1=use, 2=relation, 3=position, .. */
int type;
- /** attribute value type (numeric or string) */
+ /** \brief attribute value type (numeric or string) */
int kind;
#define CCL_RPN_ATTR_NUMERIC 1
#define CCL_RPN_ATTR_STRING 2
union {
- /** numeric attribute value */
+ /** \brief numeric attribute value */
int numeric;
- /** string attribute value */
+ /** \brief string attribute value */
char *str;
} value;
};
-#define CCL_RPN_AND 1
-#define CCL_RPN_OR 2
-#define CCL_RPN_NOT 3
-#define CCL_RPN_TERM 4
-#define CCL_RPN_SET 5
-#define CCL_RPN_PROX 6
+/** \brief node type or RPN tree generated by the CCL parser */
+enum ccl_rpn_kind {
+ CCL_RPN_AND,
+ CCL_RPN_OR,
+ CCL_RPN_NOT,
+ CCL_RPN_TERM,
+ CCL_RPN_SET,
+ CCL_RPN_PROX
+};
-/** RPN tree structure node */
+/** \brief RPN tree structure node */
struct ccl_rpn_node {
- /** RPN tree node type */
- int kind;
+ /** \brief node type, one of CCL_RPN_AND, CCL_RPN_OR,.. */
+ enum ccl_rpn_kind kind;
union {
- /** Boolean including proximity 0=left, 2=right, 3=prox parms */
+ /** \brief Boolean including proximity 0=left, 1=right, 2=prox parms */
struct ccl_rpn_node *p[3];
- /** Attributes + Term */
+ /** \brief Attributes + Term */
struct {
char *term;
struct ccl_rpn_attr *attr_list;
} u;
};
+/** \brief CCL bibset, AKA profile */
typedef struct ccl_qualifiers *CCL_bibset;
-/* use (1)
-
- relation (2)
- -1 none
- 0 ordered
- 1-6 relation (<, <=, =, >=, >, <>)
-
- position (3)
- -1 none
- 1 first in field
- 2 first in sub field
- 3 any position in field
- structure (4)
- -1 none
- 0 word/phrase auto select
- 1 phrase
- 2 word
- 3 key
- 4 year
- 5 date (normalized)
- 6 word list
- 100 date (un-normalized)
- 101 name (normalized)
- 102 name (un-normalized)
- truncation (5)
- completeness (6)
-*/
-
-#define CCL_BIB1_USE 1
-#define CCL_BIB1_REL 2
-#define CCL_BIB1_POS 3
-#define CCL_BIB1_STR 4
-#define CCL_BIB1_TRU 5
-#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)
-#define CCL_BIB1_TRU_CAN_BOTH (-3)
-#define CCL_BIB1_TRU_CAN_NONE (-4)
-
+/** \brief CCL parser */
typedef struct ccl_parser *CCL_parser;
/**
- * 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.
- */
+ \brief parse CCL find string using CCL profile return RPN tree
+
+ 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);
+struct ccl_rpn_node *ccl_find_str(CCL_bibset bibset,
+ const char *str, int *error, int *pos);
+
+/**
+ \brief parse CCL find string with parser and return RPN tree
+
+ 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_parser_find_str(CCL_parser cclp, const char *str);
/** Set names for AND operator in parser */
YAZ_EXPORT
-void ccl_parser_set_op_and (CCL_parser p, const char *op);
+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);
+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);
+void ccl_parser_set_op_not(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);
+void ccl_parser_set_op_set(CCL_parser p, const char *op);
/** Set case sensitivity for parser */
YAZ_EXPORT
-void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag);
+void ccl_parser_set_case(CCL_parser p, int case_sensitivity_flag);
/** Return english-readable error message for CCL parser error number */
YAZ_EXPORT
-const char *ccl_err_msg (int ccl_errno);
+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);
+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);
+void ccl_pr_tree(struct ccl_rpn_node *rpn, FILE *fd_out);
/** Add qualifier and supply attribute pairs for it */
YAZ_EXPORT
-void ccl_qual_add (CCL_bibset b, const char *name, int no, int *attr);
+void ccl_qual_add(CCL_bibset b, const char *name, int no, int *attr);
/** 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);
+void ccl_qual_add_set(CCL_bibset b, const char *name, int no,
+ int *type, int *value, char **svalue, char **attsets);
/** Add special qualifier */
YAZ_EXPORT
-void ccl_qual_add_special (CCL_bibset bibset, const char *n, const char *v);
+void ccl_qual_add_special(CCL_bibset bibset, const char *n, const char *v);
/** Add combo qualifier */
YAZ_EXPORT
-void ccl_qual_add_combi (CCL_bibset b, const char *n, const char *names);
+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);
+void ccl_qual_file(CCL_bibset bibset, FILE *inf);
/** Read CCL qualifier list spec from file inf */
YAZ_EXPORT
-int ccl_qual_fname (CCL_bibset bibset, const char *fname);
+int ccl_qual_fname(CCL_bibset bibset, const char *fname);
-/** Add CCL qualifier as buf spec (multiple lines). */
+/** Add CCL qualifier as buf spec(multiple lines). */
YAZ_EXPORT
void ccl_qual_buf(CCL_bibset bibset, const char *buf);
/* 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);
+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);
+CCL_bibset ccl_qual_mk(void);
/** Delete CCL qualifier set */
YAZ_EXPORT
-void ccl_qual_rm (CCL_bibset *b);
+void ccl_qual_rm(CCL_bibset *b);
/** Char-to-upper function */
-extern int (*ccl_toupper)(int c);
+extern int(*ccl_toupper)(int c);
/** CCL version of ccl_stricmp */
YAZ_EXPORT
-int ccl_stricmp (const char *s1, const char *s2);
+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);
+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,
+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 (CCL_bibset bibset);
+CCL_parser ccl_parser_create(CCL_bibset bibset);
/** 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);
+void ccl_parser_destroy(CCL_parser p);
/** Search for special qualifier */
YAZ_EXPORT
-const char *ccl_qual_search_special (CCL_bibset b, const char *name);
+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);
-
-YAZ_EXPORT
-CCL_bibset ccl_parser_get_bibset(CCL_parser cclp);
+void ccl_pquery(WRBUF w, struct ccl_rpn_node *p);
YAZ_EXPORT
int ccl_parser_get_error(CCL_parser cclp, int *pos);
#define ccl_assert(x) ;
#endif
+
+/** \brief common attributes
+
+ use (1)
+
+ relation (2)
+ -1 none
+ 0 ordered
+ 1-6 relation (<, <=, =, >=, >, <>)
+
+ position (3)
+ -1 none
+ 1 first in field
+ 2 first in sub field
+ 3 any position in field
+ structure (4)
+ -1 none
+ 0 word/phrase auto select
+ 1 phrase
+ 2 word
+ 3 key
+ 4 year
+ 5 date (normalized)
+ 6 word list
+ 100 date (un-normalized)
+ 101 name (normalized)
+ 102 name (un-normalized)
+ truncation (5)
+ completeness (6)
+*/
+
+#define CCL_BIB1_USE 1
+#define CCL_BIB1_REL 2
+#define CCL_BIB1_POS 3
+#define CCL_BIB1_STR 4
+#define CCL_BIB1_TRU 5
+#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)
+#define CCL_BIB1_TRU_CAN_BOTH (-3)
+#define CCL_BIB1_TRU_CAN_NONE (-4)
+
+
+
YAZ_END_CDECL
#endif
/* CCL - lexical analysis
* Europagate, 1995
*
- * $Id: ccltoken.c,v 1.10 2007-04-25 20:52:19 adam Exp $
+ * $Id: ccltoken.c,v 1.11 2007-04-26 09:11:56 adam Exp $
*
* Old Europagate Log:
*
* return: 1 if token string matches one of the keywords in list;
* 0 otherwise.
*/
-static int token_cmp (CCL_parser cclp, const char *kw, struct ccl_token *token)
+static int token_cmp(CCL_parser cclp, const char *kw, struct ccl_token *token)
{
const char *cp1 = kw;
const char *cp2;
case_sensitive = atoi(aliases);
if (!kw)
return 0;
- while ((cp2 = strchr (cp1, ' ')))
+ while ((cp2 = strchr(cp1, ' ')))
{
if (token->len == (size_t) (cp2-cp1))
{
if (case_sensitive)
{
- if (!memcmp (cp1, token->name, token->len))
+ if (!memcmp(cp1, token->name, token->len))
return 1;
}
else
{
- if (!ccl_memicmp (cp1, token->name, token->len))
+ if (!ccl_memicmp(cp1, token->name, token->len))
return 1;
}
}
}
if (case_sensitive)
return token->len == strlen(cp1)
- && !memcmp (cp1, token->name, token->len);
+ && !memcmp(cp1, token->name, token->len);
return token->len == strlen(cp1) &&
- !ccl_memicmp (cp1, token->name, token->len);
+ !ccl_memicmp(cp1, token->name, token->len);
}
/*
* ccl_tokenize: tokenize CCL command string.
* return: CCL token list.
*/
-struct ccl_token *ccl_parser_tokenize (CCL_parser cclp, const char *command)
+struct ccl_token *ccl_parser_tokenize(CCL_parser cclp, const char *command)
{
const char *aliases;
const unsigned char *cp = (const unsigned char *) command;
while (1)
{
const unsigned char *cp0 = cp;
- while (*cp && strchr (" \t\r\n", *cp))
+ while (*cp && strchr(" \t\r\n", *cp))
cp++;
if (!first)
{
- first = last = (struct ccl_token *)xmalloc (sizeof (*first));
- ccl_assert (first);
+ first = last = (struct ccl_token *)xmalloc(sizeof(*first));
+ ccl_assert(first);
last->prev = NULL;
}
else
{
- last->next = (struct ccl_token *)xmalloc (sizeof(*first));
- ccl_assert (last->next);
+ last->next = (struct ccl_token *)xmalloc(sizeof(*first));
+ ccl_assert(last->next);
last->next->prev = last;
last = last->next;
}
cp++;
break;
default:
- if (!strchr ("(),%!><= \t\n\r", cp[-1]))
+ if (!strchr("(),%!><= \t\n\r", cp[-1]))
{
- while (*cp && !strchr ("(),%!><= \t\n\r", *cp))
+ while (*cp && !strchr("(),%!><= \t\n\r", *cp))
{
cp++;
++ last->len;
aliases = ccl_qual_search_special(cclp->bibset, "and");
if (!aliases)
aliases = cclp->ccl_token_and;
- if (token_cmp (cclp, aliases, last))
+ if (token_cmp(cclp, aliases, last))
last->kind = CCL_TOK_AND;
aliases = ccl_qual_search_special(cclp->bibset, "or");
if (!aliases)
aliases = cclp->ccl_token_or;
- if (token_cmp (cclp, aliases, last))
+ if (token_cmp(cclp, aliases, last))
last->kind = CCL_TOK_OR;
aliases = ccl_qual_search_special(cclp->bibset, "not");
if (!aliases)
aliases = cclp->ccl_token_not;
- if (token_cmp (cclp, aliases, last))
+ if (token_cmp(cclp, aliases, last))
last->kind = CCL_TOK_NOT;
aliases = ccl_qual_search_special(cclp->bibset, "set");
if (!aliases)
aliases = cclp->ccl_token_set;
- if (token_cmp (cclp, aliases, last))
+ if (token_cmp(cclp, aliases, last))
last->kind = CCL_TOK_SET;
}
}
return first;
}
-struct ccl_token *ccl_token_add (struct ccl_token *at)
+struct ccl_token *ccl_token_add(struct ccl_token *at)
{
- struct ccl_token *n = (struct ccl_token *)xmalloc (sizeof(*n));
+ struct ccl_token *n = (struct ccl_token *)xmalloc(sizeof(*n));
ccl_assert(n);
n->next = at->next;
n->prev = at;
/*
* ccl_token_del: delete CCL tokens
*/
-void ccl_token_del (struct ccl_token *list)
+void ccl_token_del(struct ccl_token *list)
{
struct ccl_token *list1;
while (list)
{
list1 = list->next;
- xfree (list);
+ xfree(list);
list = list1;
}
}
-char *ccl_strdup (const char *str)
+CCL_parser ccl_parser_create(CCL_bibset bibset)
{
- int len = strlen(str);
- char *p = (char*) xmalloc (len+1);
- strcpy (p, str);
- return p;
-}
-
-CCL_parser ccl_parser_create (CCL_bibset bibset)
-{
- CCL_parser p = (CCL_parser)xmalloc (sizeof(*p));
+ CCL_parser p = (CCL_parser)xmalloc(sizeof(*p));
if (!p)
return p;
p->look_token = NULL;
p->error_pos = NULL;
p->bibset = bibset;
- p->ccl_token_and = ccl_strdup("and");
- p->ccl_token_or = ccl_strdup("or");
- p->ccl_token_not = ccl_strdup("not andnot");
- p->ccl_token_set = ccl_strdup("set");
+ p->ccl_token_and = xstrdup("and");
+ p->ccl_token_or = xstrdup("or");
+ p->ccl_token_not = xstrdup("not andnot");
+ p->ccl_token_set = xstrdup("set");
p->ccl_case_sensitive = 1;
return p;
}
-void ccl_parser_destroy (CCL_parser p)
+void ccl_parser_destroy(CCL_parser p)
{
if (!p)
return;
- xfree (p->ccl_token_and);
- xfree (p->ccl_token_or);
- xfree (p->ccl_token_not);
- xfree (p->ccl_token_set);
- xfree (p);
+ xfree(p->ccl_token_and);
+ xfree(p->ccl_token_or);
+ xfree(p->ccl_token_not);
+ xfree(p->ccl_token_set);
+ xfree(p);
}
-void ccl_parser_set_op_and (CCL_parser p, const char *op)
+void ccl_parser_set_op_and(CCL_parser p, const char *op)
{
if (p && op)
{
- if (p->ccl_token_and)
- xfree (p->ccl_token_and);
- p->ccl_token_and = ccl_strdup (op);
+ xfree(p->ccl_token_and);
+ p->ccl_token_and = xstrdup(op);
}
}
-void ccl_parser_set_op_or (CCL_parser p, const char *op)
+void ccl_parser_set_op_or(CCL_parser p, const char *op)
{
if (p && op)
{
- if (p->ccl_token_or)
- xfree (p->ccl_token_or);
- p->ccl_token_or = ccl_strdup (op);
+ xfree(p->ccl_token_or);
+ p->ccl_token_or = xstrdup(op);
}
}
-void ccl_parser_set_op_not (CCL_parser p, const char *op)
+void ccl_parser_set_op_not(CCL_parser p, const char *op)
{
if (p && op)
{
- if (p->ccl_token_not)
- xfree (p->ccl_token_not);
- p->ccl_token_not = ccl_strdup (op);
+ xfree(p->ccl_token_not);
+ p->ccl_token_not = xstrdup(op);
}
}
-void ccl_parser_set_op_set (CCL_parser p, const char *op)
+void ccl_parser_set_op_set(CCL_parser p, const char *op)
{
if (p && op)
{
- if (p->ccl_token_set)
- xfree (p->ccl_token_set);
- p->ccl_token_set = ccl_strdup (op);
+ xfree(p->ccl_token_set);
+ p->ccl_token_set = xstrdup(op);
}
}
-void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag)
+void ccl_parser_set_case(CCL_parser p, int case_sensitivity_flag)
{
if (p)
p->ccl_case_sensitive = case_sensitivity_flag;