1 /* $Id: xcqlutil.c,v 1.2 2004-03-10 16:34:29 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)
59 pr_n("<prefixes>\n", pr, client_data, level);
60 for (; cn; cn = cn->u.st.modifiers)
62 pr_n("<prefix>\n", pr, client_data, level+2);
65 pr_n("<name>", pr, client_data, level+4);
66 pr_cdata(cn->u.st.index, pr, client_data);
67 pr_n("</name>\n", pr, client_data, 0);
71 pr_n("<identifier>", pr, client_data, level+4);
72 pr_cdata(cn->u.st.term, pr, client_data);
73 pr_n("</identifier>\n", pr, client_data, 0);
75 pr_n("</prefix>\n", pr, client_data, level+2);
77 pr_n("</prefixes>\n", pr, client_data, level);
81 static void cql_to_xml_mod(struct cql_node *m,
82 void (*pr)(const char *buf, void *client_data),
83 void *client_data, int level)
87 pr_n("<modifiers>\n", pr, client_data, level);
88 for (; m; m = m->u.st.modifiers)
90 pr_n("<modifier>\n", pr, client_data, level+2);
91 pr_n("<type>", pr, client_data, level+4);
92 pr_cdata(m->u.st.index, pr, client_data);
93 pr_n("</type>\n", pr, client_data, 0);
96 pr_n("<relation>", pr, client_data, level+4);
97 pr_cdata(m->u.st.relation, pr, client_data);
98 pr_n("</relation>\n", pr, client_data, 0);
102 pr_n("<value>", pr, client_data, level+4);
103 pr_cdata(m->u.st.term, pr, client_data);
104 pr_n("</value>\n", pr, client_data, 0);
106 pr_n("</modifier>\n", pr, client_data, level+2);
108 pr_n("</modifiers>\n", pr, client_data, level);
112 static void cql_to_xml_r(struct cql_node *cn,
113 void (*pr)(const char *buf, void *client_data),
114 void *client_data, int level)
121 pr_n("<searchClause>\n", pr, client_data, level);
122 prefixes(cn->u.st.prefixes, pr, client_data, level+2);
125 pr_n("<index>", pr, client_data, level+2);
126 pr_cdata(cn->u.st.index, pr, client_data);
127 pr_n("</index>\n", pr, client_data, 0);
129 if (cn->u.st.relation)
131 pr_n("<relation>\n", pr, client_data, level+2);
132 pr_n("<value>", pr, client_data, level+4);
133 pr_cdata(cn->u.st.relation, pr, client_data);
134 pr_n("</value>\n", pr, client_data, 0);
136 cql_to_xml_mod(cn->u.st.modifiers,
137 pr, client_data, level+4);
139 pr_n("</relation>\n", pr, client_data, level+2);
143 pr_n("<term>", pr, client_data, level+2);
144 pr_cdata(cn->u.st.term, pr, client_data);
145 pr_n("</term>\n", pr, client_data, 0);
147 pr_n("</searchClause>\n", pr, client_data, level);
150 pr_n("<triple>\n", pr, client_data, level);
151 prefixes(cn->u.st.prefixes, pr, client_data, level+2);
152 if (cn->u.boolean.value)
154 pr_n("<boolean>\n", pr, client_data, level+2);
156 pr_n("<value>", pr, client_data, level+4);
157 pr_cdata(cn->u.boolean.value, pr, client_data);
158 pr_n("</value>\n", pr, client_data, 0);
160 cql_to_xml_mod(cn->u.boolean.modifiers,
161 pr, client_data, level+4);
163 pr_n("</boolean>\n", pr, client_data, level+2);
165 if (cn->u.boolean.left)
167 printf ("%*s<leftOperand>\n", level+2, "");
168 cql_to_xml_r(cn->u.boolean.left, pr, client_data, level+4);
169 printf ("%*s</leftOperand>\n", level+2, "");
171 if (cn->u.boolean.right)
173 printf ("%*s<rightOperand>\n", level+2, "");
174 cql_to_xml_r(cn->u.boolean.right, pr, client_data, level+4);
175 printf ("%*s</rightOperand>\n", level+2, "");
177 pr_n("</triple>\n", pr, client_data, level);
181 void cql_to_xml(struct cql_node *cn,
182 void (*pr)(const char *buf, void *client_data),
185 cql_to_xml_r(cn, pr, client_data, 0);
188 void cql_to_xml_stdio(struct cql_node *cn, FILE *f)
190 cql_to_xml(cn, cql_fputs, f);
193 void cql_buf_write_handler (const char *b, void *client_data)
195 struct cql_buf_write_info *info = (struct cql_buf_write_info *)client_data;
197 if (info->off < 0 || (info->off + l >= info->max))
202 memcpy (info->buf + info->off, b, l);
206 int cql_to_xml_buf(struct cql_node *cn, char *out, int max)
208 struct cql_buf_write_info info;
212 cql_to_xml(cn, cql_buf_write_handler, &info);
214 info.buf[info.off] = '\0';