X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Fmarcdisp.c;h=ede1c72e557559ea600c3f616f532460295d416a;hp=3e4e9d24215bc5c423df9afbcf4c87eee04e929c;hb=1121eeb134f61c6c2510143858db59045c1b6757;hpb=615dcec32011f62525931e5f04490ff7e721ea04 diff --git a/util/marcdisp.c b/util/marcdisp.c index 3e4e9d2..ede1c72 100644 --- a/util/marcdisp.c +++ b/util/marcdisp.c @@ -2,7 +2,7 @@ * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. * - * $Id: marcdisp.c,v 1.25 2002-12-09 23:32:29 adam Exp $ + * $Id: marcdisp.c,v 1.26 2002-12-16 13:13:53 adam Exp $ */ #if HAVE_CONFIG_H @@ -16,7 +16,89 @@ #include #include -int yaz_marc_decode (const char *buf, WRBUF wr, int debug, int bsize, int xml) +struct yaz_marc_t_ { + WRBUF wr; + WRBUF own_wr; + WRBUF user_wr; + int xml; + int debug; +}; + +yaz_marc_t yaz_marc_create(void) +{ + yaz_marc_t mt = xmalloc(sizeof(*mt)); + mt->xml = YAZ_MARC_LINE; + mt->debug = 0; + mt->wr = 0; + mt->own_wr = wrbuf_alloc(); + mt->user_wr = 0; + return mt; +} + +void yaz_marc_destroy(yaz_marc_t mt) +{ + if (!mt) + return ; + wrbuf_free (mt->own_wr, 1); + xfree (mt); +} + +static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len) +{ + size_t i; + for (i = 0; ixml) + { + switch (buf[i]) { + case '<': + wrbuf_puts(mt->wr, "<"); + break; + case '>': + wrbuf_puts(mt->wr, ">"); + break; + case '&': + wrbuf_puts(mt->wr, "&"); + break; + default: + wrbuf_putc(mt->wr, buf[i]); + } + } + else + wrbuf_putc(mt->wr, buf[i]); + } +} + +#if 0 +static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len) +{ + if (!mt->cd) + marc_cdata2 (mt, buf, len); + else + { + char outbuf[12]; + size_t inbytesleft = len; + const char *inp = buf; + + while (inbytesleft) + { + size_t outbytesleft = sizeof(outbuf); + char *outp = outbuf; + size_t r = yaz_iconv (mt->cd, (char**) &inp, &inbytesleft, + &outp, &outbytesleft); + if (r == (size_t) (-1)) + { + int e = yaz_iconv_error(mt->cd); + if (e != YAZ_ICONV_E2BIG) + break; + } + marc_cdata2 (mt, outbuf, outp - outbuf); + } + } +} +#endif + +static int yaz_marc_decode_int (yaz_marc_t mt, const char *buf, int bsize) { int entry_p; int record_length; @@ -27,15 +109,20 @@ int yaz_marc_decode (const char *buf, WRBUF wr, int debug, int bsize, int xml) int length_starting; int length_implementation; + if (!mt->wr) + mt->wr = mt->own_wr; + + wrbuf_rewind(mt->wr); + record_length = atoi_n (buf, 5); if (record_length < 25) { - if (debug) + if (mt->debug) { char str[40]; sprintf (str, "Record length %d - aborting\n", record_length); - wrbuf_puts (wr, str); + wrbuf_puts (mt->wr, str); } return -1; } @@ -56,28 +143,28 @@ int yaz_marc_decode (const char *buf, WRBUF wr, int debug, int bsize, int xml) length_starting = atoi_n (buf+21, 1); length_implementation = atoi_n (buf+22, 1); - if (xml) + if (mt->xml) { char str[80]; int i; - switch(xml) + switch(mt->xml) { - case YAZ_MARC_XML: - wrbuf_puts (wr, "wr, "wr, str); sprintf (str, " TypeOfRecord=\"%c\"\n", buf[6]); - wrbuf_puts (wr, str); + wrbuf_puts (mt->wr, str); for (i = 1; i<=19; i++) { sprintf (str, " ImplDefined%d=\"%c\"\n", i, buf[6+i]); - wrbuf_puts (wr, str); + wrbuf_puts (mt->wr, str); } - wrbuf_puts (wr, ">\n"); + wrbuf_puts (mt->wr, ">\n"); break; case YAZ_MARC_OAIMARC: wrbuf_puts( - wr, + mt->wr, "\n", buf[5], buf[6], buf[7]); - wrbuf_puts (wr, str); + wrbuf_puts (mt->wr, str); break; case YAZ_MARC_MARCXML: wrbuf_printf( - wr, + mt->wr, "\n" " %.24s\n", buf); break; } } - if (debug) + if (mt->debug) { char str[40]; - if (xml) - wrbuf_puts (wr, "\n"); + wrbuf_puts (mt->wr, str); + if (mt->xml) + wrbuf_puts (mt->wr, "-->\n"); } for (entry_p = 24; buf[entry_p] != ISO2709_FS; ) @@ -156,195 +243,235 @@ int yaz_marc_decode (const char *buf, WRBUF wr, int debug, int bsize, int xml) else if (!memcmp (tag, "00", 2)) identifier_flag = 0; - switch(xml) + switch(mt->xml) { case YAZ_MARC_LINE: - if (debug) - wrbuf_puts (wr, "Tag: "); - wrbuf_puts (wr, tag); - wrbuf_puts (wr, " "); + if (mt->debug) + wrbuf_puts (mt->wr, "Tag: "); + wrbuf_puts (mt->wr, tag); + wrbuf_puts (mt->wr, " "); break; - case YAZ_MARC_XML: - wrbuf_printf (wr, "wr, "wr, " wr, " wr, " wr, " xml) { case YAZ_MARC_LINE: - if (debug) - wrbuf_puts (wr, " Ind: "); - wrbuf_putc (wr, buf[i]); + if (mt->debug) + wrbuf_puts (mt->wr, " Ind: "); + wrbuf_putc (mt->wr, buf[i]); break; - case YAZ_MARC_XML: - wrbuf_printf (wr, " Indicator%d=\"%c\"", j+1, buf[i]); + case YAZ_MARC_SIMPLEXML: + wrbuf_printf (mt->wr, " Indicator%d=\"%c\"", j+1, buf[i]); break; case YAZ_MARC_OAIMARC: - wrbuf_printf (wr, " i%d=\"%c\"", j+1, buf[i]); + wrbuf_printf (mt->wr, " i%d=\"%c\"", j+1, buf[i]); break; case YAZ_MARC_MARCXML: - wrbuf_printf (wr, " ind%d=\"%c\"", j+1, buf[i]); + wrbuf_printf (mt->wr, " ind%d=\"%c\"", j+1, buf[i]); } } } - if (xml) + if (mt->xml) { - wrbuf_puts (wr, ">"); + wrbuf_puts (mt->wr, ">"); if (identifier_flag) - wrbuf_puts (wr, "\n"); + wrbuf_puts (mt->wr, "\n"); } else { - if (debug && !xml) - wrbuf_puts (wr, " Fields: "); + if (mt->debug && !mt->xml) + wrbuf_puts (mt->wr, " Fields: "); } - while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) - { - if (identifier_flag) - { - i++; - switch(xml) + if (identifier_flag) + { + while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) + { + int i0; + i++; + switch(mt->xml) { case YAZ_MARC_LINE: - wrbuf_puts (wr, " $"); + wrbuf_puts (mt->wr, " $"); for (j = 1; jwr, buf[i]); + wrbuf_putc (mt->wr, ' '); break; - case YAZ_MARC_XML: - wrbuf_puts (wr, " wr, " "); + wrbuf_putc (mt->wr, buf[i]); + wrbuf_puts (mt->wr, "\">"); break; case YAZ_MARC_OAIMARC: - wrbuf_puts (wr, " wr, " "); + wrbuf_putc (mt->wr, buf[i]); + wrbuf_puts (mt->wr, "\">"); break; case YAZ_MARC_MARCXML: - wrbuf_puts (wr, " wr, " "); + wrbuf_putc (mt->wr, buf[i]); + wrbuf_puts (mt->wr, "\">"); break; } - while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS && - buf[i] != ISO2709_FS && i < end_offset) - { - if (xml && buf[i] == '<') - wrbuf_puts(wr, "<"); - else if (xml && buf[i] == '&') - wrbuf_puts(wr, "&"); - else - wrbuf_putc (wr, buf[i]); - i++; - } - if (xml) - wrbuf_puts (wr, "\n"); - } - else - { - if (xml && buf[i] == '<') - wrbuf_puts(wr, "<"); - else if (xml && buf[i] == '&') - wrbuf_puts(wr, "&"); - else if (xml && buf[i] == '"') - wrbuf_puts(wr, """); - else - wrbuf_putc (wr, buf[i]); - i++; - } + i0 = i; + while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS && + buf[i] != ISO2709_FS && i < end_offset) + i++; + marc_cdata(mt, buf + i0, i - i0); + + if (mt->xml) + wrbuf_puts (mt->wr, "\n"); + } + } + else + { + int i0 = i; + while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) + i++; + marc_cdata(mt, buf + i0, i - i0); } - if (!xml) - wrbuf_putc (wr, '\n'); + if (!mt->xml) + wrbuf_putc (mt->wr, '\n'); if (i < end_offset) - wrbuf_puts (wr, " \n"); + wrbuf_puts (mt->wr, " \n"); if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS) - wrbuf_puts (wr, " \n"); - switch(xml) + wrbuf_puts (mt->wr, " \n"); + switch(mt->xml) { - case YAZ_MARC_LINE: - break; - case YAZ_MARC_XML: - wrbuf_puts (wr, "\n"); + case YAZ_MARC_SIMPLEXML: + wrbuf_puts (mt->wr, "\n"); break; case YAZ_MARC_OAIMARC: if (identifier_flag) - wrbuf_puts (wr, " \n"); + wrbuf_puts (mt->wr, " \n"); else - wrbuf_puts (wr, " \n"); + wrbuf_puts (mt->wr, " \n"); break; case YAZ_MARC_MARCXML: if (identifier_flag) - wrbuf_puts (wr, " \n"); + wrbuf_puts (mt->wr, " \n"); else - wrbuf_puts (wr, " \n"); + wrbuf_puts (mt->wr, " \n"); break; } } - switch(xml) + switch (mt->xml) { case YAZ_MARC_LINE: - wrbuf_puts (wr, ""); + wrbuf_puts (mt->wr, ""); break; - case YAZ_MARC_XML: - wrbuf_puts (wr, "\n"); + case YAZ_MARC_SIMPLEXML: + wrbuf_puts (mt->wr, "\n"); break; case YAZ_MARC_OAIMARC: - wrbuf_puts (wr, "\n"); + wrbuf_puts (mt->wr, "\n"); break; case YAZ_MARC_MARCXML: - wrbuf_puts (wr, "\n"); + wrbuf_puts (mt->wr, "\n"); break; } return record_length; } -int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, - int bsize) +int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize, + char **result, int *rsize) { - return yaz_marc_decode (buf, wr, debug, bsize, 0); + int r = yaz_marc_decode_int(mt, buf, bsize); + if (r > 0) + { + if (result) + *result = wrbuf_buf(mt->wr); + if (rsize) + *rsize = wrbuf_len(mt->wr); + } + return r; } -int marc_display_exl (const char *buf, FILE *outf, int debug, int length) +int yaz_marc_decode_wrbuf (yaz_marc_t mt, const char *buf, + int bsize, WRBUF wrbuf) { - int record_length; + mt->user_wr = wrbuf; + return yaz_marc_decode_int (mt, buf, bsize); +} + - WRBUF wrbuf = wrbuf_alloc (); - record_length = marc_display_wrbuf (buf, wrbuf, debug, length); +void yaz_marc_xml(yaz_marc_t mt, int xmlmode) +{ + if (mt) + mt->xml = xmlmode; +} + +void yaz_marc_debug(yaz_marc_t mt, int level) +{ + if (mt) + mt->debug = level; +} + +/* depricated */ +int yaz_marc_decode(const char *buf, WRBUF wr, int debug, int bsize, int xml) +{ + yaz_marc_t mt = yaz_marc_create(); + int r; + + mt->debug = debug; + mt->user_wr = wr; + mt->xml = xml; + r = yaz_marc_decode_int(mt, buf, bsize); + yaz_marc_destroy(mt); + return r; +} + +/* depricated */ +int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, int bsize) +{ + return yaz_marc_decode(buf, wr, debug, bsize, 0); +} + +/* depricated */ +int marc_display_exl (const char *buf, FILE *outf, int debug, int bsize) +{ + yaz_marc_t mt = yaz_marc_create(); + int r; + + mt->debug = debug; + r = yaz_marc_decode_int (mt, buf, bsize); if (!outf) outf = stdout; - if (record_length > 0) - fwrite (wrbuf_buf(wrbuf), 1, wrbuf_len(wrbuf), outf); - wrbuf_free (wrbuf, 1); - return record_length; + if (r > 0) + fwrite (wrbuf_buf(mt->wr), 1, wrbuf_len(mt->wr), outf); + yaz_marc_destroy(mt); + return r; } +/* depricated */ int marc_display_ex (const char *buf, FILE *outf, int debug) { return marc_display_exl (buf, outf, debug, -1); } +/* depricated */ int marc_display (const char *buf, FILE *outf) { return marc_display_ex (buf, outf, 0); } -