+
+char *ccl_strdup (const char *str)
+{
+ int len = strlen(str);
+ char *p = (char*) malloc (len+1);
+ strcpy (p, str);
+ return p;
+}
+
+CCL_parser ccl_parser_create (void)
+{
+ CCL_parser p = (CCL_parser)malloc (sizeof(*p));
+ if (!p)
+ return p;
+ p->look_token = NULL;
+ p->error_code = 0;
+ p->error_pos = NULL;
+ p->bibset = NULL;
+
+ 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_case_sensitive = 1;
+
+ return p;
+}
+
+void ccl_parser_destroy (CCL_parser p)
+{
+ if (!p)
+ return;
+ free (p->ccl_token_and);
+ free (p->ccl_token_or);
+ free (p->ccl_token_not);
+ free (p->ccl_token_set);
+ free (p);
+}
+
+void ccl_parser_set_op_and (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_and)
+ free (p->ccl_token_and);
+ p->ccl_token_and = ccl_strdup (op);
+ }
+}
+
+void ccl_parser_set_op_or (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_or)
+ free (p->ccl_token_or);
+ p->ccl_token_or = ccl_strdup (op);
+ }
+}
+void ccl_parser_set_op_not (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_not)
+ free (p->ccl_token_not);
+ p->ccl_token_not = ccl_strdup (op);
+ }
+}
+void ccl_parser_set_op_set (CCL_parser p, const char *op)
+{
+ if (p && op)
+ {
+ if (p->ccl_token_set)
+ free (p->ccl_token_set);
+ p->ccl_token_set = ccl_strdup (op);
+ }
+}
+
+void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag)
+{
+ if (p)
+ p->ccl_case_sensitive = case_sensitivity_flag;
+}