X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=812d78fb9e008957659fc21ee6b1a065019a4dd1;hb=87515c8d89b4b0e3ceadac4bded487efa099a94e;hp=9dd7d2de026f83eb775c094410776d4055689682;hpb=e19bd45069a282b054015f9cf88e109968b9fa7f;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index 9dd7d2d..812d78f 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,10 +1,53 @@ /* - * Copyright (C) 1995-1998, Index Data + * Copyright (C) 1995-2000, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.90 1998-11-16 16:03:43 adam + * Revision 1.104 2000-04-05 09:49:35 adam + * On Unix, zebra/z'mbol uses automake. + * + * Revision 1.103 2000/03/20 19:08:36 adam + * Added remote record import using Z39.50 extended services and Segment + * Requests. + * + * Revision 1.102 2000/03/15 15:00:31 adam + * First work on threaded version. + * + * Revision 1.101 2000/03/02 14:35:03 adam + * Fixed proximity handling. + * + * Revision 1.100 1999/12/28 15:48:12 adam + * Minor Fix. + * + * Revision 1.99 1999/12/23 09:03:32 adam + * Changed behaviour of trunc=105 so that * is regular .* and ! is regular . + * + * Revision 1.98 1999/11/30 13:48:04 adam + * Improved installation. Updated for inclusion of YAZ header files. + * + * Revision 1.97 1999/10/14 14:33:50 adam + * Added truncation 5=106. + * + * Revision 1.96 1999/09/23 10:05:05 adam + * Implemented structure=105 searching. + * + * Revision 1.95 1999/09/07 07:19:21 adam + * Work on character mapping. Implemented replace rules. + * + * Revision 1.94 1999/07/20 13:59:18 adam + * Fixed bug that occurred when phrases had 0 hits. + * + * Revision 1.93 1999/06/17 14:38:40 adam + * Bug fix: Scan SEGV'ed when getting unknown use attribute. + * + * Revision 1.92 1999/05/26 07:49:13 adam + * C++ compilation. + * + * Revision 1.91 1999/02/02 14:51:13 adam + * Updated WIN32 code specific sections. Changed header. + * + * Revision 1.90 1998/11/16 16:03:43 adam * Moved loggin utilities to Yaz. Was implemented in file zlogs.c. * * Revision 1.89 1998/11/16 10:11:55 adam @@ -316,7 +359,7 @@ */ #include #include -#ifdef WINDOWS +#ifdef WIN32 #include #else #include @@ -337,16 +380,16 @@ struct rpn_char_map_info { static const char **rpn_char_map_handler (void *vp, const char **from, int len) { - struct rpn_char_map_info *p = vp; + struct rpn_char_map_info *p = (struct rpn_char_map_info *) vp; return zebra_maps_input (p->zm, p->reg_type, from, len); } static void rpn_char_map_prepare (ZebraHandle zh, int reg_type, struct rpn_char_map_info *map_info) { - map_info->zm = zh->zebra_maps; + map_info->zm = zh->service->zebra_maps; map_info->reg_type = reg_type; - dict_grep_cmap (zh->dict, map_info, rpn_char_map_handler); + dict_grep_cmap (zh->service->dict, map_info, rpn_char_map_handler); } typedef struct { @@ -427,7 +470,7 @@ struct grep_info { #ifdef TERM_COUNT int *term_no; #endif - ISAM_P *isam_p_buf; + ISAMS_P *isam_p_buf; int isam_p_size; int isam_p_indx; ZebraHandle zh; @@ -439,9 +482,13 @@ static void term_untrans (ZebraHandle zh, int reg_type, { while (*src) { - const char *cp = zebra_maps_output (zh->zebra_maps, reg_type, &src); - while (*cp) - *dst++ = *cp++; + const char *cp = zebra_maps_output (zh->service->zebra_maps, + reg_type, &src); + if (!cp) + *dst++ = *src++; + else + while (*cp) + *dst++ = *cp++; } *dst = '\0'; } @@ -451,13 +498,13 @@ static void add_isam_p (const char *name, const char *info, { if (p->isam_p_indx == p->isam_p_size) { - ISAM_P *new_isam_p_buf; + ISAMS_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) * - p->isam_p_size); + new_isam_p_buf = (ISAMS_P *) xmalloc (sizeof(*new_isam_p_buf) * + p->isam_p_size); if (p->isam_p_buf) { memcpy (new_isam_p_buf, p->isam_p_buf, @@ -467,8 +514,8 @@ static void add_isam_p (const char *name, const char *info, p->isam_p_buf = new_isam_p_buf; #ifdef TERM_COUNT - new_term_no = xmalloc (sizeof(*new_term_no) * - p->isam_p_size); + new_term_no = (int *) xmalloc (sizeof(*new_term_no) * + p->isam_p_size); if (p->term_no) { memcpy (new_term_no, p->isam_p_buf, @@ -490,7 +537,7 @@ static void add_isam_p (const char *name, const char *info, static int grep_handle (char *name, const char *info, void *p) { - add_isam_p (name, info, p); + add_isam_p (name, info, (struct grep_info *) p); return 0; } @@ -517,6 +564,7 @@ static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, return *s0; } +/* term_100: handle term, where trunc=none (no operators at all) */ static int term_100 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) @@ -549,6 +597,7 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, return i; } +/* term_101: handle term, where trunc=Process # */ static int term_101 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) @@ -590,7 +639,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, return i; } - +/* term_103: handle term, where trunc=re-2 (regular expressions) */ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int *errors, int space_split, char *dst_term) @@ -639,6 +688,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, return i; } +/* term_103: handle term, where trunc=re-1 (regular expressions) */ static int term_102 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term) { @@ -646,6 +696,106 @@ static int term_102 (ZebraMaps zebra_maps, int reg_type, const char **src, dst_term); } + +/* term_104: handle term, where trunc=Process # and ! */ +static int term_104 (ZebraMaps zebra_maps, int reg_type, + const char **src, char *dst, int space_split, + char *dst_term) +{ + const char *s0, *s1; + const char **map; + int i = 0; + int j = 0; + + if (!term_pre (zebra_maps, reg_type, src, "#!", "#!")) + return 0; + s0 = *src; + while (*s0) + { + if (*s0 == '#') + { + dst[i++] = '.'; + dst[i++] = '*'; + dst_term[j++] = *s0++; + } + else if (*s0 == '!') + { + dst[i++] = '.'; + dst_term[j++] = *s0++; + } + { + s1 = s0; + map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + if (space_split && **map == *CHR_SPACE) + break; + while (s1 < s0) + { + if (!isalnum (*s1)) + dst[i++] = '\\'; + dst_term[j++] = *s1; + dst[i++] = *s1++; + } + } + } + dst[i] = '\0'; + dst_term[j++] = '\0'; + *src = s0; + return i; +} + +/* term_105/106: handle term, where trunc=Process * and ! and right trunc */ +static int term_105 (ZebraMaps zebra_maps, int reg_type, + const char **src, char *dst, int space_split, + char *dst_term, int right_truncate) +{ + const char *s0, *s1; + const char **map; + int i = 0; + int j = 0; + + if (!term_pre (zebra_maps, reg_type, src, "*!", "*!")) + return 0; + s0 = *src; + while (*s0) + { + if (*s0 == '*') + { + dst[i++] = '.'; + dst[i++] = '*'; + dst_term[j++] = *s0++; + } + else if (*s0 == '!') + { + dst[i++] = '.'; + dst_term[j++] = *s0++; + } + { + s1 = s0; + map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); + if (space_split && **map == *CHR_SPACE) + break; + while (s1 < s0) + { + if (!isalnum (*s1)) + dst[i++] = '\\'; + dst_term[j++] = *s1; + dst[i++] = *s1++; + } + } + } + if (right_truncate) + { + dst[i++] = '.'; + dst[i++] = '*'; + } + dst[i] = '\0'; + + dst_term[j++] = '\0'; + *src = s0; + return i; +} + + /* gen_regular_rel - generate regular expression from relation * val: border value (inclusive) * islt: 1 if <=; 0 if >=. @@ -743,11 +893,14 @@ static void gen_regular_rel (char *dst, int val, int islt) dst[dst_p] = '\0'; if (islt) { - for (i=1; izebra_maps, reg_type, term_sub, term_component, + if (!term_100 (zh->service->zebra_maps, reg_type, + term_sub, term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation <"); @@ -819,7 +973,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp = '\0'; break; case 2: - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, + if (!term_100 (zh->service->zebra_maps, reg_type, + term_sub, term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation <="); @@ -849,8 +1004,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp = '\0'; break; case 5: - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, - space_split, term_dst)) + if (!term_100 (zh->service->zebra_maps, reg_type, + term_sub, term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation >"); @@ -881,8 +1036,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp = '\0'; break; case 4: - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, - space_split, term_dst)) + if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, + term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation >="); @@ -918,8 +1073,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, case 3: default: logf (LOG_DEBUG, "Relation ="); - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, - space_split, term_dst)) + if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, + term_component, space_split, term_dst)) return 0; strcat (term_tmp, "("); strcat (term_tmp, term_component); @@ -991,7 +1146,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } return -1; } - if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) + if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no])) { zh->errCode = 109; /* Database unavailable */ zh->errString = basenames[base_no]; @@ -1004,7 +1159,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, char ord_buf[32]; int i, ord_len; - ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal, + ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal, local_attr->local); if (ord < 0) continue; @@ -1043,59 +1198,59 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, reg_type, space_split, term_dst)) return 0; logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict+prefix_len); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, &max_pos, - 0, grep_handle); + r = dict_lookup_grep (zh->service->dict, term_dict, 0, + grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); break; case 1: /* right truncation */ term_dict[j++] = '('; - if (!term_100 (zh->zebra_maps, reg_type, + if (!term_100 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ".*)"); - dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); break; case 2: /* keft truncation */ term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; - if (!term_100 (zh->zebra_maps, reg_type, + if (!term_100 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); break; case 3: /* left&right truncation */ term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; - if (!term_100 (zh->zebra_maps, reg_type, + if (!term_100 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ".*)"); - dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); break; zh->errCode = 120; return -1; case 101: /* process # in term */ term_dict[j++] = '('; - if (!term_101 (zh->zebra_maps, reg_type, + if (!term_101 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d", r); break; case 102: /* Regexp-1 */ term_dict[j++] = '('; - if (!term_102 (zh->zebra_maps, reg_type, + if (!term_102 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); logf (LOG_DEBUG, "Regexp-1 tolerance=%d", r); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d", @@ -1104,17 +1259,50 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, case 103: /* Regexp-2 */ r = 1; term_dict[j++] = '('; - if (!term_103 (zh->zebra_maps, reg_type, + if (!term_103 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, &r, space_split, term_dst)) return 0; strcat (term_dict, ")"); logf (LOG_DEBUG, "Regexp-2 tolerance=%d", r); - r = dict_lookup_grep (zh->dict, term_dict, r, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, r, grep_info, &max_pos, 2, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d", r); break; + case 104: /* process # and ! in term */ + term_dict[j++] = '('; + if (!term_104 (zh->service->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=#/!: %d", r); + break; + case 105: /* process * and ! in term */ + term_dict[j++] = '('; + if (!term_105 (zh->service->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst, 1)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); + break; + case 106: /* process * and ! in term */ + term_dict[j++] = '('; + if (!term_105 (zh->service->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst, 0)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); + break; } } *term_sub = termp; @@ -1149,7 +1337,7 @@ static void trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, while ((len = (cp_end - cp)) > 0) { - map = zebra_maps_input (zh->zebra_maps, reg_type, &cp, len); + map = zebra_maps_input (zh->service->zebra_maps, reg_type, &cp, len); if (**map == *CHR_SPACE) space_map = *map; else @@ -1165,99 +1353,8 @@ static void trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, termz[i] = '\0'; } -static RSET rpn_proximity (ZebraHandle zh, RSET rset1, RSET rset2, - int ordered, - int exclusion, int relation, int distance) -{ - int i; - RSFD rsfd1, rsfd2; - int more1, more2; - struct it_key buf1, buf2; - RSFD rsfd_result; - RSET result; - rset_temp_parms parms; - int term_index; - - rsfd1 = rset_open (rset1, RSETF_READ); - more1 = rset_read (rset1, rsfd1, &buf1, &term_index); - - rsfd2 = rset_open (rset2, RSETF_READ); - more2 = rset_read (rset2, rsfd2, &buf2, &term_index); - - parms.key_size = sizeof (struct it_key); - parms.temp_path = res_get (zh->res, "setTmpDir"); - result = rset_create (rset_kind_temp, &parms); - rsfd_result = rset_open (result, RSETF_WRITE); - - logf (LOG_DEBUG, "rpn_proximity excl=%d ord=%d rel=%d dis=%d", - exclusion, ordered, relation, distance); - while (more1 && more2) - { - int cmp = key_compare_it (&buf1, &buf2); - if (cmp < -1) - more1 = rset_read (rset1, rsfd1, &buf1, &term_index); - else if (cmp > 1) - more2 = rset_read (rset2, rsfd2, &buf2, &term_index); - else - { - int sysno = buf1.sysno; - int seqno[500]; - int n = 0; - - seqno[n++] = buf1.seqno; - while ((more1 = rset_read (rset1, rsfd1, &buf1, &term_index)) && - sysno == buf1.sysno) - if (n < 500) - seqno[n++] = buf1.seqno; - do - { - for (i = 0; i= */ - if (diff >= distance) - excl = !excl; - break; - case 5: /* > */ - if (diff > distance) - excl = !excl; - break; - case 6: /* != */ - if (diff != distance) - excl = !excl; - break; - } - if (excl) - rset_write (result, rsfd_result, &buf2); - } - } while ((more2 = rset_read (rset2, rsfd2, &buf2, &term_index)) && - sysno == buf2.sysno); - } - } - rset_close (result, rsfd_result); - rset_close (rset1, rsfd1); - rset_close (rset2, rsfd2); - return result; -} - -static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) +static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, + int ordered, int exclusion, int relation, int distance) { int i; RSFD *rsfd; @@ -1270,54 +1367,64 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) int term_index; const char *flags = NULL; - rsfd = xmalloc (sizeof(*rsfd)*rset_no); - more = xmalloc (sizeof(*more)*rset_no); - buf = xmalloc (sizeof(*buf)*rset_no); + rsfd = (RSFD *) xmalloc (sizeof(*rsfd)*rset_no); + more = (int *) xmalloc (sizeof(*more)*rset_no); + buf = (struct it_key **) xmalloc (sizeof(*buf)*rset_no); + *prox_term = '\0'; for (i = 0; ino_rset_terms; j++) { const char *nflags = rset[i]->rset_terms[j]->flags; char *term = rset[i]->rset_terms[j]->name; int lterm = strlen(term); - if (length_prox_term) - prox_term[length_prox_term++] = ' '; - strcpy (prox_term + length_prox_term, term); - length_prox_term += lterm; + if (lterm + length_prox_term < sizeof(prox_term)-1) + { + if (length_prox_term) + prox_term[length_prox_term++] = ' '; + strcpy (prox_term + length_prox_term, term); + length_prox_term += lterm; + } if (min_nn > rset[i]->rset_terms[j]->nn) min_nn = rset[i]->rset_terms[j]->nn; flags = nflags; } } + for (i = 0; i= 0) - { - rset_close (rset[i], rsfd[i]); - xfree (buf[i]); - --i; - } - parms.rset_term = rset_term_create (prox_term, -1, flags); + + parms.rset_term = rset_term_create (prox_term, length_prox_term, + flags); parms.rset_term->nn = 0; result = rset_create (rset_kind_null, &parms); } - else + else if (ordered && relation == 3 && exclusion == 0 && distance == 1) { + /* special proximity case = phrase search ... */ rset_temp_parms parms; RSFD rsfd_result; - parms.rset_term = rset_term_create (prox_term, -1, flags); + parms.rset_term = rset_term_create (prox_term, length_prox_term, + flags); parms.rset_term->nn = min_nn; parms.key_size = sizeof (struct it_key); - parms.temp_path = res_get (zh->res, "setTmpDir"); + parms.temp_path = res_get (zh->service->res, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); rsfd_result = rset_open (result, RSETF_WRITE); @@ -1361,23 +1468,160 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) more[0] = rset_read (*rset, *rsfd, *buf, &term_index); } } - - for (i = 0; inn = min_nn; + parms.key_size = sizeof (struct it_key); + parms.temp_path = res_get (zh->service->res, "setTmpDir"); + result = rset_create (rset_kind_temp, &parms); + rsfd_result = rset_open (result, RSETF_WRITE); + + while (more[0] && more[1]) { - rset_close (rset[i], rsfd[i]); - xfree (buf[i]); + int cmp = key_compare_it (buf[0], buf[1]); + if (cmp < -1) + more[0] = rset_read (rset[0], rsfd[0], buf[0], &term_index); + else if (cmp > 1) + more[1] = rset_read (rset[1], rsfd[1], buf[1], &term_index); + else + { + int sysno = buf[0]->sysno; + int seqno[500]; + int n = 0; + + seqno[n++] = buf[0]->seqno; + while ((more[0] = rset_read (rset[0], rsfd[0], buf[0], + &term_index)) && + sysno == buf[0]->sysno) + if (n < 500) + seqno[n++] = buf[0]->seqno; + do + { + for (i = 0; iseqno - seqno[i]; + int excl = exclusion; + if (!ordered && diff < 0) + diff = -diff; + switch (relation) + { + case 1: /* < */ + if (diff < distance && diff >= 0) + excl = !excl; + break; + case 2: /* <= */ + if (diff <= distance && diff >= 0) + excl = !excl; + break; + case 3: /* == */ + if (diff == distance && diff >= 0) + excl = !excl; + break; + case 4: /* >= */ + if (diff >= distance && diff >= 0) + excl = !excl; + break; + case 5: /* > */ + if (diff > distance && diff >= 0) + excl = !excl; + break; + case 6: /* != */ + if (diff != distance && diff >= 0) + excl = !excl; + break; + } + if (excl) + { + rset_write (result, rsfd_result, buf[1]); + break; + } + } + } while ((more[1] = rset_read (rset[1], rsfd[1], buf[1], + &term_index)) && + sysno == buf[1]->sysno); + } } rset_close (result, rsfd_result); } + else + { + rset_null_parms parms; + + parms.rset_term = rset_term_create (prox_term, length_prox_term, + flags); + parms.rset_term->nn = 0; + result = rset_create (rset_kind_null, &parms); + } + for (i = 0; iservice->zebra_maps, reg_id, ex_list, + termz, strlen(termz)); + if (!wrbuf) + return nmem_strdup(stream, termz); + else + { + char *buf = (char*) nmem_malloc (stream, wrbuf_len(wrbuf)+1); + memcpy (buf, wrbuf_buf(wrbuf), wrbuf_len(wrbuf)); + buf[wrbuf_len(wrbuf)] = '\0'; + return buf; + } +} + static RSET rpn_search_APT_phrase (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, + const char *termz_org, oid_value attributeSet, NMEM stream, int reg_type, int complete_flag, @@ -1385,10 +1629,11 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; - const char *termp = termz; RSET rset[60], result; int i, r, rset_no = 0; struct grep_info grep_info; + char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); + const char *termp = termz; #ifdef TERM_COUNT grep_info.term_no = 0; @@ -1412,7 +1657,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type); assert (rset[rset_no]); - if (++rset_no >= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1428,7 +1673,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, } else if (rset_no == 1) return (rset[0]); - result = rpn_prox (zh, rset, rset_no); + result = rpn_prox (zh, rset, rset_no, 1, 0, 3, 1); for (i = 0; i= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1501,7 +1746,7 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, static RSET rpn_search_APT_and_list (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, + const char *termz_org, oid_value attributeSet, NMEM stream, int reg_type, int complete_flag, @@ -1509,10 +1754,11 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; - const char *termp = termz; RSET rset[60], result; int i, r, rset_no = 0; struct grep_info grep_info; + char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); + const char *termp = termz; #ifdef TERM_COUNT grep_info.term_no = 0; @@ -1536,7 +1782,7 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type); assert (rset[rset_no]); - if (++rset_no >= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1584,7 +1830,7 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, logf (LOG_DEBUG, "numeric relation value=%d", relation_value); - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_tmp, 1, + if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, term_tmp, 1, term_dst)) return 0; term_value = atoi (term_tmp); @@ -1612,7 +1858,7 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, sprintf (term_tmp, "(0*%d)", term_value); } logf (LOG_DEBUG, "dict_lookup_grep: %s", term_tmp); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, max_pos, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); @@ -1660,7 +1906,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, zh->errCode = 121; return -1; } - if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) + if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no])) { zh->errCode = 109; /* Database unavailable */ zh->errString = basenames[base_no]; @@ -1673,7 +1919,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, char ord_buf[32]; int i, ord_len; - ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal, + ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal, local_attr->local); if (ord < 0) continue; @@ -1746,7 +1992,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, grep_info.isam_p_indx, term_dst, strlen(term_dst), rank_type); assert (rset[rset_no]); - if (++rset_no >= sizeof(rset)/sizeof(*rset)) + if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } #ifdef TERM_COUNT @@ -1787,7 +2033,7 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt, parms.rset_term = rset_term_create (termz, -1, rank_type); parms.key_size = sizeof (struct it_key); - parms.temp_path = res_get (zh->res, "setTmpDir"); + parms.temp_path = res_get (zh->service->res, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); rsfd = rset_open (result, RSETF_WRITE); @@ -1826,15 +2072,17 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!sort_sequence->specs) { sort_sequence->num_specs = 10; - sort_sequence->specs = nmem_malloc (stream, sort_sequence->num_specs * - sizeof(*sort_sequence->specs)); + sort_sequence->specs = (Z_SortKeySpec **) + nmem_malloc (stream, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); for (i = 0; inum_specs; i++) sort_sequence->specs[i] = 0; } if (zapt->term->which != Z_Term_general) i = 0; else - i = atoi_n (zapt->term->u.general->buf, zapt->term->u.general->len); + i = atoi_n ((char *) zapt->term->u.general->buf, + zapt->term->u.general->len); if (i >= sort_sequence->num_specs) i = 0; @@ -1844,29 +2092,35 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!oid_ent_to_oid (&oe, oid)) return 0; - sks = nmem_malloc (stream, sizeof(*sks)); - sks->sortElement = nmem_malloc (stream, sizeof(*sks->sortElement)); + sks = (Z_SortKeySpec *) nmem_malloc (stream, sizeof(*sks)); + sks->sortElement = (Z_SortElement *) + nmem_malloc (stream, sizeof(*sks->sortElement)); sks->sortElement->which = Z_SortElement_generic; - sk = sks->sortElement->u.generic = nmem_malloc (stream, sizeof(*sk)); + sk = sks->sortElement->u.generic = (Z_SortKey *) + nmem_malloc (stream, sizeof(*sk)); sk->which = Z_SortKey_sortAttributes; - sk->u.sortAttributes = nmem_malloc (stream, sizeof(*sk->u.sortAttributes)); + sk->u.sortAttributes = (Z_SortAttributes *) + nmem_malloc (stream, sizeof(*sk->u.sortAttributes)); sk->u.sortAttributes->id = oid; - sk->u.sortAttributes->list = + sk->u.sortAttributes->list = (Z_AttributeList *) nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list)); sk->u.sortAttributes->list->num_attributes = 1; - sk->u.sortAttributes->list->attributes = + sk->u.sortAttributes->list->attributes = (Z_AttributeElement **) nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes)); - ae = *sk->u.sortAttributes->list->attributes = + ae = *sk->u.sortAttributes->list->attributes = (Z_AttributeElement *) nmem_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); ae->attributeSet = 0; - ae->attributeType = nmem_malloc (stream, sizeof(*ae->attributeType)); + ae->attributeType = (int *) + nmem_malloc (stream, sizeof(*ae->attributeType)); *ae->attributeType = 1; ae->which = Z_AttributeValue_numeric; - ae->value.numeric = nmem_malloc (stream, sizeof(*ae->value.numeric)); + ae->value.numeric = (int *) + nmem_malloc (stream, sizeof(*ae->value.numeric)); *ae->value.numeric = use_value; - sks->sortRelation = nmem_malloc (stream, sizeof(*sks->sortRelation)); + sks->sortRelation = (int *) + nmem_malloc (stream, sizeof(*sks->sortRelation)); if (sort_relation_value == 1) *sks->sortRelation = Z_SortRelation_ascending; else if (sort_relation_value == 2) @@ -1874,7 +2128,8 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else *sks->sortRelation = Z_SortRelation_ascending; - sks->caseSensitivity = nmem_malloc (stream, sizeof(*sks->caseSensitivity)); + sks->caseSensitivity = (int *) + nmem_malloc (stream, sizeof(*sks->caseSensitivity)); *sks->caseSensitivity = 0; #ifdef ASN_COMPILED @@ -1903,7 +2158,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, int sort_flag; char termz[IT_MAX_WORD+1]; - zebra_maps_attr (zh->zebra_maps, zapt, ®_id, &search_type, + zebra_maps_attr (zh->service->zebra_maps, zapt, ®_id, &search_type, &rank_type, &complete_flag, &sort_flag); logf (LOG_DEBUG, "reg_id=%c", reg_id); @@ -2013,7 +2268,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, #ifdef ASN_COMPILED if (*zop->u.prox->u.known != Z_ProxUnit_word) { - char *val = nmem_malloc (stream, 16); + char *val = (char *) nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->u.known); @@ -2022,19 +2277,29 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, #else if (*zop->u.prox->proximityUnitCode != Z_ProxUnit_word) { - char *val = nmem_malloc (stream, 16); + char *val = (char *) nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->proximityUnitCode); return NULL; } #endif - r = rpn_proximity (zh, bool_parms.rset_l, bool_parms.rset_r, - *zop->u.prox->ordered, - (!zop->u.prox->exclusion ? 0 : - *zop->u.prox->exclusion), - *zop->u.prox->relationType, - *zop->u.prox->distance); + else + { + RSET rsets[2]; + + rsets[0] = bool_parms.rset_l; + rsets[1] = bool_parms.rset_r; + + r = rpn_prox (zh, rsets, 2, + *zop->u.prox->ordered, + (!zop->u.prox->exclusion ? 0 : + *zop->u.prox->exclusion), + *zop->u.prox->relationType, + *zop->u.prox->distance); + rset_delete (rsets[0]); + rset_delete (rsets[1]); + } break; default: zh->errCode = 110; @@ -2087,10 +2352,12 @@ RSET rpn_search (ZebraHandle zh, NMEM nmem, zh->errString = NULL; zh->hits = 0; - sort_sequence = nmem_malloc (nmem, sizeof(*sort_sequence)); + sort_sequence = (Z_SortKeySpecList *) + nmem_malloc (nmem, sizeof(*sort_sequence)); sort_sequence->num_specs = 10; - sort_sequence->specs = nmem_malloc (nmem, sort_sequence->num_specs * - sizeof(*sort_sequence->specs)); + sort_sequence->specs = (Z_SortKeySpec **) + nmem_malloc (nmem, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); for (i = 0; inum_specs; i++) sort_sequence->specs[i] = 0; @@ -2124,7 +2391,7 @@ RSET rpn_search (ZebraHandle zh, NMEM nmem, struct scan_info_entry { char *term; - ISAM_P isam_p; + ISAMS_P isam_p; }; struct scan_info { @@ -2137,20 +2404,19 @@ struct scan_info { static int scan_handle (char *name, const char *info, int pos, void *client) { int len_prefix, idx; - struct scan_info *scan_info = client; + struct scan_info *scan_info = (struct scan_info *) client; len_prefix = strlen(scan_info->prefix); if (memcmp (name, scan_info->prefix, len_prefix)) return 1; - if (pos > 0) - idx = scan_info->after - pos + scan_info->before; + if (pos > 0) idx = scan_info->after - pos + scan_info->before; else idx = - pos - 1; - scan_info->list[idx].term = odr_malloc (scan_info->odr, - strlen(name + len_prefix)+1); + scan_info->list[idx].term = (char *) + odr_malloc (scan_info->odr, strlen(name + len_prefix)+1); strcpy (scan_info->list[idx].term, name + len_prefix); - assert (*info == sizeof(ISAM_P)); - memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAM_P)); + assert (*info == sizeof(ISAMS_P)); + memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAMS_P)); return 0; } @@ -2161,7 +2427,7 @@ static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type, term_untrans (zh, reg_type, term_dst, src); - *dst = nmem_malloc (stream, strlen(term_dst)+1); + *dst = (char *) nmem_malloc (stream, strlen(term_dst)+1); strcpy (*dst, term_dst); } @@ -2215,6 +2481,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, char *rank_type = NULL; int complete_flag; int sort_flag; + *list = 0; if (attributeset == VAL_NONE) attributeset = VAL_BIB1; @@ -2224,7 +2491,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, attr_init (&use, zapt, 1); use_value = attr_find (&use, &attributeset); - if (zebra_maps_attr (zh->zebra_maps, zapt, ®_id, &search_type, + if (zebra_maps_attr (zh->service->zebra_maps, zapt, ®_id, &search_type, &rank_type, &complete_flag, &sort_flag)) { zh->errCode = 113; @@ -2247,8 +2514,10 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, zh->errCode = 114; else zh->errCode = 121; + *num_entries = 0; + return; } - if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) + if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no])) { zh->errString = basenames[base_no]; zh->errCode = 109; /* Database unavailable */ @@ -2259,7 +2528,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, { int ord; - ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal, + ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal, local_attr->local); if (ord > 0) ords[ord_no++] = ord; @@ -2273,7 +2542,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, /* prepare dictionary scanning */ before = pos-1; after = 1+num-pos; - scan_info_array = odr_malloc (stream, ord_no * sizeof(*scan_info_array)); + scan_info_array = (struct scan_info *) + odr_malloc (stream, ord_no * sizeof(*scan_info_array)); for (i = 0; i < ord_no; i++) { int j, prefix_len = 0; @@ -2287,8 +2557,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, scan_info->after = after; scan_info->odr = stream; - scan_info->list = odr_malloc (stream, (before+after)* - sizeof(*scan_info->list)); + scan_info->list = (struct scan_info_entry *) + odr_malloc (stream, (before+after) * sizeof(*scan_info->list)); for (j = 0; jlist[j].term = NULL; @@ -2299,10 +2569,11 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, trans_scan_term (zh, zapt, termz+prefix_len, reg_id); - dict_scan (zh->dict, termz, &before_tmp, &after_tmp, scan_info, - scan_handle); + dict_scan (zh->service->dict, termz, &before_tmp, &after_tmp, + scan_info, scan_handle); } - glist = odr_malloc (stream, (before+after)*sizeof(*glist)); + glist = (ZebraScanEntry *) + odr_malloc (stream, (before+after)*sizeof(*glist)); /* consider terms after main term */ for (i = 0; i < ord_no; i++)