From 29357d2be4bc20d412d38bcb29876daedda28637 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Mon, 9 Oct 1995 16:18:31 +0000 Subject: [PATCH] Function dict_lookup_grep got extra client data parameter. --- dict/dicttest.c | 12 +- dict/lookgrep.c | 23 ++-- dict/scan.c | 38 ++++--- include/dict.h | 15 ++- index/zrpn.c | 335 ++++++++++++++++++++++++++++++++++++++++++------------- index/zserver.c | 9 +- index/zserver.h | 8 +- 7 files changed, 323 insertions(+), 117 deletions(-) diff --git a/dict/dicttest.c b/dict/dicttest.c index 70dd138..b5994d8 100644 --- a/dict/dicttest.c +++ b/dict/dicttest.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: dicttest.c,v $ - * Revision 1.15 1995-09-04 12:33:31 adam + * Revision 1.16 1995-10-09 16:18:31 adam + * Function dict_lookup_grep got extra client data parameter. + * + * Revision 1.15 1995/09/04 12:33:31 adam * Various cleanup. YAZ util used instead. * * Revision 1.14 1994/10/04 17:46:55 adam @@ -68,7 +71,7 @@ static Dict dict; static int look_hits; -static int grep_handle (Dict_char *name, char *info) +static int grep_handle (Dict_char *name, const char *info, void *client) { look_hits++; printf ("%s\n", name); @@ -230,7 +233,8 @@ int main (int argc, char **argv) else { look_hits = 0; - dict_lookup_grep (dict, ipf_ptr, range, grep_handle); + dict_lookup_grep (dict, ipf_ptr, range, NULL, + grep_handle); if (look_hits) no_of_hits++; else @@ -249,7 +253,7 @@ int main (int argc, char **argv) if (range < 0) range = 0; logf (LOG_LOG, "Grepping '%s'", grep_pattern); - dict_lookup_grep (dict, grep_pattern, range, grep_handle); + dict_lookup_grep (dict, grep_pattern, range, NULL, grep_handle); } if (rw) { diff --git a/dict/lookgrep.c b/dict/lookgrep.c index 2a42cb6..f3a5504 100644 --- a/dict/lookgrep.c +++ b/dict/lookgrep.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: lookgrep.c,v $ - * Revision 1.5 1995-09-14 11:52:59 adam + * Revision 1.6 1995-10-09 16:18:32 adam + * Function dict_lookup_grep got extra client data parameter. + * + * Revision 1.5 1995/09/14 11:52:59 adam * Grep handle function parameter info is const now. * * Revision 1.4 1995/01/24 16:01:02 adam @@ -231,8 +234,8 @@ static INLINE int move (MatchContext *mc, MatchWord *Rj1, MatchWord *Rj, static int dict_grep (Dict dict, Dict_ptr ptr, MatchContext *mc, - MatchWord *Rj, int pos, - int (*userfunc)(Dict_char *name, const char *info), + MatchWord *Rj, int pos, void *client, + int (*userfunc)(Dict_char *, const char *, void *), Dict_char *prefix, struct DFA *dfa) { int lo, hi, d; @@ -267,7 +270,8 @@ static int dict_grep (Dict dict, Dict_ptr ptr, MatchContext *mc, if (ch == DICT_EOS) { if (was_match) - (*userfunc)(prefix, info+(j+1)*sizeof(Dict_char)); + (*userfunc)(prefix, info+(j+1)*sizeof(Dict_char), + client); break; } move (mc, Rj1, Rj0, ch, dfa, Rj_tmp); @@ -313,7 +317,7 @@ static int dict_grep (Dict dict, Dict_ptr ptr, MatchContext *mc, { prefix[pos+1] = DICT_EOS; (*userfunc)(prefix, info+sizeof(Dict_ptr)+ - sizeof(Dict_char)); + sizeof(Dict_char), client); break; } } @@ -321,7 +325,7 @@ static int dict_grep (Dict dict, Dict_ptr ptr, MatchContext *mc, if (subptr) { dict_grep (dict, subptr, mc, Rj1, pos+1, - userfunc, prefix, dfa); + client, userfunc, prefix, dfa); dict_bf_readp (dict->dbf, ptr, &p); indxp = (short*) ((char*) p+DICT_pagesize(dict) -sizeof(short)); @@ -333,8 +337,9 @@ static int dict_grep (Dict dict, Dict_ptr ptr, MatchContext *mc, return 0; } -int dict_lookup_grep (Dict dict, Dict_char *pattern, int range, - int (*userfunc)(Dict_char *name, const char *info)) +int dict_lookup_grep (Dict dict, Dict_char *pattern, int range, void *client, + int (*userfunc)(Dict_char *name, const char *info, + void *client)) { MatchWord *Rj; Dict_char prefix[MAX_LENGTH+1]; @@ -371,7 +376,7 @@ int dict_lookup_grep (Dict dict, Dict_char *pattern, int range, } } } - i = dict_grep (dict, 1, mc, Rj, 0, userfunc, prefix, dfa); + i = dict_grep (dict, 1, mc, Rj, 0, client, userfunc, prefix, dfa); dfa_delete (&dfa); xfree (Rj); diff --git a/dict/scan.c b/dict/scan.c index ba93ed6..13897da 100644 --- a/dict/scan.c +++ b/dict/scan.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: scan.c,v $ - * Revision 1.4 1995-10-06 13:52:00 adam + * Revision 1.5 1995-10-09 16:18:32 adam + * Function dict_lookup_grep got extra client data parameter. + * + * Revision 1.4 1995/10/06 13:52:00 adam * Bug fixes. Handler may abort further scanning. * * Revision 1.3 1995/10/06 11:06:07 adam @@ -25,8 +28,8 @@ #include int dict_scan_trav (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, - int start, int *count, - int (*userfunc)(Dict_char *, const char *, int pos), + int start, int *count, void *client, + int (*userfunc)(Dict_char *, const char *, int, void *), int dir) { int lo, hi, j; @@ -54,7 +57,8 @@ int dict_scan_trav (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, for (j = 0; info[j] != DICT_EOS; j++) str[pos+j] = info[j]; str[pos+j] = DICT_EOS; - if ((*userfunc)(str, info+(j+1)*sizeof(Dict_char), *count * dir)) + if ((*userfunc)(str, info+(j+1)*sizeof(Dict_char), *count * dir, + client)) return 1; --(*count); } @@ -76,13 +80,13 @@ int dict_scan_trav (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, { str[pos+1] = DICT_EOS; if ((*userfunc)(str, info+sizeof(Dict_ptr)+sizeof(Dict_char), - *count * dir)) + *count * dir, client)) return 1; --(*count); } if (*count > 0 && subptr) dict_scan_trav (dict, subptr, pos+1, str, 0, count, - userfunc, dir); + client, userfunc, dir); } lo += dir; } @@ -90,8 +94,8 @@ int dict_scan_trav (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, } int dict_scan_r (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, - int *before, int *after, - int (*userfunc)(Dict_char *, const char *, int)) + int *before, int *after, void *client, + int (*userfunc)(Dict_char *, const char *, int, void *)) { int cmp = 0, mid, lo, hi; void *p; @@ -118,7 +122,7 @@ int dict_scan_r (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, { (*userfunc)(str, info+ (dict_strlen(info)+1)*sizeof(Dict_char), - *after); + *after, client); --(*after); } break; @@ -148,18 +152,18 @@ int dict_scan_r (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, (*userfunc)(str, info+sizeof(Dict_ptr)+ sizeof(Dict_char), - *after); + *after, client); --(*after); } } if (*after && subptr) if (dict_scan_trav (dict, subptr, pos+1, str, 0, - after, userfunc, 1)) + after, client, userfunc, 1)) return 1; } else if (subptr) if (dict_scan_r (dict, subptr, pos+1, str, before, after, - userfunc)) + client, userfunc)) return 1; break; } @@ -173,20 +177,22 @@ int dict_scan_r (Dict dict, Dict_ptr ptr, int pos, Dict_char *str, ++mid; if (*after) if (dict_scan_trav (dict, ptr, pos, str, cmp ? mid : mid+1, after, - userfunc, 1)) + client, userfunc, 1)) return 1; if (*before && mid > 1) if (dict_scan_trav (dict, ptr, pos, str, mid-1, before, - userfunc, -1)) + client, userfunc, -1)) return 1; return 0; } int dict_scan (Dict dict, Dict_char *str, int *before, int *after, - int (*f)(Dict_char *name, const char *info, int pos)) + void *client, + int (*f)(Dict_char *name, const char *info, int pos, + void *client)) { int i; - i = dict_scan_r (dict, 1, 0, str, before, after, f); + i = dict_scan_r (dict, 1, 0, str, before, after, client, f); return i; } diff --git a/include/dict.h b/include/dict.h index 206cbf1..576d9a1 100644 --- a/include/dict.h +++ b/include/dict.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: dict.h,v $ - * Revision 1.13 1995-10-06 09:03:51 adam + * Revision 1.14 1995-10-09 16:18:35 adam + * Function dict_lookup_grep got extra client data parameter. + * + * Revision 1.13 1995/10/06 09:03:51 adam * First version of scan. * * Revision 1.12 1995/09/14 11:53:02 adam @@ -114,13 +117,15 @@ int dict_insert (Dict dict, const Dict_char *p, int userlen, char *dict_lookup (Dict dict, const Dict_char *p); int dict_lookup_ec (Dict dict, Dict_char *p, int range, int (*f)(Dict_char *name)); -int dict_lookup_grep (Dict dict, Dict_char *p, int range, - int (*f)(Dict_char *name, const char *info)); +int dict_lookup_grep (Dict dict, Dict_char *p, int range, void *client, + int (*f)(Dict_char *name, const char *info, + void *client)); int dict_strcmp (const Dict_char *s1, const Dict_char *s2); int dict_strlen (const Dict_char *s); int dict_scan (Dict dict, Dict_char *str, - int *before, int *after, - int (*f)(Dict_char *name, const char *info, int pos)); + int *before, int *after, void *client, + int (*f)(Dict_char *name, const char *info, int pos, + void *client)); #define DICT_EOS 0 #define DICT_type(x) 0[(Dict_ptr*) x] diff --git a/index/zrpn.c b/index/zrpn.c index fb9d9ea..0073e10 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.23 1995-10-06 16:33:37 adam + * Revision 1.24 1995-10-09 16:18:37 adam + * Function dict_lookup_grep got extra client data parameter. + * + * Revision 1.23 1995/10/06 16:33:37 adam * Use attribute mappings. * * Revision 1.22 1995/10/06 15:07:39 adam @@ -97,10 +100,10 @@ int index_word_prefix_map (char *string, oid_value attrSet, int attrUse) { attent *attp; - logf (LOG_DEBUG, "oid_value attrSet = %d", attrSet); - logf (LOG_DEBUG, "int attrUse = %d", attrUse); + logf (LOG_DEBUG, "oid_value attrSet = %d, attrUse = %d", attrSet, attrUse); attp = att_getentbyatt (attrSet, attrUse); - assert (attp); + if (!attp) + return -1; logf (LOG_DEBUG, "ord=%d", attp->attset_ordinal); return index_word_prefix (string, attp->attset_ordinal, attp->local_attribute); @@ -346,42 +349,44 @@ static RSET rset_trunc (ISAM isam, ISAM_P *isam_p, int from, int to, } } -static ISAM_P *isam_p_buf = NULL; -static int isam_p_size = 0; -static int isam_p_indx; +struct grep_info { + ISAM_P *isam_p_buf; + int isam_p_size; + int isam_p_indx; +}; -static void add_isam_p (const char *info) +static void add_isam_p (const char *info, struct grep_info *p) { - if (isam_p_indx == isam_p_size) + if (p->isam_p_indx == p->isam_p_size) { ISAM_P *new_isam_p_buf; - isam_p_size = 2*isam_p_size + 100; + p->isam_p_size = 2*p->isam_p_size + 100; new_isam_p_buf = xmalloc (sizeof(*new_isam_p_buf) * - isam_p_size); - if (isam_p_buf) + p->isam_p_size); + if (p->isam_p_buf) { - memcpy (new_isam_p_buf, isam_p_buf, - isam_p_indx * sizeof(*isam_p_buf)); - xfree (isam_p_buf); + memcpy (new_isam_p_buf, p->isam_p_buf, + p->isam_p_indx * sizeof(*p->isam_p_buf)); + xfree (p->isam_p_buf); } - isam_p_buf = new_isam_p_buf; + p->isam_p_buf = new_isam_p_buf; } - assert (*info == sizeof(*isam_p_buf)); - memcpy (isam_p_buf + isam_p_indx, info+1, sizeof(*isam_p_buf)); - isam_p_indx++; + assert (*info == sizeof(*p->isam_p_buf)); + memcpy (p->isam_p_buf + p->isam_p_indx, info+1, sizeof(*p->isam_p_buf)); + (p->isam_p_indx)++; } -static int grep_handle (Dict_char *name, const char *info) +static int grep_handle (Dict_char *name, const char *info, void *p) { logf (LOG_DEBUG, "dict name: %s", name); - add_isam_p (info); + add_isam_p (info, p); return 0; } static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, - const char *term_sub, ISAM_P **isam_ps, - oid_value attributeSet) + const char *term_sub, + oid_value attributeSet, struct grep_info *grep_info) { char term_dict[2*IT_MAX_WORD+2]; int i, j; @@ -402,6 +407,11 @@ static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, if (use_value == -1) use_value = 1016; i = index_word_prefix_map (term_dict, curAttributeSet, use_value); + if (i < 0) + { + zi->errCode = 114; + return -1; + } switch (truncation_value) { @@ -410,12 +420,12 @@ static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, strcat (term_dict, term_sub); logf (LOG_DEBUG, "dict_lookup: %s", term_dict); if ((info = dict_lookup (zi->wordDict, term_dict))) - add_isam_p (info); + add_isam_p (info, grep_info); break; case 1: /* right truncation */ strcat (term_dict, term_sub); strcat (term_dict, ".*"); - dict_lookup_grep (zi->wordDict, term_dict, 0, grep_handle); + dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, grep_handle); break; case 2: /* left truncation */ case 3: /* left&right truncation */ @@ -433,15 +443,14 @@ static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, else term_dict[j++] = term_sub[i]; term_dict[j] = '\0'; - dict_lookup_grep (zi->wordDict, term_dict, 0, grep_handle); + dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, grep_handle); break; case 102: /* regular expression */ strcat (term_dict, term_sub); - dict_lookup_grep (zi->wordDict, term_dict, 0, grep_handle); + dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, grep_handle); break; } - *isam_ps = isam_p_buf; - logf (LOG_DEBUG, "%d positions", isam_p_indx); + logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); return 0; } @@ -466,7 +475,9 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, rset_relevance_parms parms; char termz[IT_MAX_WORD+1]; char term_sub[IT_MAX_WORD+1]; + struct grep_info grep_info; char *p0 = termz, *p1 = NULL; + RSET result; parms.key_size = sizeof(struct it_key); parms.max_rec = 100; @@ -479,7 +490,9 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, return NULL; } trans_term (zi, zapt, termz); - isam_p_indx = 0; /* global, set by trunc_term - see below */ + grep_info.isam_p_indx = 0; + grep_info.isam_p_size = 0; + grep_info.isam_p_buf = NULL; while (1) { if ((p1 = strchr (p0, ' '))) @@ -489,27 +502,32 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, } else strcpy (term_sub, p0); - if (trunc_term (zi, zapt, term_sub, &parms.isam_positions, - attributeSet)) + if (trunc_term (zi, zapt, term_sub, attributeSet, &grep_info)) return NULL; if (!p1) break; - p0 = p1+1; + p0 = p1; + while (*++p0 == ' ') + ; } - parms.no_isam_positions = isam_p_indx; - if (isam_p_indx > 0) - return rset_create (rset_kind_relevance, &parms); + 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 - return rset_create (rset_kind_null, NULL); + result = rset_create (rset_kind_null, NULL); + xfree (grep_info.isam_p_buf); + return result; } static RSET rpn_search_APT_word (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, oid_value attributeSet) { - ISAM_P *isam_positions; rset_isam_parms parms; char termz[IT_MAX_WORD+1]; + struct grep_info grep_info; + RSET result; if (zapt->term->which != Z_Term_general) { @@ -517,28 +535,112 @@ static RSET rpn_search_APT_word (ZServerInfo *zi, return NULL; } trans_term (zi, zapt, termz); - isam_p_indx = 0; /* global, set by trunc_term - see below */ - if (trunc_term (zi, zapt, termz, &isam_positions, attributeSet)) + + grep_info.isam_p_indx = 0; + grep_info.isam_p_size = 0; + grep_info.isam_p_buf = NULL; + + if (trunc_term (zi, zapt, termz, attributeSet, &grep_info)) return NULL; - if (isam_p_indx < 1) - return rset_create (rset_kind_null, NULL); - else if (isam_p_indx == 1) + if (grep_info.isam_p_indx < 1) + result = rset_create (rset_kind_null, NULL); + else if (grep_info.isam_p_indx == 1) { parms.is = zi->wordIsam; - parms.pos = *isam_positions; - return rset_create (rset_kind_isam, &parms); + parms.pos = *grep_info.isam_p_buf; + result = rset_create (rset_kind_isam, &parms); } else - return rset_trunc (zi->wordIsam, isam_positions, 0, isam_p_indx, 400); + result = rset_trunc (zi->wordIsam, grep_info.isam_p_buf, 0, + grep_info.isam_p_indx, 400); + xfree (grep_info.isam_p_buf); + return result; +} + +static RSET rpn_prox (RSET *rset, int rset_no) +{ + int i; + RSFD *rsfd; + int *more; + struct it_key **buf; + RSFD rsfd_result; + RSET result; + rset_temp_parms parms; + + rsfd = xmalloc (sizeof(*rsfd)*rset_no); + more = xmalloc (sizeof(*more)*rset_no); + buf = xmalloc (sizeof(*buf)*rset_no); + + for (i = 0; i 1) + { + more[i-1] = rset_read (rset[i-1], rsfd[i-1], buf[i-1]); + break; + } + else if (cmp == 1) + { + if (buf[i-1]->seqno+1 != buf[i]->seqno) + { + more[i-1] = rset_read (rset[i-1], rsfd[i-1], buf[i-1]); + break; + } + } + else + { + more[i] = rset_read (rset[i], rsfd[i], buf[i]); + break; + } + } + if (i == rset_no) + { + rset_write (result, rsfd_result, buf[0]); + more[0] = rset_read (*rset, *rsfd, *buf); + } + } + + for (i = 0; iterm->which != Z_Term_general) { @@ -546,14 +648,57 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, return NULL; } trans_term (zi, zapt, termz); - isam_p_indx = 0; /* global, set by trunc_term - see below */ - if (trunc_term (zi, zapt, termz, &isam_positions, attributeSet)) - return NULL; - if (isam_p_indx != 1) + + grep_info.isam_p_size = 0; + grep_info.isam_p_buf = NULL; + + while (1) + { + if ((p1 = strchr (p0, ' '))) + { + memcpy (term_sub, p0, p1-p0); + term_sub[p1-p0] = '\0'; + } + else + strcpy (term_sub, p0); + + grep_info.isam_p_indx = 0; + if (trunc_term (zi, zapt, term_sub, attributeSet, &grep_info)) + return NULL; + if (grep_info.isam_p_indx > 0) + { + if (grep_info.isam_p_indx > 1) + rset[rset_no] = rset_trunc (zi->wordIsam, + grep_info.isam_p_buf, 0, + grep_info.isam_p_indx, 400); + else + { + rset_isam_parms parms; + + parms.is = zi->wordIsam; + parms.pos = *grep_info.isam_p_buf; + rset[rset_no] = rset_create (rset_kind_isam, &parms); + } + rset_no++; + if (rset_no >= sizeof(rset)/sizeof(*rset)) + break; + } + if (!p1) + break; + p0 = p1; + while (*++p0 == ' ') + ; + } + xfree (grep_info.isam_p_buf); + if (rset_no == 0) return rset_create (rset_kind_null, NULL); - parms.is = zi->wordIsam; - parms.pos = *isam_positions; - return rset_create (rset_kind_isam, &parms); + else if (rset_no == 1) + return (rset[0]); + + result = rpn_prox (rset, rset_no); + for (i = 0; ierrCode; } -static struct scan_entry *scan_list; -static ODR scan_odr; -static int scan_before, scan_after; -static ISAM scan_isam; -static char scan_prefix[20]; +struct scan_info { + struct scan_entry *list; + ODR odr; + int before, after; + ISAM isam; + char prefix[20]; +}; -static int scan_handle (Dict_char *name, const char *info, int pos) +static int scan_handle (Dict_char *name, const char *info, int pos, + void *client) { int len_prefix, idx; ISAM_P isam_p; RSET rset; + struct scan_info *scan_info = client; rset_isam_parms parms; - len_prefix = strlen(scan_prefix); - if (memcmp (name, scan_prefix, len_prefix)) + len_prefix = strlen(scan_info->prefix); + if (memcmp (name, scan_info->prefix, len_prefix)) return 1; if (pos > 0) - idx = scan_after - pos + scan_before; + idx = scan_info->after - pos + scan_info->before; else idx = - pos - 1; - scan_list[idx].term = odr_malloc (scan_odr, strlen(name + len_prefix)+1); - strcpy (scan_list[idx].term, name + len_prefix); + scan_info->list[idx].term = 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 (&isam_p, info+1, sizeof(isam_p)); - parms.is = scan_isam; + parms.is = scan_info->isam; parms.pos = isam_p; #if 1 rset = rset_create (rset_kind_isam, &parms); - count_set (rset, &scan_list[idx].occurrences); + count_set (rset, &scan_info->list[idx].occurrences); rset_delete (rset); #else - scan_list[idx].occurrences = 1; + scan_info->list[idx].occurrences = 1; #endif logf (LOG_DEBUG, "pos=%3d idx=%3d name=%s", pos, idx, name); return 0; } int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, - int *position, int *num_entries, struct scan_entry **list) + int *position, int *num_entries, struct scan_entry **list, + int *status) { int i, j, sizez; int pos = *position; @@ -810,18 +961,19 @@ int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, AttrType use; int use_value; Z_Term *term = zapt->term; + struct scan_info scan_info; logf (LOG_DEBUG, "scan, position = %d, num = %d", pos, num); - scan_before = before = pos-1; - scan_after = after = 1+num-pos; - scan_odr = odr; + scan_info.before = before = pos-1; + scan_info.after = after = 1+num-pos; + scan_info.odr = odr; logf (LOG_DEBUG, "scan, before = %d, after = %d", before, after); - scan_isam = zi->wordIsam; - scan_list = *list = odr_malloc (odr, (before+after)*sizeof(**list)); + scan_info.isam = zi->wordIsam; + scan_info.list = odr_malloc (odr, (before+after)*sizeof(*scan_info.list)); for (j = 0; ju.general->len; if (sizez > IT_MAX_WORD) sizez = IT_MAX_WORD; @@ -837,10 +989,35 @@ int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, termz[j+i] = index_char_cvt (term->u.general->buf[j]); termz[j+i] = '\0'; - dict_scan (zi->wordDict, termz, &before, &after, scan_handle); + dict_scan (zi->wordDict, termz, &before, &after, &scan_info, scan_handle); + + *status = BEND_SCAN_SUCCESS; + + for (i = 0; ierrCode = 114; /* if no entries was found */ + logf (LOG_DEBUG, "position = %d, num_entries = %d", + *position, *num_entries); if (zi->errCode) logf (LOG_DEBUG, "scan error: %d", zi->errCode); return 0; } + + diff --git a/index/zserver.c b/index/zserver.c index 0aa0b12..b036efe 100644 --- a/index/zserver.c +++ b/index/zserver.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zserver.c,v $ - * Revision 1.13 1995-10-06 14:38:00 adam + * Revision 1.14 1995-10-09 16:18:37 adam + * Function dict_lookup_grep got extra client data parameter. + * + * Revision 1.13 1995/10/06 14:38:00 adam * New result set method: r_score. * Local no (sysno) and score is transferred to retrieveCtrl. * @@ -218,6 +221,7 @@ bend_deleteresult *bend_delete (void *handle, bend_deleterequest *q, int *num) bend_scanresult *bend_scan (void *handle, bend_scanrequest *q, int *num) { static bend_scanresult r; + int status; odr_reset (server_info.odr); server_info.errCode = 0; @@ -227,7 +231,8 @@ bend_scanresult *bend_scan (void *handle, bend_scanrequest *q, int *num) r.num_entries = q->num_entries; r.errcode = rpn_scan (&server_info, server_info.odr, q->term, &r.term_position, - &r.num_entries, &r.entries); + &r.num_entries, &r.entries, &status); + r.status = status; return &r; } diff --git a/index/zserver.h b/index/zserver.h index 3859376..d5d4cec 100644 --- a/index/zserver.h +++ b/index/zserver.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zserver.h,v $ - * Revision 1.9 1995-10-06 14:38:01 adam + * Revision 1.10 1995-10-09 16:18:38 adam + * Function dict_lookup_grep got extra client data parameter. + * + * Revision 1.9 1995/10/06 14:38:01 adam * New result set method: r_score. * Local no (sysno) and score is transferred to retrieveCtrl. * @@ -72,7 +75,8 @@ int rpn_search (ZServerInfo *zi, const char *setname, int *hits); int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, - int *position, int *num_entries, struct scan_entry **list); + int *position, int *num_entries, struct scan_entry **list, + int *status); ZServerSet *resultSetAdd (ZServerInfo *zi, const char *name, int ov, RSET rset); -- 1.7.10.4