X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=a5da2449f25c068a629f4391a992e2d89337fe01;hb=bf1f271315a6acfd52d8d7abf1aee2e0502bdbf2;hp=c647c83a7a70f68037016a1d439c5df5a4bf0b76;hpb=3f05d9800b0d3b0acc2fcf9b90b71e630d09a90d;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index c647c83..a5da244 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,19 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.49 1996-06-04 10:18:11 adam + * Revision 1.53 1996-06-26 09:21:43 adam + * Bug fix: local attribute set wasn't obeyed in scan. + * + * Revision 1.52 1996/06/17 14:26:20 adam + * Function gen_regular_rel changed to handle negative numbers. + * + * Revision 1.51 1996/06/11 10:54:15 quinn + * Relevance work + * + * Revision 1.50 1996/06/07 08:51:53 adam + * Bug fix: Character mapping was broken (introducued by last revision). + * + * Revision 1.49 1996/06/04 10:18:11 adam * Search/scan uses character mapping module. * * Revision 1.48 1996/05/28 15:15:01 adam @@ -488,17 +500,25 @@ static RSET rset_trunc (ISAM isam, ISAM_P *isam_p, int no) return rset_trunc_r (isam, isam_p, 0, no, 100); } -struct grep_info { - ISAM_P *isam_p_buf; - int isam_p_size; - int isam_p_indx; -}; +#define TERM_COUNT + +struct grep_info { +#ifdef TERM_COUNT + int *term_no; +#endif + ISAM_P *isam_p_buf; + int isam_p_size; + int isam_p_indx; +}; static void add_isam_p (const char *info, struct grep_info *p) { if (p->isam_p_indx == p->isam_p_size) { ISAM_P *new_isam_p_buf; +#ifdef TERM_COUNT + int *new_term_no; +#endif p->isam_p_size = 2*p->isam_p_size + 100; new_isam_p_buf = xmalloc (sizeof(*new_isam_p_buf) * @@ -510,6 +530,18 @@ static void add_isam_p (const char *info, struct grep_info *p) xfree (p->isam_p_buf); } p->isam_p_buf = new_isam_p_buf; + +#ifdef TERM_COUNT + new_term_no = xmalloc (sizeof(*new_term_no) * + p->isam_p_size); + if (p->term_no) + { + memcpy (new_term_no, p->isam_p_buf, + p->isam_p_indx * sizeof(*p->term_no)); + xfree (p->term_no); + } + p->term_no = new_term_no; +#endif } assert (*info == sizeof(*p->isam_p_buf)); memcpy (p->isam_p_buf + p->isam_p_indx, info+1, sizeof(*p->isam_p_buf)); @@ -518,19 +550,45 @@ static void add_isam_p (const char *info, struct grep_info *p) static int grep_handle (char *name, const char *info, void *p) { - logf (LOG_DEBUG, "dict name: %s", name); add_isam_p (info, p); return 0; } +/* gen_regular_rel - generate regular expression from relation + * val: border value (inclusive) + * islt: 1 if <=; 0 if >=. + */ static void gen_regular_rel (char *dst, int val, int islt) { - int dst_p = 1; + int dst_p; int w, d, i; int pos = 0; char numstr[20]; - *dst = '('; + logf (LOG_DEBUG, "gen_regular_rel. val=%d, islt=%d", val, islt); + if (val >= 0) + { + if (islt) + strcpy (dst, "(-[0-9]+|"); + else + strcpy (dst, "("); + } + else + { + if (!islt) + { + strcpy (dst, "([0-9]+|-"); + dst_p = strlen (dst); + islt = 1; + } + else + { + strcpy (dst, "(-"); + islt = 0; + } + val = -val; + } + dst_p = strlen (dst); sprintf (numstr, "%d", val); for (w = strlen(numstr); --w >= 0; pos++) { @@ -863,13 +921,15 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, char termz[IT_MAX_WORD+1]; char term_sub[IT_MAX_WORD+1]; struct grep_info grep_info; - char *p0 = termz, *p1 = NULL; + char *p0 = termz; RSET result; + int term_index = 0; parms.key_size = sizeof(struct it_key); parms.max_rec = 100; parms.cmp = key_compare; parms.is = zi->wordIsam; + parms.no_terms = 0; if (zapt->term->which != Z_Term_general) { @@ -878,44 +938,58 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, } trans_term (zi, zapt, termz); +#ifdef TERM_COUNT + grep_info.term_no = 0; +#endif grep_info.isam_p_indx = 0; grep_info.isam_p_size = 0; grep_info.isam_p_buf = NULL; while (1) { char **map; - char *p2 = NULL; + char *p2, *p1; + p1 = p0; - while (*p1) + while (*(p0 = p1)) { map = map_chrs_input (&p1, strlen(p1)); - if (**map == *CHR_SPACE) + if (**map != *CHR_SPACE) break; - p2 = p1; } - if (p1 == p0) + if (!*p0) break; - memcpy (term_sub, p0, p2-p0); - term_sub[p2-p0] = '\0'; - while (*p1) + + p1 = p0; + while (*(p2 = p1)) { map = map_chrs_input (&p1, strlen(p1)); if (**map == *CHR_SPACE) break; } + if (p2 == p0) + break; + memcpy (term_sub, p0, p2-p0); + term_sub[p2-p0] = '\0'; + p0 = p2; if (field_term (zi, zapt, term_sub, 'w', attributeSet, &grep_info, num_bases, basenames)) return NULL; - if (!p1) - break; - p0 = p1; +#ifdef TERM_COUNT + for (; term_index < grep_info.isam_p_indx; term_index++) + grep_info.term_no[term_index] = parms.no_terms; + parms.no_terms++; +#endif } + parms.term_no = grep_info.term_no; parms.isam_positions = grep_info.isam_p_buf; parms.no_isam_positions = grep_info.isam_p_indx; if (grep_info.isam_p_indx > 0) result = rset_create (rset_kind_relevance, &parms); else result = rset_create (rset_kind_null, NULL); +#ifdef TERM_COUNT + xfree(grep_info.term_no); +#endif xfree (grep_info.isam_p_buf); return result; } @@ -937,6 +1011,9 @@ static RSET rpn_search_APT_cphrase (ZServerInfo *zi, } trans_term (zi, zapt, termz); +#ifdef TERM_COUNT + grep_info.term_no = 0; +#endif grep_info.isam_p_indx = 0; grep_info.isam_p_size = 0; grep_info.isam_p_buf = NULL; @@ -955,6 +1032,9 @@ static RSET rpn_search_APT_cphrase (ZServerInfo *zi, else result = rset_trunc (zi->wordIsam, grep_info.isam_p_buf, grep_info.isam_p_indx); +#ifdef TERM_COUNT + xfree(grep_info.term_no); +#endif xfree (grep_info.isam_p_buf); return result; } @@ -1052,7 +1132,7 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, { char termz[IT_MAX_WORD+1]; char term_sub[IT_MAX_WORD+1]; - char *p0 = termz, *p1 = NULL; + char *p0 = termz; RSET rset[60], result; int i, rset_no = 0; struct grep_info grep_info; @@ -1064,33 +1144,41 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, } trans_term (zi, zapt, termz); +#ifdef TERM_COUNT + grep_info.term_no = 0; +#endif grep_info.isam_p_size = 0; grep_info.isam_p_buf = NULL; while (1) { char **map; - char *p2 = NULL; + char *p2, *p1; + p1 = p0; - while (*p1) + while (*(p0 = p1)) { map = map_chrs_input (&p1, strlen(p1)); - if (**map == *CHR_SPACE) + if (**map != *CHR_SPACE) break; - p2 = p1; } - if (p1 == p0) + if (!*p0) break; - memcpy (term_sub, p0, p2-p0); - term_sub[p2-p0] = '\0'; - p0 = p1; - while (*p1) + + p1 = p0; + while (*(p2 = p1)) { map = map_chrs_input (&p1, strlen(p1)); - if (**map != *CHR_SPACE) + if (**map == *CHR_SPACE) break; - p0 = p1; } + if (p2 == p0) + break; + + memcpy (term_sub, p0, p2-p0); + term_sub[p2-p0] = '\0'; + p0 = p2; + grep_info.isam_p_indx = 0; if (field_term (zi, zapt, term_sub, 'w', attributeSet, &grep_info, num_bases, basenames)) @@ -1112,9 +1200,10 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, assert (rset[rset_no]); if (++rset_no >= sizeof(rset)/sizeof(*rset)) break; - if (!p1) - break; } +#ifdef TERM_COUNT + xfree(grep_info.term_no); +#endif xfree (grep_info.isam_p_buf); if (rset_no == 0) return rset_create (rset_kind_null, NULL); @@ -1474,17 +1563,17 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, logf (LOG_DEBUG, "scan, position = %d, num = %d", pos, num); + if (attributeset == VAL_NONE) + attributeset = VAL_BIB1; + attr_init (&use, zapt, 1); - use_value = attr_find (&use, NULL); + use_value = attr_find (&use, &attributeset); logf (LOG_DEBUG, "use value %d", use_value); attr_init (&completeness, zapt, 6); completeness_value = attr_find (&completeness, NULL); logf (LOG_DEBUG, "completeness value %d", completeness_value); - if (attributeset == VAL_NONE) - attributeset = VAL_BIB1; - if (use_value == -1) use_value = 1016; for (base_no = 0; base_no < num_bases && ord_no < 32; base_no++)