X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Fmarcread.c;fp=recctrl%2Fmarcread.c;h=f3214ff52574a66ba8699536800b3f033a5a4fe2;hb=f578ebbcfe51125d91358a98a79ab8411f38933f;hp=ea1abd471112e13ca4cca36f88a7cd49ec4da7e3;hpb=03e275196b3f82415a965d0bdd6bfa52a15d7446;p=idzebra-moved-to-github.git diff --git a/recctrl/marcread.c b/recctrl/marcread.c index ea1abd4..f3214ff 100644 --- a/recctrl/marcread.c +++ b/recctrl/marcread.c @@ -1,4 +1,4 @@ -/* $Id: marcread.c,v 1.20 2003-03-05 16:43:31 adam Exp $ +/* $Id: marcread.c,v 1.21 2003-08-21 10:29:00 adam Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -34,7 +34,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define MARC_DEBUG 0 #define MARCOMP_DEBUG 0 -static data1_node *grs_read_iso2709 (struct grs_read_info *p) +static data1_node *grs_read_iso2709 (struct grs_read_info *p, int marc_xml) { char buf[100000]; int entry_p; @@ -83,7 +83,18 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p) yaz_log (LOG_WARN, "cannot read MARC without an abstract syntax"); return 0; } - res_top = data1_mk_tag (p->dh, p->mem, absynName, 0, res_root); + if (marc_xml) + { + data1_node *lead; + const char *attr[] = { "xmlns", "http://www.loc.gov/MARC21/slim", 0}; + + res_top = data1_mk_tag (p->dh, p->mem, "record", attr, res_root); + + lead = data1_mk_tag(p->dh, p->mem, "leader", 0, res_top); + data1_mk_text_n(p->dh, p->mem, buf, 24, lead); + } + else + res_top = data1_mk_tag (p->dh, p->mem, absynName, 0, res_root); if ((marctab = res_root->u.root.absyn->marc)) { @@ -125,10 +136,11 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p) entry_p += 3; tag[3] = '\0'; - - /* generate field node */ - res = data1_mk_tag_n (p->dh, p->mem, tag, 3, 0 /* attr */, parent); - + if (marc_xml) + res = parent; + else + res = data1_mk_tag_n (p->dh, p->mem, tag, 3, 0 /* attr */, parent); + #if MARC_DEBUG fprintf (outf, "%s ", tag); #endif @@ -142,17 +154,57 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p) if (memcmp (tag, "00", 2) && indicator_length) { /* generate indicator node */ + if (marc_xml) + { + const char *attr[10]; + int j; + + attr[0] = "tag"; + attr[1] = tag; + attr[2] = 0; + + res = data1_mk_tag(p->dh, p->mem, "datafield", attr, res); + + for (j = 0; jdh, p->mem, res, attr); + } + } + else + { #if MARC_DEBUG - int j; + int j; #endif - res = data1_mk_tag_n (p->dh, p->mem, - buf+i, indicator_length, 0 /* attr */, res); + res = data1_mk_tag_n (p->dh, p->mem, + buf+i, indicator_length, 0 /* attr */, res); #if MARC_DEBUG - for (j = 0; jdh, p->mem, "controlfield", attr, res); + } + } parent = res; /* traverse sub fields */ i0 = i; @@ -190,10 +242,28 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p) } else if (memcmp (tag, "00", 2) && identifier_length) { - data1_node *res = - data1_mk_tag_n (p->dh, p->mem, - buf+i+1, identifier_length-1, - 0 /* attr */, parent); + data1_node *res; + if (marc_xml) + { + int j; + const char *attr[3]; + char code[10]; + + for (j = 1; jdh, p->mem, "subfield", + attr, parent); + } + else + { + res = data1_mk_tag_n (p->dh, p->mem, + buf+i+1, identifier_length-1, + 0 /* attr */, parent); + } #if MARC_DEBUG fprintf (outf, " $"); for (j = 1; ju.root.absyn->main_elements; e; e=e->next) + { + data1_tag *tag = e->tag; + + if (tag && tag->which == DATA1T_string && + !yaz_matchstr(tag->value.string, "mc?")) + parse_data1_tree(p, tag->value.string, root); + } + return root; +} + + data1_node *grs_read_marc(struct grs_read_info *p) { - data1_node *root = grs_read_iso2709(p); + data1_node *root = grs_read_iso2709(p, 0); data1_element *e; if (!root) @@ -677,3 +767,12 @@ static struct recTypeGrs marc_type = { }; RecTypeGrs recTypeGrs_marc = &marc_type; + +static struct recTypeGrs marcxml_type = { + "marcxml", + grs_init_marc, + grs_destroy_marc, + grs_read_marcxml +}; + +RecTypeGrs recTypeGrs_marcxml = &marcxml_type;