* Sebastian Hammer, Adam Dickmeiss
*
* $Log: zrpn.c,v $
- * Revision 1.34 1995-11-16 17:00:56 adam
+ * Revision 1.36 1995-12-06 12:41:27 adam
+ * New command 'stat' for the index program.
+ * Filenames can be read from stdin by specifying '-'.
+ * Bug fix/enhancement of the transformation from terms to regular
+ * expressons in the search engine.
+ *
+ * Revision 1.35 1995/11/27 09:29:00 adam
+ * Bug fixes regarding conversion to regular expressions.
+ *
+ * Revision 1.34 1995/11/16 17:00:56 adam
* Better logging of rpn query.
*
* Revision 1.33 1995/11/01 13:58:28 quinn
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
+#include <ctype.h>
#include "zserver.h"
#include "attribute.h"
return 1;
}
+static void verbatim_char (int ch, int *indx, char *dst)
+{
+ if (!isalnum (ch))
+ dst[(*indx)++] = '\\';
+ dst[(*indx)++] = ch;
+}
+
static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
const char *term_sub,
oid_value attributeSet, struct grep_info *grep_info,
{
case -1: /* not specified */
case 100: /* do not truncate */
- strcat (term_dict, "(");
- strcat (term_dict, term_sub);
- strcat (term_dict, ")");
- logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict);
+ j = strlen(term_dict);
+ term_dict[j++] = '(';
+ for (i = 0; term_sub[i]; i++)
+ verbatim_char (term_sub[i], &j, term_dict);
+ strcpy (term_dict+j, ")");
r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
&max_pos, grep_handle);
if (r)
logf (LOG_WARN, "dict_lookup_grep err, trunc=none:%d", r);
break;
case 1: /* right truncation */
- strcat (term_dict, term_sub);
- strcat (term_dict, ".*");
+ j = strlen(term_dict);
+ term_dict[j++] = '(';
+ for (i = 0; term_sub[i]; i++)
+ verbatim_char (term_sub[i], &j, term_dict);
+ strcpy (term_dict+j, ".*)");
dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
&max_pos, grep_handle);
break;
zi->errCode = 120;
return -1;
case 101: /* process # in term */
- for (j = strlen(term_dict), i = 0; term_sub[i] && i < 2; i++)
- term_dict[j++] = term_sub[i];
- for (; term_sub[i]; i++)
- if (term_sub[i] == '#')
+ j = strlen(term_dict);
+ term_dict[j++] = '(';
+ for (i=0; term_sub[i]; i++)
+ if (term_sub[i] == '#' && i > 2)
{
term_dict[j++] = '.';
term_dict[j++] = '*';
}
else
- term_dict[j++] = term_sub[i];
- term_dict[j] = '\0';
+ verbatim_char (term_sub[i], &j, term_dict);
+ strcpy (term_dict+j, ")");
r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
&max_pos, grep_handle);
if (r)
r);
break;
case 102: /* regular expression */
- strcat (term_dict, "(");
- strcat (term_dict, term_sub);
- strcat (term_dict, ")");
- logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict);
+ sprintf (term_dict + strlen(term_dict), "(%s)", term_sub);
r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
&max_pos, grep_handle);
if (r)