X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdisp.c;h=9156281d8dd8214f7c454f9b0b20561194d6835f;hb=c39a893dfdae5f792139177132e7e7a70e010aa7;hp=b28c88e52a85176ca36cfb365fe266fc5700b5aa;hpb=a57b3c893b5eac42f8351f39331c7188e3abcd99;p=yaz-moved-to-github.git diff --git a/util/marcdisp.c b/util/marcdisp.c index b28c88e..9156281 100644 --- a/util/marcdisp.c +++ b/util/marcdisp.c @@ -1,58 +1,8 @@ /* - * Copyright (c) 1995-2001, Index Data + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Log: marcdisp.c,v $ - * Revision 1.16 2002-01-22 10:54:46 adam - * MARC decode fix. Attribute set fix for scan in server. Prox logging. - * - * Revision 1.15 2001/10/29 09:17:19 adam - * New function marc_display_exl - used by YAZ client. Server returns - * bad record on position 98 (for testing). - * - * Revision 1.14 2001/10/23 21:00:20 adam - * Old Z39.50 codecs gone. Added ZOOM. WRBUF MARC display util. - * - * Revision 1.13 2001/10/15 19:36:48 adam - * New function marc_display_wrbuf. - * - * Revision 1.12 2000/10/02 11:07:44 adam - * Added peer_name member for bend_init handler. Changed the YAZ - * client so that tcp: can be avoided in target spec. - * - * Revision 1.11 2000/02/29 13:44:55 adam - * Check for config.h (currently not generated). - * - * Revision 1.10 2000/02/05 10:47:19 adam - * Identifier-length and indicator-lenght no longer set to 2 (forced). - * - * Revision 1.9 1999/12/21 16:24:48 adam - * More robust ISO2709 handling (in case of real bad formats). - * - * Revision 1.8 1999/11/30 13:47:12 adam - * Improved installation. Moved header files to include/yaz. - * - * Revision 1.7 1997/09/24 13:29:40 adam - * Added verbose option -v to marcdump utility. - * - * Revision 1.6 1997/09/04 07:52:27 adam - * Moved atoi_n function to separate source file. - * - * Revision 1.5 1997/05/01 15:08:15 adam - * Added log_mask_str_x routine. - * - * Revision 1.4 1995/09/29 17:12:34 quinn - * Smallish - * - * Revision 1.3 1995/09/27 15:03:03 quinn - * Modified function heads & prototypes. - * - * Revision 1.2 1995/05/16 08:51:12 quinn - * License, documentation, and memory fixes - * - * Revision 1.1 1995/04/10 10:28:46 quinn - * Added copy of CCL and MARC display - * + * $Id: marcdisp.c,v 1.29 2003-02-12 22:02:47 adam Exp $ */ #if HAVE_CONFIG_H @@ -66,8 +16,85 @@ #include #include -int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, - int bsize) +struct yaz_marc_t_ { + WRBUF m_wr; + int xml; + int debug; +}; + +yaz_marc_t yaz_marc_create(void) +{ + yaz_marc_t mt = (yaz_marc_t) xmalloc(sizeof(*mt)); + mt->xml = YAZ_MARC_LINE; + mt->debug = 0; + mt->m_wr = wrbuf_alloc(); + return mt; +} + +void yaz_marc_destroy(yaz_marc_t mt) +{ + if (!mt) + return ; + wrbuf_free (mt->m_wr, 1); + xfree (mt); +} + +static void marc_cdata (yaz_marc_t mt, const char *buf, size_t len, WRBUF wr) +{ + size_t i; + for (i = 0; ixml) + { + switch (buf[i]) { + case '<': + wrbuf_puts(wr, "<"); + break; + case '>': + wrbuf_puts(wr, ">"); + break; + case '&': + wrbuf_puts(wr, "&"); + break; + default: + wrbuf_putc(wr, buf[i]); + } + } + else + wrbuf_putc(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 + +int yaz_marc_decode_wrbuf (yaz_marc_t mt, const char *buf, int bsize, WRBUF wr) { int entry_p; int record_length; @@ -78,10 +105,12 @@ int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, int length_starting; int length_implementation; + wrbuf_rewind(wr); + record_length = atoi_n (buf, 5); if (record_length < 25) { - if (debug) + if (mt->debug) { char str[40]; @@ -107,9 +136,54 @@ int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, length_starting = atoi_n (buf+21, 1); length_implementation = atoi_n (buf+22, 1); - if (debug) + if (mt->xml) + { + char str[80]; + int i; + switch(mt->xml) + { + case YAZ_MARC_SIMPLEXML: + wrbuf_puts (wr, "\n"); + break; + case YAZ_MARC_OAIMARC: + wrbuf_puts( + wr, + "\n", + buf[5], buf[6], buf[7]); + wrbuf_puts (wr, str); + break; + case YAZ_MARC_MARCXML: + wrbuf_printf( + wr, + "\n" + " %.24s\n", buf); + break; + } + } + if (mt->debug) { char str[40]; + + if (mt->xml) + wrbuf_puts (wr, "\n"); } + for (entry_p = 24; buf[entry_p] != ISO2709_FS; ) { entry_p += 3+length_data_entry+length_starting; @@ -139,84 +216,246 @@ int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, int end_offset; int i, j; char tag[4]; + int identifier_flag = 1; memcpy (tag, buf+entry_p, 3); entry_p += 3; tag[3] = '\0'; - if (debug) - wrbuf_puts (wr, "Tag: "); - wrbuf_puts (wr, tag); - wrbuf_puts (wr, " "); data_length = atoi_n (buf+entry_p, length_data_entry); entry_p += length_data_entry; data_offset = atoi_n (buf+entry_p, length_starting); entry_p += length_starting; i = data_offset + base_address; end_offset = i+data_length-1; - if (debug) - wrbuf_puts (wr, " Ind: "); - if (memcmp (tag, "00", 2) && indicator_length) + + if (indicator_length < 4 && indicator_length > 0) + { + if (buf[i + indicator_length] != ISO2709_IDFS) + identifier_flag = 0; + } + else if (!memcmp (tag, "00", 2)) + identifier_flag = 0; + + switch(mt->xml) + { + case YAZ_MARC_LINE: + if (mt->debug) + wrbuf_puts (wr, "Tag: "); + wrbuf_puts (wr, tag); + wrbuf_puts (wr, " "); + break; + case YAZ_MARC_SIMPLEXML: + wrbuf_printf (wr, "xml) + { + case YAZ_MARC_LINE: + if (mt->debug) + wrbuf_puts (wr, " Ind: "); + wrbuf_putc (wr, buf[i]); + break; + case YAZ_MARC_SIMPLEXML: + wrbuf_printf (wr, " Indicator%d=\"%c\"", j+1, buf[i]); + break; + case YAZ_MARC_OAIMARC: + wrbuf_printf (wr, " i%d=\"%c\"", j+1, buf[i]); + break; + case YAZ_MARC_MARCXML: + wrbuf_printf (wr, " ind%d=\"%c\"", j+1, buf[i]); + } + } } - if (debug) - wrbuf_puts (wr, " Fields: "); - while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) - { - if (memcmp (tag, "00", 2) && identifier_length) - { - i++; - wrbuf_puts (wr, " $"); - for (j = 1; jxml) + { + wrbuf_puts (wr, ">"); + if (identifier_flag) + wrbuf_puts (wr, "\n"); + } + else + { + if (mt->debug && !mt->xml) + wrbuf_puts (wr, " Fields: "); + } + 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, " $"); + for (j = 1; j"); + break; + case YAZ_MARC_OAIMARC: + wrbuf_puts (wr, " "); + break; + case YAZ_MARC_MARCXML: + wrbuf_puts (wr, " "); + break; + } + 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, wr); + + if (mt->xml) + wrbuf_puts (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, wr); } - wrbuf_putc (wr, '\n'); + if (!mt->xml) + wrbuf_putc (wr, '\n'); if (i < end_offset) - wrbuf_puts (wr, "-- separator but not at end of field\n"); + wrbuf_puts (wr, " \n"); if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS) - wrbuf_puts (wr, "-- no separator at end of field\n"); + wrbuf_puts (wr, " \n"); + switch(mt->xml) + { + case YAZ_MARC_SIMPLEXML: + wrbuf_puts (wr, "\n"); + break; + case YAZ_MARC_OAIMARC: + if (identifier_flag) + wrbuf_puts (wr, " \n"); + else + wrbuf_puts (wr, " \n"); + break; + case YAZ_MARC_MARCXML: + if (identifier_flag) + wrbuf_puts (wr, " \n"); + else + wrbuf_puts (wr, " \n"); + break; + } + } + switch (mt->xml) + { + case YAZ_MARC_LINE: + wrbuf_puts (wr, ""); + break; + case YAZ_MARC_SIMPLEXML: + wrbuf_puts (wr, "\n"); + break; + case YAZ_MARC_OAIMARC: + wrbuf_puts (wr, "\n"); + break; + case YAZ_MARC_MARCXML: + wrbuf_puts (wr, "\n"); + break; } - wrbuf_puts (wr, ""); return record_length; } -int marc_display_exl (const char *buf, FILE *outf, int debug, int length) +int yaz_marc_decode_buf (yaz_marc_t mt, const char *buf, int bsize, + char **result, int *rsize) { - int record_length; + int r = yaz_marc_decode_wrbuf(mt, buf, bsize, mt->m_wr); + if (r > 0) + { + if (result) + *result = wrbuf_buf(mt->m_wr); + if (rsize) + *rsize = wrbuf_len(mt->m_wr); + } + return r; +} + +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->xml = xml; + r = yaz_marc_decode_wrbuf(mt, buf, bsize, wr); + yaz_marc_destroy(mt); + return r; +} - WRBUF wrbuf = wrbuf_alloc (); - record_length = marc_display_wrbuf (buf, wrbuf, debug, length); +/* 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_wrbuf (mt, buf, bsize, mt->m_wr); 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->m_wr), 1, wrbuf_len(mt->m_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); } -