* Europagate, 1995
*
* $Log: cclfind.c,v $
- * Revision 1.24 2001-03-22 21:23:30 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
* 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 completeness_value = -1;
int len = 0;
size_t max = 200;
- if (and_list || or_list)
+ if (and_list || or_list || !multi)
max = 1;
/* go through each TERM token. If no truncation attribute is yet
&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);
* Europagate 1995
*
* $Log: cclsh.c,v $
- * Revision 1.9 2001-05-16 07:30:16 adam
+ * Revision 1.10 2001-10-03 23:54:41 adam
+ * Fixes for numeric ranges (date=1980-1990).
+ *
+ * Revision 1.9 2001/05/16 07:30:16 adam
* Minor cosmetic changes that makes checker gcc happier.
*
* Revision 1.8 2001/03/18 20:45:39 ja7
for (i = 0; i<1; i++)
{
- rpn = ccl_find_str (bibset, buf, &error, &pos);
+ CCL_parser cclp = ccl_parser_create ();
+ struct ccl_token *list;
+ struct ccl_rpn_node *p;
+
+ cclp->bibset = bibset;
+
+ list = ccl_parser_tokenize (cclp, buf);
+ rpn = ccl_parser_find (cclp, list);
+
+ error = cclp->error_code;
+ if (error)
+ pos = cclp->error_pos - buf;
+
if (error)
{
printf ("%*s^ - ", 6+pos, " ");
printf ("\n");
}
}
+ if (debug)
+ {
+ struct ccl_token *lp;
+ for (lp = list; lp; lp = lp->next)
+ printf ("%d %.*s\n", lp->kind, lp->len, lp->name);
+ }
+ ccl_token_del (list);
+ ccl_parser_destroy (cclp);
if (rpn)
ccl_rpn_delete(rpn);
}
* Europagate, 1995
*
* $Log: ccltoken.c,v $
- * Revision 1.16 2001-03-07 13:24:40 adam
+ * Revision 1.17 2001-10-03 23:54:41 adam
+ * Fixes for numeric ranges (date=1980-1990).
+ *
+ * Revision 1.16 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.
*
cp++;
break;
default:
- while (*cp && !strchr ("(),%!><=- \t\n\r", *cp))
+ if (!strchr ("(),%!><=- \t\n\r", cp[-1]))
{
- cp++;
- ++ last->len;
+ while (*cp && !strchr ("(),%!><=- \t\n\r", *cp))
+ {
+ cp++;
+ ++ last->len;
+ }
}
last->kind = CCL_TOK_TERM;