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, "