X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcql2ccl.c;h=d7d05cca04e8e57472a8911d4b8541e09150b0ca;hb=3c287bc1d48ee6a1f300054c2cebd0ba312bd5b9;hp=0705ed5c77922f8de26712bdc445636db3aef114;hpb=a01e8d12dab3fbde9c494338f15f8177e04e98a1;p=yaz-moved-to-github.git diff --git a/src/cql2ccl.c b/src/cql2ccl.c index 0705ed5..d7d05cc 100644 --- a/src/cql2ccl.c +++ b/src/cql2ccl.c @@ -4,7 +4,7 @@ */ /** * \file cql2ccl.c - * \brief Implements CQL to XCQL conversion. + * \brief Implements CQL to CCL conversion. */ #if HAVE_CONFIG_H #include @@ -20,29 +20,67 @@ static int cql_to_ccl_r(struct cql_node *cn, void (*pr)(const char *buf, void *client_data), void *client_data); -static void pr_term(struct cql_node *cn, +static void pr_term(const char **cpp, int stop_at_space, void (*pr)(const char *buf, void *client_data), void *client_data) { - while (cn) + const char *cp; + int quote_mode = 0; + for (cp = *cpp; *cp; cp++) { - const char *cp; - cp = cn->u.st.term; - while (*cp) + char x[4]; + + if (*cp == '\\' && cp[1]) { - char x[2]; - if (*cp == '*') - x[0] = '?'; - else - x[0] = *cp; - x[1] = 0; - pr(x, client_data); + if (!quote_mode) + { + pr("\"", client_data); + quote_mode = 1; + } cp++; + if (*cp == '\"' || *cp == '\\') + pr("\\", client_data); + 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 (*cp == ' ') + break; + else + { + if (!quote_mode) + { + pr("\"", client_data); + quote_mode = 1; + } + x[0] = *cp; + x[1] = '\0'; + pr(x, client_data); } - if (cn->u.st.extra_terms) - pr(" ", client_data); - cn = cn->u.st.extra_terms; } + if (quote_mode) + pr("\"", client_data); + if (cp == *cpp) + pr("\"\"", client_data); + *cpp = cp; } static int node(struct cql_node *cn, @@ -83,46 +121,35 @@ static int node(struct cql_node *cn, /* unsupported relation */ return -1; } - if (!split_op) - { - if (ccl_field && ccl_rel) - { - pr(ccl_field, client_data); - pr(ccl_rel, client_data); - } - pr_term(cn, pr, client_data); - } - else + for (; cn; cn = cn->u.st.extra_terms) { const char *cp = cn->u.st.term; - while (1) { - if (*cp == '\0') - break; if (ccl_field && ccl_rel) { pr(ccl_field, client_data); pr(ccl_rel, client_data); } - while (*cp && *cp != ' ') - { - char x[2]; - if (*cp == '*') - x[0] = '?'; - else - x[0] = *cp; - x[1] = '\0'; - pr(x, client_data); - cp++; - } + pr_term(&cp, split_op ? 1 : 0, pr, client_data); + if (!split_op) + break; while (*cp == ' ') cp++; if (*cp == '\0') break; pr(" ", client_data); pr(split_op, client_data); - pr(" ", client_data); + pr(" ", client_data); + } + if (cn->u.st.extra_terms) + { + pr(" ", client_data); + if (split_op) + { + pr(split_op, client_data); + pr(" ", client_data); + } } } return 0; @@ -167,7 +194,7 @@ static int bool(struct cql_node *cn, if (!strcmp(n->u.st.relation, "<=")) distance = atoi(n->u.st.term); else if (!strcmp(n->u.st.relation, "<")) - distance = atoi(n->u.st.term) - 1; + distance = atoi(n->u.st.term) - 1; else return -1; }