X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdisp.c;h=7cadfcdf13ccc826cd282cb859a5060a4d44f1d5;hb=366dc7568281c9774cd309b28c24a077604264a0;hp=3806681cc0f0338324b6a972679a64cb8e662296;hpb=d9ee01635f03f9095a66f71b73580560d48798e8;p=yaz-moved-to-github.git diff --git a/util/marcdisp.c b/util/marcdisp.c index 3806681..7cadfcd 100644 --- a/util/marcdisp.c +++ b/util/marcdisp.c @@ -1,42 +1,22 @@ /* - * Copyright (c) 1995, Index Data + * Copyright (c) 1995-2002, Index Data * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: marcdisp.c,v $ - * 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.24 2002-12-03 10:03:27 adam Exp $ */ +#if HAVE_CONFIG_H +#include +#endif + #include #include #include #include +#include #include -int marc_display_ex (const char *buf, FILE *outf, int debug) +int yaz_marc_decode (const char *buf, WRBUF wr, int debug, int bsize, int xml) { int entry_p; int record_length; @@ -47,33 +27,108 @@ int marc_display_ex (const char *buf, FILE *outf, int debug) int length_starting; int length_implementation; - if (!outf) - outf = stdout; record_length = atoi_n (buf, 5); if (record_length < 25) + { + if (debug) + { + char str[40]; + + sprintf (str, "Record length %d - aborting\n", record_length); + wrbuf_puts (wr, str); + } return -1; - indicator_length = atoi_n (buf+10, 1); - identifier_length = atoi_n (buf+11, 1); - base_address = atoi_n (buf+12, 4); - - indicator_length = identifier_length = 2; + } + /* ballout if bsize is known and record_length is than that */ + if (bsize != -1 && record_length > bsize) + return -1; + if (isdigit(buf[10])) + indicator_length = atoi_n (buf+10, 1); + else + indicator_length = 2; + if (isdigit(buf[11])) + identifier_length = atoi_n (buf+11, 1); + else + identifier_length = 2; + base_address = atoi_n (buf+12, 5); length_data_entry = atoi_n (buf+20, 1); length_starting = atoi_n (buf+21, 1); length_implementation = atoi_n (buf+22, 1); + if (xml) + { + char str[80]; + int i; + switch(xml) + { + case YAZ_MARC_XML: + 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" + " \n" + " %.24s\n", buf); + break; + } + } if (debug) { - fprintf (outf, "Record length %5d\n", record_length); - fprintf (outf, "Indicator length %5d\n", indicator_length); - fprintf (outf, "Identifier length %5d\n", identifier_length); - fprintf (outf, "Base address %5d\n", base_address); - fprintf (outf, "Length data entry %5d\n", length_data_entry); - fprintf (outf, "Length starting %5d\n", length_starting); - fprintf (outf, "Length implementation %5d\n", length_implementation); + char str[40]; + + if (xml) + wrbuf_puts (wr, "\n"); } + for (entry_p = 24; buf[entry_p] != ISO2709_FS; ) + { entry_p += 3+length_data_entry+length_starting; + if (entry_p >= record_length) + return -1; + } base_address = entry_p+1; for (entry_p = 24; buf[entry_p] != ISO2709_FS; ) { @@ -82,53 +137,212 @@ int marc_display_ex (const char *buf, FILE *outf, 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) - fprintf (outf, "Tag: "); - fprintf (outf, "%s ", tag); 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) - fprintf (outf, " 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(xml) + { + case YAZ_MARC_LINE: + if (debug) + wrbuf_puts (wr, "Tag: "); + wrbuf_puts (wr, tag); + wrbuf_puts (wr, " "); + break; + case YAZ_MARC_XML: + wrbuf_printf (wr, ""); + if (identifier_flag) + wrbuf_puts (wr, "\n"); + } + else + { + if (debug && !xml) + wrbuf_puts (wr, " Fields: "); + } while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset) { - if (memcmp (tag, "00", 2) && identifier_length) + if (identifier_flag) { i++; - fprintf (outf, " $"); - for (j = 1; j"); + break; + case YAZ_MARC_OAIMARC: + wrbuf_puts (wr, " "); + break; + case YAZ_MARC_MARCXML: + wrbuf_puts (wr, " "); + break; + } while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS && buf[i] != ISO2709_FS && i < end_offset) - fprintf (outf, "%c", buf[i++]); + { + 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 - fprintf (outf, "%c", buf[i++]); + { + 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++; + } } - fprintf (outf, "\n"); + if (!xml) + wrbuf_putc (wr, '\n'); if (i < end_offset) - fprintf (outf, "-- separator but not at end of field\n"); + wrbuf_puts (wr, " \n"); if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS) - fprintf (outf, "-- no separator at end of field\n"); + wrbuf_puts (wr, " \n"); + switch(xml) + { + case YAZ_MARC_LINE: + break; + case YAZ_MARC_XML: + 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(xml) + { + case YAZ_MARC_LINE: + wrbuf_puts (wr, ""); + break; + case YAZ_MARC_XML: + wrbuf_puts (wr, "\n"); + break; + case YAZ_MARC_OAIMARC: + wrbuf_puts (wr, "\n"); + break; + case YAZ_MARC_MARCXML: + wrbuf_puts (wr, " \n\n"); + break; + } + return record_length; +} + +int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, + int bsize) +{ + return yaz_marc_decode (buf, wr, debug, bsize, 0); +} + +int marc_display_exl (const char *buf, FILE *outf, int debug, int length) +{ + int record_length; + + WRBUF wrbuf = wrbuf_alloc (); + record_length = marc_display_wrbuf (buf, wrbuf, debug, length); + if (!outf) + outf = stdout; + if (record_length > 0) + fwrite (wrbuf_buf(wrbuf), 1, wrbuf_len(wrbuf), outf); + wrbuf_free (wrbuf, 1); return record_length; } +int marc_display_ex (const char *buf, FILE *outf, int debug) +{ + return marc_display_exl (buf, outf, debug, -1); +} + int marc_display (const char *buf, FILE *outf) { return marc_display_ex (buf, outf, 0);