-/* $Id: d1_read.c,v 1.22 2007-01-15 15:10:14 adam Exp $
+/* $Id: d1_read.c,v 1.27 2007-06-27 22:04:45 adam Exp $
Copyright (C) 1995-2007
Index Data ApS
{
data1_absyn *absyn = data1_get_absyn(dh, name, 1);
data1_node *res;
+
if (!absyn)
{
yaz_log(YLOG_WARN, "Unable to acquire abstract syntax " "for '%s'",
for (;;)
{
data1_xattr *p;
- int len;
while (*amp || (c && d1_isspace(c)))
c = ampr (get_byte, fh, amp);
if (*amp == 0 && (c == 0 || c == '>' || c == '/'))
wrbuf_putc (wrbuf, c);
c = ampr (get_byte, fh, amp);
}
- wrbuf_putc (wrbuf, '\0');
- len = wrbuf_len(wrbuf);
- p->name = (char*) nmem_malloc (m, len);
- strcpy (p->name, wrbuf_buf(wrbuf));
+ p->name = nmem_strdup (m, wrbuf_cstr(wrbuf));
if (c == '=')
{
c = ampr (get_byte, fh, amp);
c = ampr (get_byte, fh, amp);
}
}
- wrbuf_putc (wrbuf, '\0');
- len = wrbuf_len(wrbuf);
- p->value = (char*) nmem_malloc (m, len);
- strcpy (p->value, wrbuf_buf(wrbuf));
+ p->value = nmem_strdup(m, wrbuf_cstr(wrbuf));
}
}
*ch = c;
data1_node *node;
node = data1_read_nodex(dh, m, getc_mem, (void *) (buf), wrbuf);
- wrbuf_free (wrbuf, 1);
+ wrbuf_destroy(wrbuf);
return node;
}
}
-static int conv_item (NMEM m, yaz_iconv_t t,
- WRBUF wrbuf, char *inbuf, size_t inlen)
+static int conv_item(NMEM m, yaz_iconv_t t,
+ WRBUF wrbuf, char *inbuf, size_t inlen)
{
- wrbuf_rewind (wrbuf);
- if (wrbuf->size < 10)
- wrbuf_grow (wrbuf, 10);
- for (;;)
- {
- char *outbuf = wrbuf->buf + wrbuf->pos;
- size_t outlen = wrbuf->size - wrbuf->pos;
- if (yaz_iconv (t, &inbuf, &inlen, &outbuf, &outlen) ==
- (size_t)(-1) && yaz_iconv_error(t) != YAZ_ICONV_E2BIG)
- {
- /* bad data. stop and skip conversion entirely */
- return -1;
- }
- else if (inlen == 0)
- { /* finished converting */
- wrbuf->pos = wrbuf->size - outlen;
- break;
- }
- else
- {
- /* buffer too small: make sure we expand buffer */
- wrbuf->pos = wrbuf->size - outlen;
- wrbuf_grow(wrbuf, 20);
- }
- }
+ wrbuf_rewind(wrbuf);
+ wrbuf_iconv_write(wrbuf, t, inbuf, inlen);
+ wrbuf_iconv_reset(wrbuf, t);
return 0;
}
conv_item(m, t, wrbuf, p->value, strlen(p->value))
== 0)
{
- wrbuf_puts (wrbuf, "");
- p->value = nmem_strdup (m, wrbuf->buf);
+ p->value = nmem_strdup(m, wrbuf_cstr(wrbuf));
}
}
}
}
int data1_iconv (data1_handle dh, NMEM m, data1_node *n,
- const char *tocode,
- const char *fromcode)
+ const char *tocode,
+ const char *fromcode)
{
if (yaz_matchstr (tocode, fromcode))
{
yaz_iconv_t t = yaz_iconv_open(tocode, fromcode);
if (!t)
{
- wrbuf_free(wrbuf, 1);
+ wrbuf_destroy(wrbuf);
return -1;
}
data1_iconv_s(dh, m, n, t, wrbuf, tocode);
yaz_iconv_close(t);
- wrbuf_free(wrbuf, 1);
+ wrbuf_destroy(wrbuf);
}
return 0;
}
+void data1_chop_text(data1_handle dh, NMEM m, data1_node *n)
+{
+ for (; n; n = n->next)
+ {
+ if (n->which == DATA1N_data)
+ {
+
+ int sz = n->u.data.len;
+ const char *ndata = n->u.data.data;
+ int off = 0;
+
+ for (off = 0; off < sz; off++)
+ if (!d1_isspace(ndata[off]))
+ break;
+ sz = sz - off;
+ ndata += off;
+
+ while (sz && d1_isspace(ndata[sz - 1]))
+ sz--;
+
+ n->u.data.data = nmem_malloc(m, sz);
+ n->u.data.len = sz;
+ memcpy(n->u.data.data, ndata, sz);
+
+ }
+ data1_chop_text(dh, m, n->child);
+ }
+}
+
void data1_concat_text(data1_handle dh, NMEM m, data1_node *n)
{
for (; n; n = n->next)
data1_concat_text(dh, m, n->child);
}
}
+
/*
* Local variables:
* c-basic-offset: 4