X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmarcdisp.c;h=2f5f0d513e9fdbd537b0b960bf9406464bb9364b;hb=9bf84c30a3d0e3e1d4b9136aee9c0a4b8ae769d2;hp=0dd8aaa2d80521d79b293ed4aea29635de68ac2e;hpb=3085741e28eb94029b230bb25e4926aed32daf29;p=yaz-moved-to-github.git diff --git a/src/marcdisp.c b/src/marcdisp.c index 0dd8aaa..2f5f0d5 100644 --- a/src/marcdisp.c +++ b/src/marcdisp.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2008 Index Data * See the file LICENSE for details. - * - * $Id: marcdisp.c,v 1.51 2007-09-20 17:22:45 adam Exp $ */ /** @@ -20,6 +18,7 @@ #include #include +#include #include #include #include @@ -33,6 +32,12 @@ #include #endif +enum yaz_collection_state { + no_collection, + collection_first, + collection_second +}; + /** \brief node types for yaz_marc_node */ enum YAZ_MARC_NODE_TYPE { @@ -85,6 +90,7 @@ struct yaz_marc_t_ { int xml; int debug; int write_using_libxml2; + enum yaz_collection_state enable_collection; yaz_iconv_t iconv_cd; char subfield_str[8]; char endline_str[8]; @@ -100,6 +106,7 @@ yaz_marc_t yaz_marc_create(void) mt->xml = YAZ_MARC_LINE; mt->debug = 0; mt->write_using_libxml2 = 0; + mt->enable_collection = no_collection; mt->m_wr = wrbuf_alloc(); mt->iconv_cd = 0; mt->leader_spec = 0; @@ -496,6 +503,28 @@ int yaz_marc_write_line(yaz_marc_t mt, WRBUF wr) return 0; } +int yaz_marc_write_trailer(yaz_marc_t mt, WRBUF wr) +{ + if (mt->enable_collection == collection_second) + { + switch(mt->xml) + { + case YAZ_MARC_MARCXML: + wrbuf_printf(wr, "\n"); + break; + case YAZ_MARC_XCHANGE: + wrbuf_printf(wr, "\n"); + break; + } + } + return 0; +} + +void yaz_marc_enable_collection(yaz_marc_t mt) +{ + mt->enable_collection = collection_first; +} + int yaz_marc_write_mode(yaz_marc_t mt, WRBUF wr) { switch(mt->xml) @@ -541,8 +570,18 @@ static int yaz_marc_write_marcxml_ns1(yaz_marc_t mt, WRBUF wr, return -1; if (!atoi_n_check(leader+11, 1, &identifier_length)) return -1; - - wrbuf_printf(wr, "enable_collection != no_collection) + { + if (mt->enable_collection == collection_first) + wrbuf_printf(wr, "\n", ns); + mt->enable_collection = collection_second; + wrbuf_printf(wr, "leader_spec) yaz_marc_modify_leader(mt, 9, "a"); return yaz_marc_write_marcxml_ns(mt, wr, "http://www.loc.gov/MARC21/slim", @@ -677,12 +718,12 @@ int yaz_marc_write_marcxchange(yaz_marc_t mt, WRBUF wr, } +#if YAZ_HAVE_XML2 int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, const char *ns, const char *format, const char *type) { -#if YAZ_HAVE_XML2 struct yaz_marc_node *n; int identifier_length; const char *leader = 0; @@ -787,10 +828,8 @@ int yaz_marc_write_xml(yaz_marc_t mt, xmlNode **root_ptr, } wrbuf_destroy(wr_cdata); return 0; -#else - return -1; -#endif } +#endif int yaz_marc_write_iso2709(yaz_marc_t mt, WRBUF wr) { @@ -968,6 +1007,11 @@ void yaz_marc_iconv(yaz_marc_t mt, yaz_iconv_t cd) mt->iconv_cd = cd; } +yaz_iconv_t yaz_marc_get_iconv(yaz_marc_t mt) +{ + return mt->iconv_cd; +} + void yaz_marc_modify_leader(yaz_marc_t mt, size_t off, const char *str) { struct yaz_marc_node *n;