/* This file is part of the Zebra server.
- Copyright (C) 1994-2010 Index Data
+ Copyright (C) 1994-2011 Index Data
Zebra is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdio.h>
#include <assert.h>
#ifdef WIN32
}
static int term_pre(zebra_map_t zm, const char **src,
- const char *ct1, const char *ct2, int first)
+ const char *ct1, int first)
{
const char *s1, *s0 = *src;
const char **map;
{
if (ct1 && strchr(ct1, *s0))
break;
- if (ct2 && strchr(ct2, *s0))
- break;
s1 = s0;
map = zebra_maps_input(zm, &s1, strlen(s1), first);
if (**map != *CHR_SPACE)
const char *space_start = 0;
const char *space_end = 0;
- if (!term_pre(zm, src, NULL, NULL, !space_split))
+ if (!term_pre(zm, src, 0, !space_split))
return 0;
s0 = *src;
while (*s0)
const char **map;
int i = 0;
- if (!term_pre(zm, src, "#", "#", !space_split))
+ if (!term_pre(zm, src, "#", !space_split))
return 0;
s0 = *src;
while (*s0)
const char *s0;
const char **map;
- if (!term_pre(zm, src, "^\\()[].*+?|", "(", !space_split))
+ if (!term_pre(zm, src, "^\\()[].*+?|", !space_split))
return 0;
s0 = *src;
if (errors && *s0 == '+' && s0[1] && s0[2] == '+' && s0[3] &&
}
-/* term_104: handle term, process # and ! */
+/* term_104: handle term, process ?n * # */
static int term_104(zebra_map_t zm, const char **src,
WRBUF term_dict, int space_split, WRBUF display_term)
{
const char **map;
int i = 0;
- if (!term_pre(zm, src, "?*#", "?*#", !space_split))
+ if (!term_pre(zm, src, "?*#", !space_split))
return 0;
s0 = *src;
while (*s0)
return i;
}
-/* term_105/106: handle term, where trunc = Process * and ! and right trunc */
+/* term_105/106: handle term, process * ! and possibly right_truncate */
static int term_105(zebra_map_t zm, const char **src,
WRBUF term_dict, int space_split,
WRBUF display_term, int right_truncate)
const char **map;
int i = 0;
- if (!term_pre(zm, src, "*!", "*!", !space_split))
+ if (!term_pre(zm, src, "\\*!", !space_split))
return 0;
s0 = *src;
while (*s0)
wrbuf_putc(display_term, *s0);
s0++;
}
+ else if (*s0 == '\\')
+ {
+ i++;
+ wrbuf_puts(term_dict, "\\\\");
+ wrbuf_putc(display_term, *s0);
+ s0++;
+ }
else
{
const char *s1 = s0;
}
wrbuf_putc(term_dict, ')');
break;
- case 104: /* process # and ! in term */
+ case 104: /* process ?n * # term */
wrbuf_putc(term_dict, '(');
if (!term_104(zm, &termp, term_dict, space_split, display_term))
{
}
wrbuf_putc(term_dict, ')');
break;
- case 105: /* process * and ! in term */
+ case 105: /* process * ! in term and right truncate */
wrbuf_putc(term_dict, '(');
if (!term_105(zm, &termp, term_dict, space_split, display_term, 1))
{
}
wrbuf_putc(term_dict, ')');
break;
- case 106: /* process * and ! in term */
+ case 106: /* process * ! in term */
wrbuf_putc(term_dict, '(');
if (!term_105(zm, &termp, term_dict, space_split, display_term, 0))
{
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
const char *index_type,
int complete_flag,
ZEBRA_RES res;
struct grep_info grep_info;
int alloc_sets = 0;
- zint hits_limit_value;
+ zint hits_limit_value = hits_limit;
const char *term_ref_id_str = 0;
zebra_term_limits_APT(zh, zapt, &hits_limit_value, &term_ref_id_str,
}
else if (!strcmp(search_type, "numeric"))
{
- res = rpn_search_APT_numeric(zh, zapt, termz, attributeSet, stream,
+ res = rpn_search_APT_numeric(zh, zapt, termz, attributeSet, hits_limit,
+ stream,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,