X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Fmarcread.c;h=86993736649018f1fef5ae29894bae1a9c99299e;hb=d42b3234a40e6d65397ad444b38fff3941afd1f6;hp=f3214ff52574a66ba8699536800b3f033a5a4fe2;hpb=f578ebbcfe51125d91358a98a79ab8411f38933f;p=idzebra-moved-to-github.git diff --git a/recctrl/marcread.c b/recctrl/marcread.c index f3214ff..8699373 100644 --- a/recctrl/marcread.c +++ b/recctrl/marcread.c @@ -1,5 +1,5 @@ -/* $Id: marcread.c,v 1.21 2003-08-21 10:29:00 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 +/* $Id: marcread.c,v 1.23 2003-12-10 23:30:15 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003 Index Data Aps This file is part of the Zebra server. @@ -113,7 +113,7 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p, int marc_xml) identifier_length = marctab->force_identifier_length; else identifier_length = atoi_n (buf+11, 1); - base_address = atoi_n (buf+12, 4); + base_address = atoi_n (buf+12, 5); length_data_entry = atoi_n (buf+20, 1); length_starting = atoi_n (buf+21, 1); @@ -210,37 +210,7 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p, int marc_xml) i0 = i; while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) { - - if (!memcmp(tag, "4", 1) && (!yaz_matchstr(absynName, "UNIMARC")|| - !yaz_matchstr(absynName, "RUSMARC"))) - { - int go = 1; - data1_node *res = - data1_mk_tag_n (p->dh, p->mem, - buf+i+1, identifier_length-1, - 0 /* attr */, parent); - i += identifier_length; - i0 = i; - do { - while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS && - buf[i] != ISO2709_FS && i < end_offset) - { - i++; - } - if (!memcmp(buf+i+1, "1", 1) && idh, p->mem, buf + i0, i - i0, res); - i0 = i; - } - else if (memcmp (tag, "00", 2) && identifier_length) + if (memcmp (tag, "00", 2) && identifier_length) { data1_node *res; if (marc_xml) @@ -340,7 +310,6 @@ static char *get_data(data1_node *n, int *len) *len = strlen(r); return r; } - static data1_node *lookup_subfield(data1_node *node, const char *name) { data1_node *p; @@ -433,15 +402,38 @@ static inline_subfield *cat_inline_subfield(mc_subfield *psf, char *buf, inline_ return pisf; } static void cat_inline_field(mc_field *pf, char *buf, data1_node *subfield) -{ - +{ if (!pf || !subfield) return; - for (;subfield; subfield = subfield->next) + for (;subfield;) { int len; - inline_field *pif = inline_parse(get_data(subfield,&len)); + inline_field *pif=NULL; + data1_node *psubf; + + if (yaz_matchstr(subfield->u.tag.tag, "1")) + { + subfield = subfield->next; + continue; + } + + psubf = subfield; + pif = inline_mk_field(); + do + { + int i; + if ((i=inline_parse(pif, psubf->u.tag.tag, get_data(psubf, &len)))<0) + { + logf(LOG_WARN, "inline subfield ($%s): parse error", + psubf->u.tag.tag); + inline_destroy_field(pif); + return; + } + psubf = psubf->next; + } while (psubf && yaz_matchstr(psubf->u.tag.tag, "1")); + + subfield = psubf; if (pif && !yaz_matchstr(pif->name, pf->name)) {