X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdisp.c;h=b28c88e52a85176ca36cfb365fe266fc5700b5aa;hb=506058d7a9f17fcc88f899d92476fe59cc09bdfb;hp=ecbd86c961eb5c0bb9bde84e51b6a32274fbad43;hpb=19af2bd8dfd21731cc978beccd1346133d614c67;p=yaz-moved-to-github.git diff --git a/util/marcdisp.c b/util/marcdisp.c index ecbd86c..b28c88e 100644 --- a/util/marcdisp.c +++ b/util/marcdisp.c @@ -1,9 +1,26 @@ /* - * Copyright (c) 1995-2000, Index Data + * Copyright (c) 1995-2001, Index Data * See the file LICENSE for details. * * $Log: marcdisp.c,v $ - * Revision 1.11 2000-02-29 13:44:55 adam + * 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 @@ -46,9 +63,11 @@ #include #include #include +#include #include -int marc_display_ex (const char *buf, FILE *outf, int debug) +int marc_display_wrbuf (const char *buf, WRBUF wr, int debug, + int bsize) { int entry_p; int record_length; @@ -59,11 +78,21 @@ 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; + } + /* 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 @@ -72,7 +101,7 @@ int marc_display_ex (const char *buf, FILE *outf, int debug) identifier_length = atoi_n (buf+11, 1); else identifier_length = 2; - 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); @@ -80,13 +109,21 @@ int marc_display_ex (const char *buf, FILE *outf, int debug) 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]; + sprintf (str, "Record length %5d\n", record_length); + wrbuf_puts (wr, str); + sprintf (str, "Indicator length %5d\n", indicator_length); + wrbuf_puts (wr, str); + sprintf (str, "Identifier length %5d\n", identifier_length); + wrbuf_puts (wr, str); + sprintf (str, "Base address %5d\n", base_address); + wrbuf_puts (wr, str); + sprintf (str, "Length data entry %5d\n", length_data_entry); + wrbuf_puts (wr, str); + sprintf (str, "Length starting %5d\n", length_starting); + wrbuf_puts (wr, str); + sprintf (str, "Length implementation %5d\n", length_implementation); + wrbuf_puts (wr, str); } for (entry_p = 24; buf[entry_p] != ISO2709_FS; ) { @@ -107,8 +144,9 @@ int marc_display_ex (const char *buf, FILE *outf, int debug) entry_p += 3; tag[3] = '\0'; if (debug) - fprintf (outf, "Tag: "); - fprintf (outf, "%s ", tag); + 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); @@ -116,39 +154,66 @@ int marc_display_ex (const char *buf, FILE *outf, int debug) i = data_offset + base_address; end_offset = i+data_length-1; if (debug) - fprintf (outf, " Ind: "); + wrbuf_puts (wr, " Ind: "); if (memcmp (tag, "00", 2) && indicator_length) { - for (j = 0; j 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);