X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fxcqlutil.c;h=de6116cf1126cd4150e9e3c403c627656440ecf6;hp=b430a28eed39bedcc4954ddd8c9e85b81b11139f;hb=9084e20f4c5ffad9cfea2087396206b75a3a6654;hpb=4c176312acdc3444c9afc820f76a393e64668e52 diff --git a/src/xcqlutil.c b/src/xcqlutil.c index b430a28..de6116c 100644 --- a/src/xcqlutil.c +++ b/src/xcqlutil.c @@ -1,16 +1,14 @@ -/* $Id: xcqlutil.c,v 1.5 2005-01-15 19:47:14 adam Exp $ - Copyright (C) 1995-2005, Index Data ApS - Index Data Aps - -This file is part of the YAZ toolkit. - -See the file LICENSE. -*/ - +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2013 Index Data + * See the file LICENSE for details. + */ /** * \file xcqlutil.c * \brief Implements CQL to XCQL conversion. */ +#if HAVE_CONFIG_H +#include +#endif #include #include @@ -18,7 +16,7 @@ See the file LICENSE. #include -static void pr_n(const char *buf, +static void pr_n(const char *buf, void (*pr)(const char *buf, void *client_data), void *client_data, int n) { @@ -55,7 +53,7 @@ static void pr_cdata(const char *buf, src++; } } - + static void prefixes(struct cql_node *cn, void (*pr)(const char *buf, void *client_data), void *client_data, int level) @@ -64,65 +62,92 @@ static void prefixes(struct cql_node *cn, if (cn->u.st.index_uri) { pr_n("\n", pr, client_data, level); - head = 1; + head = 1; - pr_n("\n", pr, client_data, level+2); - pr_n("", pr, client_data, level+4); - pr_cdata(cn->u.st.index_uri, pr, client_data); - pr_n("\n", pr, client_data, 0); - pr_n("\n", pr, client_data, level+2); + pr_n("\n", pr, client_data, level+2); + pr_n("", pr, client_data, level+4); + pr_cdata(cn->u.st.index_uri, pr, client_data); + pr_n("\n", pr, client_data, 0); + pr_n("\n", pr, client_data, level+2); } if (cn->u.st.relation_uri && cn->u.st.relation) { - if (!head) - pr_n("\n", pr, client_data, level); - pr_n("\n", pr, client_data, level+2); - pr_n("", pr, client_data, level+4); - pr_cdata("rel", pr, client_data); - pr_n("\n", pr, client_data, 0); - pr_n("", pr, client_data, level+4); - pr_cdata(cn->u.st.relation_uri, pr, client_data); - pr_n("\n", pr, client_data, 0); - pr_n("\n", pr, client_data, level+2); + if (!head) + pr_n("\n", pr, client_data, level); + pr_n("\n", pr, client_data, level+2); + pr_n("", pr, client_data, level+4); + pr_cdata("rel", pr, client_data); + pr_n("\n", pr, client_data, 0); + pr_n("", pr, client_data, level+4); + pr_cdata(cn->u.st.relation_uri, pr, client_data); + pr_n("\n", pr, client_data, 0); + pr_n("\n", pr, client_data, level+2); } if (head) pr_n("\n", pr, client_data, level); } - + static void cql_to_xml_mod(struct cql_node *m, - void (*pr)(const char *buf, void *client_data), - void *client_data, int level) + void (*pr)(const char *buf, void *client_data), + void *client_data, int level) { if (m) { - pr_n("\n", pr, client_data, level); - for (; m; m = m->u.st.modifiers) - { - pr_n("\n", pr, client_data, level+2); - pr_n("", pr, client_data, level+4); - pr_cdata(m->u.st.index, pr, client_data); - pr_n("\n", pr, client_data, 0); - if (m->u.st.relation) - { - pr_n("", pr, client_data, level+4); - pr_cdata(m->u.st.relation, pr, client_data); - pr_n("\n", pr, client_data, 0); - } - if (m->u.st.term) - { - pr_n("", pr, client_data, level+4); - pr_cdata(m->u.st.term, pr, client_data); - pr_n("\n", pr, client_data, 0); - } - pr_n("\n", pr, client_data, level+2); - } - pr_n("\n", pr, client_data, level); + pr_n("\n", pr, client_data, level); + for (; m; m = m->u.st.modifiers) + { + pr_n("\n", pr, client_data, level+2); + pr_n("", pr, client_data, level+4); + pr_cdata(m->u.st.index, pr, client_data); + pr_n("\n", pr, client_data, 0); + if (m->u.st.relation) + { + pr_n("", pr, client_data, level+4); + pr_cdata(m->u.st.relation, pr, client_data); + pr_n("\n", pr, client_data, 0); + } + if (m->u.st.term) + { + pr_n("", pr, client_data, level+4); + pr_cdata(m->u.st.term, pr, client_data); + pr_n("\n", pr, client_data, 0); + } + pr_n("\n", pr, client_data, level+2); + } + pr_n("\n", pr, client_data, level); + } +} + +static void cql_sort_to_xml(struct cql_node *cn, + void (*pr)(const char *buf, void *client_data), + void *client_data, int level) +{ + if (cn) + { + pr_n("\n", pr, client_data, level); + for (; cn; cn = cn->u.sort.next) + { + pr_n("\n", pr, client_data, level+2); + + if (cn->u.sort.index) + { + pr_n("", pr, client_data, level+4); + pr_cdata(cn->u.sort.index, pr, client_data); + pr_n("\n", pr, client_data, 0); + + cql_to_xml_mod(cn->u.sort.modifiers, + pr, client_data, level+6); + } + pr_n("\n", pr, client_data, level+2); + } + pr_n("\n", pr, client_data, level); } } static void cql_to_xml_r(struct cql_node *cn, void (*pr)(const char *buf, void *client_data), - void *client_data, int level) + void *client_data, int level, + struct cql_node *sort_node) { if (!cn) return; @@ -141,19 +166,19 @@ static void cql_to_xml_r(struct cql_node *cn, { pr_n("\n", pr, client_data, level+2); pr_n("", pr, client_data, level+4); - if (cn->u.st.relation_uri) - pr_cdata("rel.", pr, client_data); + if (cn->u.st.relation_uri) + pr_cdata("rel.", pr, client_data); pr_cdata(cn->u.st.relation, pr, client_data); pr_n("\n", pr, client_data, 0); - if (cn->u.st.relation_uri) - { - pr_n("", pr, client_data, level+4); - pr_cdata(cn->u.st.relation_uri, pr, client_data); - pr_n("\n", pr, client_data, 0); - } - cql_to_xml_mod(cn->u.st.modifiers, - pr, client_data, level+4); + if (cn->u.st.relation_uri) + { + pr_n("", pr, client_data, level+4); + pr_cdata(cn->u.st.relation_uri, pr, client_data); + pr_n("\n", pr, client_data, 0); + } + cql_to_xml_mod(cn->u.st.modifiers, + pr, client_data, level+4); pr_n("\n", pr, client_data, level+2); } @@ -163,6 +188,7 @@ static void cql_to_xml_r(struct cql_node *cn, pr_cdata(cn->u.st.term, pr, client_data); pr_n("\n", pr, client_data, 0); } + cql_sort_to_xml(sort_node, pr, client_data, level+2); pr_n("\n", pr, client_data, level); break; case CQL_NODE_BOOL: @@ -175,32 +201,36 @@ static void cql_to_xml_r(struct cql_node *cn, pr_cdata(cn->u.boolean.value, pr, client_data); pr_n("\n", pr, client_data, 0); - cql_to_xml_mod(cn->u.boolean.modifiers, - pr, client_data, level+4); + cql_to_xml_mod(cn->u.boolean.modifiers, + pr, client_data, level+4); pr_n("\n", pr, client_data, level+2); } if (cn->u.boolean.left) { printf ("%*s\n", level+2, ""); - cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4); + cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4, 0); printf ("%*s\n", level+2, ""); } if (cn->u.boolean.right) { printf ("%*s\n", level+2, ""); - cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4); + cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4, 0); printf ("%*s\n", level+2, ""); } + cql_sort_to_xml(sort_node, pr, client_data, level+2); pr_n("\n", pr, client_data, level); + break; + case CQL_NODE_SORT: + cql_to_xml_r(cn->u.sort.search, pr, client_data, level, cn); } } -void cql_to_xml(struct cql_node *cn, +void cql_to_xml(struct cql_node *cn, void (*pr)(const char *buf, void *client_data), void *client_data) { - cql_to_xml_r(cn, pr, client_data, 0); + cql_to_xml_r(cn, pr, client_data, 0, 0); } void cql_to_xml_stdio(struct cql_node *cn, FILE *f) @@ -233,3 +263,12 @@ int cql_to_xml_buf(struct cql_node *cn, char *out, int max) return info.off; } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +