X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmarcdisp.c;h=e5fd62ee464bab483a1abb094a97cd46b6a88876;hb=4d377a28c907f9fee3f576f32d96020fb7a8436c;hp=1680ea50041ebae881550ae1da7111e656df842c;hpb=8456bd3e19e2d0f4694ad97ecdc737a82c3d0816;p=yaz-moved-to-github.git
diff --git a/src/marcdisp.c b/src/marcdisp.c
index 1680ea5..e5fd62e 100644
--- a/src/marcdisp.c
+++ b/src/marcdisp.c
@@ -2,7 +2,7 @@
* Copyright (C) 1995-2006, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: marcdisp.c,v 1.32 2006-08-01 09:28:04 adam Exp $
+ * $Id: marcdisp.c,v 1.34 2006-08-28 14:18:22 adam Exp $
*/
/**
@@ -87,6 +87,7 @@ struct yaz_marc_t_ {
yaz_iconv_t iconv_cd;
char subfield_str[8];
char endline_str[8];
+ char *leader_spec;
struct yaz_marc_node *nodes;
struct yaz_marc_node **nodes_pp;
struct yaz_marc_subfield **subfield_pp;
@@ -99,6 +100,7 @@ yaz_marc_t yaz_marc_create(void)
mt->debug = 0;
mt->m_wr = wrbuf_alloc();
mt->iconv_cd = 0;
+ mt->leader_spec = 0;
strcpy(mt->subfield_str, " $");
strcpy(mt->endline_str, "\n");
@@ -112,10 +114,15 @@ void yaz_marc_destroy(yaz_marc_t mt)
if (!mt)
return ;
nmem_destroy(mt->nmem);
- wrbuf_free (mt->m_wr, 1);
- xfree (mt);
+ wrbuf_free(mt->m_wr, 1);
+ xfree(mt->leader_spec);
+ xfree(mt);
}
+static int marc_exec_leader(const char *leader_spec, char *leader,
+ size_t size);
+
+
struct yaz_marc_node *yaz_marc_add_node(yaz_marc_t mt)
{
struct yaz_marc_node *n = nmem_malloc(mt->nmem, sizeof(*n));
@@ -158,6 +165,7 @@ void yaz_marc_add_leader(yaz_marc_t mt, const char *leader, size_t leader_len)
struct yaz_marc_node *n = yaz_marc_add_node(mt);
n->which = YAZ_MARC_LEADER;
n->u.leader = nmem_strdupn(mt->nmem, leader, leader_len);
+ marc_exec_leader(mt->leader_spec, n->u.leader, leader_len);
}
void yaz_marc_add_controlfield(yaz_marc_t mt, const char *tag,
@@ -422,15 +430,20 @@ int yaz_marc_write_line(yaz_marc_t mt, WRBUF wr)
wrbuf_puts (wr, mt->subfield_str);
wrbuf_iconv_write(wr, mt->iconv_cd, s->code_data,
using_code_len);
- wrbuf_printf(wr, " ");
+ 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--;
}
wrbuf_puts (wr, mt->endline_str);
break;
case YAZ_MARC_CONTROLFIELD:
- wrbuf_printf(wr, "%s ", n->u.controlfield.tag);
+ 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--;
wrbuf_puts (wr, mt->endline_str);
break;
case YAZ_MARC_COMMENT:
@@ -499,6 +512,7 @@ static int yaz_marc_write_marcxml_ns(yaz_marc_t mt, WRBUF wr,
for (n = mt->nodes; n; n = n->next)
{
struct yaz_marc_subfield *s;
+
switch(n->which)
{
case YAZ_MARC_DATAFIELD:
@@ -514,7 +528,7 @@ static int yaz_marc_write_marcxml_ns(yaz_marc_t mt, WRBUF wr,
wrbuf_printf(wr, " ind%d=\"", i+1);
wrbuf_iconv_write_cdata(wr, mt->iconv_cd,
n->u.datafield.indicator+i, 1);
- wrbuf_printf(wr, "\"");
+ wrbuf_iconv_puts(wr, mt->iconv_cd, "\"");
}
}
wrbuf_printf(wr, ">\n");
@@ -528,14 +542,15 @@ static int yaz_marc_write_marcxml_ns(yaz_marc_t mt, WRBUF wr,
:
cdata_one_character(mt, s->code_data);
- wrbuf_puts(wr, " iconv_cd, " iconv_cd,
s->code_data, using_code_len);
- wrbuf_puts(wr, "\">");
+ wrbuf_iconv_puts(wr, mt->iconv_cd, "\">");
wrbuf_iconv_write_cdata(wr, mt->iconv_cd,
s->code_data + using_code_len,
strlen(s->code_data + using_code_len));
- wrbuf_puts(wr, "\n");
+ wrbuf_iconv_puts(wr, mt->iconv_cd, "");
+ wrbuf_puts(wr, "\n");
}
wrbuf_printf(wr, " \n");
break;
@@ -543,9 +558,10 @@ static int yaz_marc_write_marcxml_ns(yaz_marc_t mt, WRBUF wr,
wrbuf_printf(wr, " iconv_cd, n->u.controlfield.tag,
strlen(n->u.controlfield.tag));
- wrbuf_printf(wr, "\">");
+ wrbuf_iconv_puts(wr, mt->iconv_cd, "\">");
wrbuf_iconv_puts(wr, mt->iconv_cd, n->u.controlfield.data);
- wrbuf_printf(wr, "\n");
+ wrbuf_iconv_puts(wr, mt->iconv_cd, "");
+ wrbuf_puts(wr, "\n");
break;
case YAZ_MARC_COMMENT:
wrbuf_printf(wr, "