{
while (cn)
{
- const char *cp;
- cp = cn->u.st.term;
- while (*cp)
+ if (! *cn->u.st.term) /* empty term special case */
+ pr("\"\"", client_data);
+ else
{
- char x[2];
- if (*cp == '*')
- x[0] = '?';
- else
- x[0] = *cp;
- x[1] = 0;
- pr(x, client_data);
- cp++;
+ const char *cp;
+ int quote_mode = 0;
+ for (cp = cn->u.st.term; *cp; cp++)
+ {
+ char x[4];
+
+ if (*cp == '\\' && cp[1])
+ {
+ if (!quote_mode)
+ {
+ pr("\"", client_data);
+ quote_mode = 1;
+ }
+ cp++;
+ if (*cp == '\"' || *cp == '\\')
+ pr("\\\"", client_data);
+ else
+ {
+ x[0] = *cp;
+ x[1] = '\0';
+ pr(x, client_data);
+ }
+ }
+ else if (*cp == '*')
+ {
+ if (quote_mode)
+ {
+ pr("\"", client_data);
+ quote_mode = 0;
+ }
+ pr("?", client_data);
+ }
+ else if (*cp == '?')
+ {
+ if (quote_mode)
+ {
+ pr("\"", client_data);
+ quote_mode = 0;
+ }
+ pr("#", client_data);
+ }
+ else
+ {
+ if (!quote_mode)
+ {
+ pr("\"", client_data);
+ quote_mode = 1;
+ }
+ x[0] = *cp;
+ x[1] = '\0';
+ pr(x, client_data);
+ }
+ }
+ if (quote_mode)
+ pr("\"", client_data);
}
if (cn->u.st.extra_terms)
pr(" ", client_data);