1 /* $Id: xcqlutil.c,v 1.3 2004-03-15 21:39:06 adam Exp $
2 Copyright (C) 2002-2004
5 This file is part of the YAZ toolkit.
15 static void pr_n(const char *buf,
16 void (*pr)(const char *buf, void *client_data),
17 void *client_data, int n)
21 (*pr)(" ", client_data);
22 (*pr)(buf, client_data);
25 static void pr_cdata(const char *buf,
26 void (*pr)(const char *buf, void *client_data),
29 const char *src = buf;
36 (*pr)("&", client_data);
39 (*pr)("<", client_data);
42 (*pr)(">", client_data);
47 (*pr)(bf, client_data);
53 static void prefixes(struct cql_node *cn,
54 void (*pr)(const char *buf, void *client_data),
55 void *client_data, int level)
58 if (cn->u.st.index_uri)
60 pr_n("<prefixes>\n", pr, client_data, level);
63 pr_n("<prefix>\n", pr, client_data, level+2);
64 pr_n("<identifier>", pr, client_data, level+4);
65 pr_cdata(cn->u.st.index_uri, pr, client_data);
66 pr_n("</identifier>\n", pr, client_data, 0);
67 pr_n("</prefix>\n", pr, client_data, level+2);
69 if (cn->u.st.relation_uri && cn->u.st.relation)
72 pr_n("<prefixes>\n", pr, client_data, level);
73 pr_n("<prefix>\n", pr, client_data, level+2);
74 pr_n("<name>", pr, client_data, level+4);
75 pr_cdata("rel", pr, client_data);
76 pr_n("</name>\n", pr, client_data, 0);
77 pr_n("<identifier>", pr, client_data, level+4);
78 pr_cdata(cn->u.st.relation_uri, pr, client_data);
79 pr_n("</identifier>\n", pr, client_data, 0);
80 pr_n("</prefix>\n", pr, client_data, level+2);
83 pr_n("</prefixes>\n", pr, client_data, level);
86 static void cql_to_xml_mod(struct cql_node *m,
87 void (*pr)(const char *buf, void *client_data),
88 void *client_data, int level)
92 pr_n("<modifiers>\n", pr, client_data, level);
93 for (; m; m = m->u.st.modifiers)
95 pr_n("<modifier>\n", pr, client_data, level+2);
96 pr_n("<type>", pr, client_data, level+4);
97 pr_cdata(m->u.st.index, pr, client_data);
98 pr_n("</type>\n", pr, client_data, 0);
101 pr_n("<relation>", pr, client_data, level+4);
102 pr_cdata(m->u.st.relation, pr, client_data);
103 pr_n("</relation>\n", pr, client_data, 0);
107 pr_n("<value>", pr, client_data, level+4);
108 pr_cdata(m->u.st.term, pr, client_data);
109 pr_n("</value>\n", pr, client_data, 0);
111 pr_n("</modifier>\n", pr, client_data, level+2);
113 pr_n("</modifiers>\n", pr, client_data, level);
117 static void cql_to_xml_r(struct cql_node *cn,
118 void (*pr)(const char *buf, void *client_data),
119 void *client_data, int level)
126 pr_n("<searchClause>\n", pr, client_data, level);
127 prefixes(cn, pr, client_data, level+2);
130 pr_n("<index>", pr, client_data, level+2);
131 pr_cdata(cn->u.st.index, pr, client_data);
132 pr_n("</index>\n", pr, client_data, 0);
134 if (cn->u.st.relation)
136 pr_n("<relation>\n", pr, client_data, level+2);
137 pr_n("<value>", pr, client_data, level+4);
138 if (cn->u.st.relation_uri)
139 pr_cdata("rel.", pr, client_data);
140 pr_cdata(cn->u.st.relation, pr, client_data);
141 pr_n("</value>\n", pr, client_data, 0);
143 if (cn->u.st.relation_uri)
145 pr_n("<identifier>", pr, client_data, level+4);
146 pr_cdata(cn->u.st.relation_uri, pr, client_data);
147 pr_n("</identifier>\n", pr, client_data, 0);
149 cql_to_xml_mod(cn->u.st.modifiers,
150 pr, client_data, level+4);
152 pr_n("</relation>\n", pr, client_data, level+2);
156 pr_n("<term>", pr, client_data, level+2);
157 pr_cdata(cn->u.st.term, pr, client_data);
158 pr_n("</term>\n", pr, client_data, 0);
160 pr_n("</searchClause>\n", pr, client_data, level);
163 pr_n("<triple>\n", pr, client_data, level);
164 if (cn->u.boolean.value)
166 pr_n("<boolean>\n", pr, client_data, level+2);
168 pr_n("<value>", pr, client_data, level+4);
169 pr_cdata(cn->u.boolean.value, pr, client_data);
170 pr_n("</value>\n", pr, client_data, 0);
172 cql_to_xml_mod(cn->u.boolean.modifiers,
173 pr, client_data, level+4);
175 pr_n("</boolean>\n", pr, client_data, level+2);
177 if (cn->u.boolean.left)
179 printf ("%*s<leftOperand>\n", level+2, "");
180 cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4);
181 printf ("%*s</leftOperand>\n", level+2, "");
183 if (cn->u.boolean.right)
185 printf ("%*s<rightOperand>\n", level+2, "");
186 cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4);
187 printf ("%*s</rightOperand>\n", level+2, "");
189 pr_n("</triple>\n", pr, client_data, level);
193 void cql_to_xml(struct cql_node *cn,
194 void (*pr)(const char *buf, void *client_data),
197 cql_to_xml_r(cn, pr, client_data, 0);
200 void cql_to_xml_stdio(struct cql_node *cn, FILE *f)
202 cql_to_xml(cn, cql_fputs, f);
205 void cql_buf_write_handler (const char *b, void *client_data)
207 struct cql_buf_write_info *info = (struct cql_buf_write_info *)client_data;
209 if (info->off < 0 || (info->off + l >= info->max))
214 memcpy (info->buf + info->off, b, l);
218 int cql_to_xml_buf(struct cql_node *cn, char *out, int max)
220 struct cql_buf_write_info info;
224 cql_to_xml(cn, cql_buf_write_handler, &info);
226 info.buf[info.off] = '\0';