+static void gen_regular_rel (char *dst, int val, int islt)
+{
+ int dst_p = 1;
+ int w, d, i;
+ int pos = 0;
+ char numstr[20];
+
+ *dst = '(';
+ sprintf (numstr, "%d", val);
+ for (w = strlen(numstr); --w >= 0; pos++)
+ {
+ d = numstr[w];
+ if (pos > 0)
+ {
+ if (islt)
+ {
+ if (d == '0')
+ continue;
+ d--;
+ }
+ else
+ {
+ if (d == '9')
+ continue;
+ d++;
+ }
+ }
+
+ strcpy (dst + dst_p, numstr);
+ dst_p = strlen(dst) - pos - 1;
+
+ if (islt)
+ {
+ if (d != '0')
+ {
+ dst[dst_p++] = '[';
+ dst[dst_p++] = '0';
+ dst[dst_p++] = '-';
+ dst[dst_p++] = d;
+ dst[dst_p++] = ']';
+ }
+ else
+ dst[dst_p++] = d;
+ }
+ else
+ {
+ if (d != '9')
+ {
+ dst[dst_p++] = '[';
+ dst[dst_p++] = d;
+ dst[dst_p++] = '-';
+ dst[dst_p++] = '9';
+ dst[dst_p++] = ']';
+ }
+ else
+ dst[dst_p++] = d;
+ }
+ for (i = 0; i<pos; i++)
+ {
+ dst[dst_p++] = '[';
+ dst[dst_p++] = '0';
+ dst[dst_p++] = '-';
+ dst[dst_p++] = '9';
+ dst[dst_p++] = ']';
+ }
+ dst[dst_p++] = '|';
+ }
+ dst[dst_p] = '\0';
+ if (islt)
+ {
+ for (i=1; i<pos; i++)
+ strcat (dst, "[0-9]?");
+ }
+ else
+ {
+ for (i = 0; i <= pos; i++)
+ strcat (dst, "[0-9]");
+ strcat (dst, "[0-9]*");
+ }
+ strcat (dst, ")");
+}
+
+static int relational_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
+ const char *term_sub,
+ char *term_dict,
+ oid_value attributeSet,
+ struct grep_info *grep_info,
+ int *max_pos)
+{
+ AttrType relation;
+ int relation_value;
+ int term_value;
+ int r;
+
+ attr_init (&relation, zapt, 2);
+ relation_value = attr_find (&relation, NULL);
+ term_value = atoi (term_sub);
+
+ switch (relation_value)
+ {
+ case 1:
+ if (term_value <= 0)
+ return 1;
+ logf (LOG_DEBUG, "Relation <");
+ gen_regular_rel (term_dict + strlen(term_dict), term_value-1, 1);
+ break;
+ case 2:
+ if (term_value < 0)
+ return 1;
+ logf (LOG_DEBUG, "Relation <=");
+ gen_regular_rel (term_dict + strlen(term_dict), term_value, 1);
+ break;
+ case 4:
+ if (term_value < 0)
+ term_value = 0;
+ logf (LOG_DEBUG, "Relation >=");
+ gen_regular_rel (term_dict + strlen(term_dict), term_value, 0);
+ break;
+ case 5:
+ if (term_value < 0)
+ term_value = 0;
+ logf (LOG_DEBUG, "Relation >");
+ gen_regular_rel (term_dict + strlen(term_dict), term_value+1, 0);
+ break;
+ default:
+ return 0;
+ }
+ logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict);
+ r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, max_pos,
+ grep_handle);
+ if (r)
+ logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r);
+ logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx);
+ return 1;
+}
+
+static void verbatim_char (int ch, int *indx, char *dst)
+{
+ if (!isalnum (ch))
+ dst[(*indx)++] = '\\';
+ dst[(*indx)++] = ch;
+}
+