X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcql2ccl.c;h=54b16e733c56c970cfdbe676080e4611d0176d1f;hb=fda1ca39e89e4c7f3479c0a9d2a1e38acfdb46bb;hp=0705ed5c77922f8de26712bdc445636db3aef114;hpb=a01e8d12dab3fbde9c494338f15f8177e04e98a1;p=yaz-moved-to-github.git diff --git a/src/cql2ccl.c b/src/cql2ccl.c index 0705ed5..54b16e7 100644 --- a/src/cql2ccl.c +++ b/src/cql2ccl.c @@ -26,18 +26,65 @@ static void pr_term(struct cql_node *cn, { 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);