* Europagate, 1995
*
* $Log: cclfind.c,v $
- * Revision 1.19 2000-11-16 09:58:02 adam
+ * Revision 1.25 2001-10-03 23:54:41 adam
+ * Fixes for numeric ranges (date=1980-1990).
+ *
+ * Revision 1.24 2001/03/22 21:23:30 adam
+ * Directive s=pw sets structure to phrase if term includes blank(s).
+ *
+ * Revision 1.23 2001/03/20 11:22:58 adam
+ * CCL Truncation character may be defined.
+ *
+ * Revision 1.22 2001/03/07 13:24:40 adam
+ * Member and_not in Z_Operator is kept for backwards compatibility.
+ * Added support for definition of CCL operators in field spec file.
+ *
+ * Revision 1.21 2001/02/21 13:46:53 adam
+ * C++ fixes.
+ *
+ * Revision 1.20 2000/11/16 13:03:12 adam
+ * Function ccl_rpn_query sets attributeSet to Bib-1.
+ *
+ * Revision 1.19 2000/11/16 09:58:02 adam
* Implemented local AttributeSet setting for CCL field maps.
*
* Revision 1.18 2000/10/17 19:50:28 adam
ccl_assert (n);
if (set)
{
- n->set = malloc (strlen(set)+1);
+ n->set = (char*) malloc (strlen(set)+1);
strcpy (n->set, set);
}
else
* search_term: Parse CCL search term.
* cclp: CCL Parser
* qa: Qualifier attributes already applied.
+ * term_list: tokens we accept as terms in context
+ * multi: whether we accept "multiple" tokens
* return: pointer to node(s); NULL on error.
*/
static struct ccl_rpn_node *search_term_x (CCL_parser cclp,
struct ccl_rpn_attr **qa,
- int *term_list)
+ int *term_list, int multi)
{
struct ccl_rpn_attr *qa_tmp[2];
struct ccl_rpn_node *p_top = 0;
int and_list = 0;
int or_list = 0;
char *attset;
+ const char *truncation_aliases;
+
+ truncation_aliases =
+ ccl_qual_search_special(cclp->bibset, "truncation");
+ if (!truncation_aliases)
+ truncation_aliases = "?";
if (!qa)
{
{
struct ccl_rpn_node *p;
size_t no, i;
+ int no_spaces = 0;
int left_trunc = 0;
int right_trunc = 0;
int mid_trunc = 0;
int truncation_value = -1;
int completeness_value = -1;
int len = 0;
- int max = 200;
- if (and_list || or_list)
+ size_t max = 200;
+ if (and_list || or_list || !multi)
max = 1;
/* go through each TERM token. If no truncation attribute is yet
for (no = 0; no < max && is_term_ok(lookahead->kind, term_list); no++)
{
for (i = 0; i<lookahead->len; i++)
- if (truncation_value == -1 && lookahead->name[i] == '?')
+ if (lookahead->name[i] == ' ')
+ no_spaces++;
+ else if (strchr(truncation_aliases, lookahead->name[i]))
{
if (no == 0 && i == 0 && lookahead->len >= 1)
left_trunc = 1;
qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_WP, &attset))
{ /* no structure attribute met. Apply either structure attribute
WORD or PHRASE depending on number of CCL tokens */
- if (no == 1)
+ if (no == 1 && no_spaces == 0)
add_attr (p, attset, CCL_BIB1_STR, 2);
else
add_attr (p, attset, CCL_BIB1_STR, 1);
&attset))
add_attr (p, attset, CCL_BIB1_TRU, 100);
}
+ if (!multi)
+ break;
}
if (!p_top)
cclp->error_code = CCL_ERR_TERM_EXPECTED;
struct ccl_rpn_attr **qa)
{
static int list[] = {CCL_TOK_TERM, CCL_TOK_COMMA, -1};
- return search_term_x(cclp, qa, list);
+ return search_term_x(cclp, qa, list, 0);
}
/*
ADVANCE; /* skip relation */
if (KIND == CCL_TOK_TERM &&
- cclp->look_token->next->len == 1 &&
- cclp->look_token->next->name[0] == '-')
+ cclp->look_token->next && cclp->look_token->next->len == 1 &&
+ cclp->look_token->next->name[0] == '-')
{
struct ccl_rpn_node *p1;
if (!(p1 = search_term (cclp, ap)))
free (ap);
return NULL;
}
- ADVANCE; /* skip '-' */
+ ADVANCE; /* skip '-' */
if (KIND == CCL_TOK_TERM) /* = term - term ? */
{
struct ccl_rpn_node *p2;
static int list[] = {
CCL_TOK_TERM, CCL_TOK_COMMA,CCL_TOK_EQ, CCL_TOK_REL, -1};
struct ccl_rpn_node *p1, *p2, *pn;
- p1 = search_term_x (cclp, qa, list);
+ p1 = search_term_x (cclp, qa, list, 1);
if (!p1)
return NULL;
while (1)
if (KIND == CCL_TOK_PROX)
{
ADVANCE;
- p2 = search_term_x (cclp, qa, list);
+ p2 = search_term_x (cclp, qa, list, 1);
if (!p2)
{
ccl_rpn_delete (p1);
}
else if (is_term_ok(KIND, list))
{
- p2 = search_term_x (cclp, qa, list);
+ p2 = search_term_x (cclp, qa, list, 1);
if (!p2)
{
ccl_rpn_delete (p1);
{
struct ccl_rpn_node *p;
+
+
cclp->look_token = list;
p = find_spec (cclp, NULL);
if (p && KIND != CCL_TOK_EOL)