#include <yaz/nmem_xml.h>
#include <yaz/base64.h>
+#if YAZ_HAVE_XML2
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
+#endif
static yaz_iconv_t iconv_create_charset(const char *record_charset,
yaz_iconv_t *cd2)
return res;
}
+#if YAZ_HAVE_XML2
static int replace_node(NMEM nmem, xmlNode *ptr,
const char *type_spec, char *record_buf)
{
if (res)
{
xmlDoc *doc = xmlParseMemory(res, strlen(res));
- xmlNode *nptr;
if (doc)
{
- nptr = xmlCopyNode(xmlDocGetRootElement(doc), 1);
+ xmlNode *nptr = xmlCopyNode(xmlDocGetRootElement(doc), 1);
xmlReplaceNode(ptr, nptr);
xmlFreeDoc(doc);
}
else
{
- nptr = xmlNewText(BAD_CAST res);
+ xmlNode *nptr = xmlNewText(BAD_CAST res);
xmlReplaceNode(ptr, nptr);
}
ret = 0;
odr_destroy(odr);
return ret;
}
+#endif
static const char *base64_render(NMEM nmem, WRBUF wrbuf,
const char *buf, int *len,
const char *expr, const char *type_spec)
{
- xmlDocPtr doc = xmlParseMemory(buf, *len);
+#if YAZ_HAVE_XML2
+ xmlDocPtr doc = xmlParseMemory(buf, strlen(buf));
if (doc)
{
xmlChar *buf_out;
wrbuf_rewind(wrbuf);
wrbuf_write(wrbuf, (const char *) buf_out, len_out);
buf = wrbuf_cstr(wrbuf);
- *len = len_out;
+ if (len)
+ *len = len_out;
}
xmlFreeDoc(doc);
xmlFree(buf_out);
}
+#endif
return buf;
}
const char *ret = 0;
NMEM nmem = 0;
char *base64_xpath = 0;
- char *base64_type_spec = 0;
size_t i;
char type[40];
char charset[40];
{
size_t j = 0;
i = i + 8; /* skip charset= */
+ while (cp[i] == ' ')
+ i++;
for (j = 0; cp[i] && cp[i] != ';' && cp[i] != ' '; i++)
{
if (j < sizeof(charset)-1)
{
size_t j = 0;
i = i + 7;
+ while (cp[i] == ' ')
+ i++;
for (j = 0; cp[i] && cp[i] != ';' && cp[i] != ' '; i++)
{
if (j < sizeof(format)-1)
}
format[j] = '\0';
}
- else if (!strncmp(cp + i, "base64", 6))
+ else if (!strncmp(cp + i, "base64=", 7))
{
- i = i + 6;
-
+ size_t i0;
+ i = i + 7;
while (cp[i] == ' ')
i++;
- if (cp[i] == '(')
- {
- size_t i0;
- nmem = nmem_create();
+ i0 = i;
+ while (cp[i] && cp[i] != ';')
i++;
- while (cp[i] == ' ')
- i++;
- i0 = i;
- while (cp[i] != ',' && cp[i])
- i++;
- base64_xpath = nmem_strdupn(nmem, cp + i0, i - i0);
- if (cp[i])
- i++;
- while (cp[i] == ' ')
- i++;
- i0 = i;
- while (cp[i] != ')' && cp[i])
- i++;
- base64_type_spec = nmem_strdupn(nmem, cp + i0, i - i0);
- if (cp[i])
- i++;
- }
+
+ nmem = nmem_create();
+ base64_xpath = nmem_strdupn(nmem, cp + i0, i - i0);
}
}
if (!strcmp(type, "database"))
}
if (base64_xpath)
- ret = base64_render(nmem, wrbuf,
- ret, len, base64_xpath, base64_type_spec);
+ {
+ char *type_spec = nmem_malloc(nmem,
+ strlen(format) + strlen(charset) + 11);
+ strcpy(type_spec, type);
+ if (*charset)
+ {
+ strcat(type_spec, "; charset=");
+ strcat(type_spec, charset);
+ }
+ ret = base64_render(nmem, wrbuf, ret, len, base64_xpath, type_spec);
+ }
nmem_destroy(nmem);
return ret;
}