/* This file is part of the Zebra server.
- Copyright (C) 2004-2013 Index Data
+ Copyright (C) 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
assert(in_buf);
assert(out_size > 20);
*out_buf = '\0';
- for (k = 0; k<in_size; k++)
+ for (k = 0; k < in_size; k++)
{
int c = in_buf[k] & 0xff;
int pc;
}
+/* ICU sort keys seem to be of the form
+ basechars \x01 accents \x01 length
+ For now we'll just right truncate from basechars . This
+ may give false hits due to accents not being used.
+*/
+static size_t icu_basechars(const char *buf, size_t i)
+{
+ while (i > 0 && buf[--i] != '\x01') /* skip length */
+ ;
+ while (i > 0 && buf[--i] != '\x01') /* skip accents */
+ ;
+ return i; /* only basechars left */
+}
+
static int term_102_icu(zebra_map_t zm,
const char **src, WRBUF term_dict, int space_split,
WRBUF display_term)
if (zebra_map_tokenize_next(zm, &res_buf, &res_len,
&display_buf, &display_len))
{
- size_t i = res_len;
- while (--i >= 0 && res_buf[i] != '\x01')
- ;
- if (i > 0)
- {
- while (--i >= 0 && res_buf[i] != '\x01')
- ;
- }
- res_len = i; /* reduce res_len */
+ size_t i;
+ res_len = icu_basechars(res_buf, res_len);
for (i = 0; i < res_len; i++)
{
if (strchr(REGEX_CHARS "\\", res_buf[i]))
}
static int term_100_icu(zebra_map_t zm,
- const char **src, WRBUF term_dict, int space_split,
+ const char **src, WRBUF term_dict,
WRBUF display_term,
- int mode)
+ int mode,
+ size_t token_number)
{
size_t i;
const char *res_buf = 0;
size_t res_len = 0;
const char *display_buf;
size_t display_len;
- const char *s0 = *src, *s1;
-
- while (*s0 == ' ')
- s0++;
-
- if (*s0 == '\0')
- return 0;
-
- if (space_split)
- {
- s1 = s0;
- while (*s1 && *s1 != ' ')
- s1++;
- }
- else
- s1 = s0 + strlen(s0);
-
- *src = s1;
- zebra_map_tokenize_start(zm, s0, s1 - s0);
-
- if (!zebra_map_tokenize_next(zm, &res_buf, &res_len,
- &display_buf, &display_len))
+ zebra_map_tokenize_start(zm, *src, strlen(*src));
+ for (i = 0; i <= token_number; i++)
{
- return 0;
+ if (!zebra_map_tokenize_next(zm, &res_buf, &res_len,
+ &display_buf, &display_len))
+ return 0;
}
wrbuf_write(display_term, display_buf, display_len);
if (mode)
{
- /* ICU sort keys seem to be of the form
- basechars \x01 accents \x01 length
- For now we'll just right truncate from basechars . This
- may give false hits due to accents not being used.
- */
- i = res_len;
- while (--i >= 0 && res_buf[i] != '\x01')
- ;
- if (i > 0)
- {
- while (--i >= 0 && res_buf[i] != '\x01')
- ;
- }
- if (i == 0)
- { /* did not find base chars at all. Throw error */
- return -1;
- }
- res_len = i; /* reduce res_len */
+ res_len = icu_basechars(res_buf, res_len);
}
if (mode & 2)
wrbuf_puts(term_dict, ".*");
else
dst[dst_p++] = d;
}
- for (i = 0; i<pos; i++)
+ for (i = 0; i < pos; i++)
{
dst[dst_p++] = '[';
dst[dst_p++] = '0';
{
/* match everything less than 10^(pos-1) */
strcat(dst, "0*");
- for (i = 1; i<pos; i++)
+ for (i = 1; i < pos; i++)
strcat(dst, "[0-9]?");
}
else
WRBUF display_term,
const char *xpath_use,
struct ord_list **ol,
- zebra_map_t zm);
+ zebra_map_t zm, size_t token_number);
ZEBRA_RES zebra_term_limits_APT(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
NMEM rset_nmem,
RSET *rset,
struct rset_key_control *kc,
- zebra_map_t zm)
+ zebra_map_t zm,
+ size_t token_number)
{
ZEBRA_RES res;
struct ord_list *ol;
res = string_term(zh, zapt, term_sub, term_dict,
attributeSet, stream, grep_info,
index_type, complete_flag,
- display_term, xpath_use, &ol, zm);
+ display_term, xpath_use, &ol, zm, token_number);
wrbuf_destroy(term_dict);
if (res == ZEBRA_OK && *term_sub)
{
WRBUF display_term,
const char *xpath_use,
struct ord_list **ol,
- zebra_map_t zm)
+ zebra_map_t zm, size_t token_number)
{
int r;
AttrType truncation;
wrbuf_putc(term_dict, '(');
- for (i = 0; i<ord_len; i++)
+ for (i = 0; i < ord_len; i++)
{
wrbuf_putc(term_dict, 1); /* our internal regexp escape char */
wrbuf_putc(term_dict, ord_buf[i]);
{
case -1: /* not specified */
case 100: /* do not truncate */
- if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 0))
+ if (!term_100_icu(zm, &termp, term_dict, display_term, 0, token_number))
{
*term_sub = 0;
return ZEBRA_OK;
}
break;
case 1: /* right truncation */
- if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 1))
+ if (!term_100_icu(zm, &termp, term_dict, display_term, 1, token_number))
{
*term_sub = 0;
return ZEBRA_OK;
}
break;
case 2:
- if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 2))
+ if (!term_100_icu(zm, &termp, term_dict, display_term, 2, token_number))
{
*term_sub = 0;
return ZEBRA_OK;
}
break;
case 3:
- if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 3))
+ if (!term_100_icu(zm, &termp, term_dict, display_term, 3, token_number))
{
*term_sub = 0;
return ZEBRA_OK;
rank_type,
xpath_use, rset_nmem,
&(*result_sets)[*num_result_sets],
- kc, zm);
+ kc, zm,
+ *num_result_sets);
if (res != ZEBRA_OK)
{
int i;
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
return res;
}
if (res != ZEBRA_OK)
return res;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
{
RSET first_set = 0;
res = search_position(zh, zapt, attributeSet,
kc);
if (res != ZEBRA_OK)
{
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
return res;
}
kc);
if (res != ZEBRA_OK)
return res;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
{
RSET first_set = 0;
res = search_position(zh, zapt, attributeSet,
kc);
if (res != ZEBRA_OK)
{
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
return res;
}
sort_sequence->specs = (Z_SortKeySpec **)
nmem_malloc(stream, sort_sequence->num_specs *
sizeof(*sort_sequence->specs));
- for (i = 0; i<sort_sequence->num_specs; i++)
+ for (i = 0; i < sort_sequence->num_specs; i++)
sort_sequence->specs[i] = 0;
}
if (zapt->term->which != Z_Term_general)
const char *flags = "void";
wrbuf_putc(term_dict, '(');
- for (i = 0; i<ord_len; i++)
+ for (i = 0; i < ord_len; i++)
{
wrbuf_putc(term_dict, 1);
wrbuf_putc(term_dict, ord_buf[i]);
}
yaz_log(YLOG_DEBUG, "xpath len=%d", xpath_len);
- for (i = 0; i<xpath_len; i++)
+ for (i = 0; i < xpath_len; i++)
{
yaz_log(log_level_rpn, "XPATH %d %s", i, xpath[i].part);
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
*result_set = 0;
}
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets_l; i++)
+ for (i = 0; i < num_result_sets_l; i++)
rset_delete(result_sets_l[i]);
return res;
}
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets_l; i++)
+ for (i = 0; i < num_result_sets_l; i++)
rset_delete(result_sets_l[i]);
- for (i = 0; i<num_result_sets_r; i++)
+ for (i = 0; i < num_result_sets_r; i++)
rset_delete(result_sets_r[i]);
return res;
}