* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: marcdisp.c,v 1.42 2007-01-03 08:42:15 adam Exp $
+ * $Id: marcdisp.c,v 1.51 2007-09-20 17:22:45 adam Exp $
*/
/**
#include <yaz/wrbuf.h>
#include <yaz/yaz-util.h>
#include <yaz/nmem_xml.h>
+#include <yaz/snprintf.h>
#if YAZ_HAVE_XML2
#include <libxml/parser.h>
if (!mt)
return ;
nmem_destroy(mt->nmem);
- wrbuf_free(mt->m_wr, 1);
+ wrbuf_destroy(mt->m_wr);
xfree(mt->leader_spec);
xfree(mt);
}
return mt->nmem;
}
+static void marc_iconv_reset(yaz_marc_t mt, WRBUF wr)
+{
+ wrbuf_iconv_reset(wr, mt->iconv_cd);
+}
+
static int marc_exec_leader(const char *leader_spec, char *leader,
size_t size);
static struct yaz_marc_node *yaz_marc_add_node(yaz_marc_t mt)
{
- struct yaz_marc_node *n = nmem_malloc(mt->nmem, sizeof(*n));
+ struct yaz_marc_node *n = (struct yaz_marc_node *)
+ nmem_malloc(mt->nmem, sizeof(*n));
n->next = 0;
*mt->nodes_pp = n;
mt->nodes_pp = &n->next;
{
va_list ap;
char buf[200];
- va_start(ap, fmt);
-#ifdef WIN32
- _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
-#else
-/* !WIN32 */
-#if HAVE_VSNPRINTF
- vsnprintf(buf, sizeof(buf), fmt, ap);
-#else
- vsprintf(buf, fmt, ap);
-#endif
-#endif
-/* WIN32 */
+ va_start(ap, fmt);
+ yaz_vsnprintf(buf, sizeof(buf)-1, fmt, ap);
yaz_marc_add_comment(mt, buf);
va_end (ap);
}
if (mt->subfield_pp)
{
- struct yaz_marc_subfield *n = nmem_malloc(mt->nmem, sizeof(*n));
+ struct yaz_marc_subfield *n = (struct yaz_marc_subfield *)
+ nmem_malloc(mt->nmem, sizeof(*n));
n->code_data = nmem_strdupn(mt->nmem, code_data, code_data_len);
n->next = 0;
/* mark subfield_pp to point to this one, so we append here next */
wrbuf_iconv_puts(wr, mt->iconv_cd, " ");
wrbuf_iconv_puts(wr, mt->iconv_cd,
s->code_data + using_code_len);
- wrbuf_iconv_puts(wr, mt->iconv_cd, " ");
- wr->pos--;
+ marc_iconv_reset(mt, wr);
}
wrbuf_puts (wr, mt->endline_str);
break;
wrbuf_printf(wr, "%s", n->u.controlfield.tag);
wrbuf_iconv_puts(wr, mt->iconv_cd, " ");
wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data);
- wrbuf_iconv_puts(wr, mt->iconv_cd, " ");
- wr->pos--;
+ marc_iconv_reset(mt, wr);
wrbuf_puts (wr, mt->endline_str);
break;
case YAZ_MARC_COMMENT:
wrbuf_puts(wr, "(");
wrbuf_iconv_write(wr, mt->iconv_cd,
n->u.comment, strlen(n->u.comment));
+ marc_iconv_reset(mt, wr);
wrbuf_puts(wr, ")\n");
break;
case YAZ_MARC_LEADER:
wrbuf_iconv_write_cdata(wr, mt->iconv_cd,
s->code_data + using_code_len,
strlen(s->code_data + using_code_len));
+ marc_iconv_reset(mt, wr);
wrbuf_iconv_puts(wr, mt->iconv_cd, "</subfield>");
wrbuf_puts(wr, "\n");
}
wrbuf_iconv_write_cdata(wr, mt->iconv_cd, n->u.controlfield.tag,
strlen(n->u.controlfield.tag));
wrbuf_iconv_puts(wr, mt->iconv_cd, "\">");
- wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data);
+ wrbuf_iconv_write_cdata(wr, mt->iconv_cd,
+ n->u.controlfield.data,
+ strlen(n->u.controlfield.data));
+
+ marc_iconv_reset(mt, wr);
wrbuf_iconv_puts(wr, mt->iconv_cd, "</controlfield>");
wrbuf_puts(wr, "\n");
break;
{
if (mt->write_using_libxml2)
{
+#if YAZ_HAVE_XML2
int ret;
xmlNode *root_ptr;
xmlFreeDoc(doc);
}
return ret;
+#else
+ return -1;
+#endif
}
else
return yaz_marc_write_marcxml_ns1(mt, wr, ns, format, type);
const char *leader = 0;
xmlNode *record_ptr;
xmlNsPtr ns_record;
+ WRBUF wr_cdata = 0;
for (n = mt->nodes; n; n = n->next)
if (n->which == YAZ_MARC_LEADER)
if (!atoi_n_check(leader+11, 1, &identifier_length))
return -1;
+ wr_cdata = wrbuf_alloc();
+
record_ptr = xmlNewNode(0, BAD_CAST "record");
*root_ptr = record_ptr;
}
for (s = n->u.datafield.subfields; s; s = s->next)
{
- char code_val[8];
-
xmlNode *ptr_subfield;
/* if identifier length is 2 (most MARCs),
the code is a single character .. However we've
:
cdata_one_character(mt, s->code_data);
- if (using_code_len >= sizeof(code_val)-1)
- continue;
-
+ wrbuf_rewind(wr_cdata);
+ wrbuf_iconv_puts(wr_cdata, mt->iconv_cd,
+ s->code_data + using_code_len);
+ marc_iconv_reset(mt, wr_cdata);
ptr_subfield = xmlNewTextChild(
ptr, ns_record,
- BAD_CAST "subfield",
- BAD_CAST (s->code_data + using_code_len));
-
- memcpy(code_val, s->code_data, using_code_len);
- code_val[using_code_len] = '\0';
+ BAD_CAST "subfield", BAD_CAST wrbuf_cstr(wr_cdata));
- xmlNewProp(ptr_subfield, BAD_CAST "code", BAD_CAST code_val);
+ wrbuf_rewind(wr_cdata);
+ wrbuf_iconv_write(wr_cdata, mt->iconv_cd,
+ s->code_data, using_code_len);
+ xmlNewProp(ptr_subfield, BAD_CAST "code",
+ BAD_CAST wrbuf_cstr(wr_cdata));
}
break;
case YAZ_MARC_CONTROLFIELD:
+ wrbuf_rewind(wr_cdata);
+ wrbuf_iconv_puts(wr_cdata, mt->iconv_cd, n->u.controlfield.data);
+ marc_iconv_reset(mt, wr_cdata);
+
ptr = xmlNewTextChild(record_ptr, ns_record,
BAD_CAST "controlfield",
- BAD_CAST n->u.controlfield.data);
+ BAD_CAST wrbuf_cstr(wr_cdata));
xmlNewProp(ptr, BAD_CAST "tag", BAD_CAST n->u.controlfield.tag);
break;
break;
}
}
+ wrbuf_destroy(wr_cdata);
return 0;
#else
return -1;
/* write dummy IDFS + content */
wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' ');
wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd, s->code_data);
+ marc_iconv_reset(mt, wr_data_tmp);
}
/* write dummy FS (makes MARC-8 to become ASCII) */
wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' ');
+ marc_iconv_reset(mt, wr_data_tmp);
data_length += wrbuf_len(wr_data_tmp);
break;
case YAZ_MARC_CONTROLFIELD:
wrbuf_rewind(wr_data_tmp);
wrbuf_iconv_puts(wr_data_tmp, mt->iconv_cd,
n->u.controlfield.data);
+ marc_iconv_reset(mt, wr_data_tmp);
wrbuf_iconv_putchar(wr_data_tmp, mt->iconv_cd, ' ');/* field sep */
+ marc_iconv_reset(mt, wr_data_tmp);
data_length += wrbuf_len(wr_data_tmp);
break;
case YAZ_MARC_COMMENT:
wrbuf_write(wr, wrbuf_buf(wr_head), 24);
wrbuf_write(wr, wrbuf_buf(wr_dir), wrbuf_len(wr_dir));
- wrbuf_free(wr_head, 1);
- wrbuf_free(wr_dir, 1);
- wrbuf_free(wr_data_tmp, 1);
+ wrbuf_destroy(wr_head);
+ wrbuf_destroy(wr_dir);
+ wrbuf_destroy(wr_data_tmp);
for (n = mt->nodes; n; n = n->next)
{
{
wrbuf_putc(wr, ISO2709_IDFS);
wrbuf_iconv_puts(wr, mt->iconv_cd, s->code_data);
- /* write dummy blank - makes MARC-8 to become ASCII */
- wrbuf_iconv_putchar(wr, mt->iconv_cd, ' ');
- wr->pos--;
+ marc_iconv_reset(mt, wr);
}
wrbuf_putc(wr, ISO2709_FS);
break;
case YAZ_MARC_CONTROLFIELD:
wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data);
- /* write dummy blank - makes MARC-8 to become ASCII */
- wrbuf_iconv_putchar(wr, mt->iconv_cd, ' ');
- wr->pos--;
+ marc_iconv_reset(mt, wr);
wrbuf_putc(wr, ISO2709_FS);
break;
case YAZ_MARC_COMMENT:
}
int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize,
- char **result, int *rsize)
+ const char **result, size_t *rsize)
{
int r;
wrbuf_rewind(mt->m_wr);
r = yaz_marc_decode_wrbuf(mt, buf, bsize, mt->m_wr);
if (result)
- *result = wrbuf_buf(mt->m_wr);
+ *result = wrbuf_cstr(mt->m_wr);
if (rsize)
*rsize = wrbuf_len(mt->m_wr);
return r;
}
}
-/* deprecated */
-int yaz_marc_decode(const char *buf, WRBUF wr, int debug, int bsize, int xml)
-{
- yaz_marc_t mt = yaz_marc_create();
- int r;
-
- mt->debug = debug;
- mt->xml = xml;
- r = yaz_marc_decode_wrbuf(mt, buf, bsize, wr);
- yaz_marc_destroy(mt);
- return r;
-}
-
-/* deprecated */
-int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, int bsize)
-{
- return yaz_marc_decode(buf, wr, debug, bsize, 0);
-}
-
-/* deprecated */
-int marc_display_exl (const char *buf, FILE *outf, int debug, int bsize)
-{
- yaz_marc_t mt = yaz_marc_create();
- int r;
-
- mt->debug = debug;
- r = yaz_marc_decode_wrbuf (mt, buf, bsize, mt->m_wr);
- if (!outf)
- outf = stdout;
- if (r > 0)
- fwrite (wrbuf_buf(mt->m_wr), 1, wrbuf_len(mt->m_wr), outf);
- yaz_marc_destroy(mt);
- return r;
-}
-
-/* deprecated */
-int marc_display_ex (const char *buf, FILE *outf, int debug)
-{
- return marc_display_exl (buf, outf, debug, -1);
-}
-
-/* deprecated */
-int marc_display (const char *buf, FILE *outf)
-{
- return marc_display_ex (buf, outf, 0);
-}
-
int yaz_marc_leader_spec(yaz_marc_t mt, const char *leader_spec)
{
xfree(mt->leader_spec);