From 44a221cc2f0f282514666d7b07d7b4e24870ee98 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 14 Feb 1995 13:16:29 +0000 Subject: [PATCH] Left and/or right truncation implemented. --- ccl/cclfind.c | 67 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/ccl/cclfind.c b/ccl/cclfind.c index 0d2c65f..148b002 100644 --- a/ccl/cclfind.c +++ b/ccl/cclfind.c @@ -2,7 +2,10 @@ * Europagate, 1995 * * $Log: cclfind.c,v $ - * Revision 1.3 1995/02/14 10:25:56 adam + * Revision 1.4 1995/02/14 13:16:29 adam + * Left and/or right truncation implemented. + * + * Revision 1.3 1995/02/14 10:25:56 adam * The constructions 'qualifier rel term ...' implemented. * * Revision 1.2 1995/02/13 15:15:07 adam @@ -28,12 +31,12 @@ static CCL_bibset bibset; #define ADVANCE look_token = look_token->next #define ADVX(x) x=(x)->next -static int *qual_val (struct ccl_rpn_attr *list, int type) +static struct ccl_rpn_attr *qual_val (struct ccl_rpn_attr *list, int type) { while (list) { if (list->type == type) - return &list->value; + return list; list = list->next; } return NULL; @@ -118,36 +121,58 @@ static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa) struct ccl_rpn_node *p; struct ccl_token *lookahead = look_token; int len = 0; - int no = 0; + int no, i; + int left_trunc = 0; + int right_trunc = 0; + int mid_trunc = 0; if (KIND != CCL_TOK_TERM) { ccl_error = CCL_ERR_TERM_EXPECTED; return NULL; } - while (lookahead->kind == CCL_TOK_TERM) + for (no = 0; lookahead->kind == CCL_TOK_TERM; no++) { - no++; - len += 1+lookahead->len; + for (i = 0; ilen; i++) + if (lookahead->name[i] == '?') + { + if (no == 0 && i == 0 && lookahead->len >= 1) + left_trunc = 1; + else if (lookahead->next->kind != CCL_TOK_TERM && + i == lookahead->len-1 && i >= 1) + right_trunc = 1; + else + mid_trunc = 1; + } + len += 1+lookahead->len; lookahead = lookahead->next; } p = mk_node (TERM); p->u.t.term = malloc (len); + assert (p->u.t.term); p->u.t.attr_list = NULL; p->u.t.term[0] = '\0'; - assert (p->u.t.term); - strxcat (p->u.t.term, look_token->name, look_token->len); - ADVANCE; - while (KIND == CCL_TOK_TERM) + for (i = 0; iu.t.term, " "); - strxcat (p->u.t.term, look_token->name, look_token->len); + const char *src_str = look_token->name; + int src_len = look_token->len; + + if (i == 0 && left_trunc) + { + src_len--; + src_str++; + } + else if (i == no-1 && right_trunc) + src_len--; + if (i) + strcat (p->u.t.term, " "); + strxcat (p->u.t.term, src_str, src_len); ADVANCE; } if (qa) { int i; - int *intp; + struct ccl_rpn_attr *attr; for (i=0; qa[i]; i++) { struct ccl_rpn_attr *attr; @@ -156,8 +181,8 @@ static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa) if (attr->value > 0) add_attr (p, attr->type, attr->value); } - if ((intp = qual_val (qa[0], CCL_BIB1_STR)) && - *intp == CCL_BIB1_STR_WP) + if ((attr = qual_val (qa[0], CCL_BIB1_STR)) && + attr->value == CCL_BIB1_STR_WP) { if (no == 1) add_attr (p, CCL_BIB1_STR, 2); @@ -165,6 +190,12 @@ static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa) add_attr (p, CCL_BIB1_STR, 1); } } + if (left_trunc && right_trunc) + add_attr (p, CCL_BIB1_TRU, 3); + else if (right_trunc) + add_attr (p, CCL_BIB1_TRU, 1); + else if (left_trunc) + add_attr (p, CCL_BIB1_TRU, 2); return p; } @@ -175,7 +206,7 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la, struct ccl_rpn_attr **ap; int no = 1; int i, rel; - int *intp; + struct ccl_rpn_attr *attr; if (qa) { @@ -200,7 +231,7 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la, ADVANCE; } ap[i] = NULL; - if (! (intp = qual_val (ap[0], CCL_BIB1_REL)) || *intp == 3) + if (! (attr = qual_val (ap[0], CCL_BIB1_REL)) || attr->value == 3) { /* unordered relation */ struct ccl_rpn_node *p; -- 1.7.10.4