X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdisp.c;h=723026ff708373f790ad812c46b1c82831567a46;hb=fc2093cfd23eda0ee8384b18dc7e7b8adffd073a;hp=88f400e66297f4b25b0c0536dbbfd5c6bdb70ec9;hpb=657fb99115b87a5244e9a33bbe4ca3d9d18849c4;p=yaz-moved-to-github.git diff --git a/util/marcdisp.c b/util/marcdisp.c index 88f400e..723026f 100644 --- a/util/marcdisp.c +++ b/util/marcdisp.c @@ -4,7 +4,25 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: marcdisp.c,v $ - * Revision 1.3 1995-09-27 15:03:03 quinn + * 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 @@ -18,26 +36,10 @@ #include #include #include -#include - -#define ISO2709_RS 035 -#define ISO2709_FS 036 -#define ISO2709_IDFS 037 - -int atoi_n (const char *buf, int len) -{ - int val = 0; - - while (--len >= 0) - { - if (isdigit (*buf)) - val = val*10 + (*buf - '0'); - buf++; - } - return val; -} +#include +#include -int MDF marc_display (const char *buf, FILE *outf) +int marc_display_ex (const char *buf, FILE *outf, int debug) { int entry_p; int record_length; @@ -48,6 +50,8 @@ int MDF marc_display (const char *buf, FILE *outf) int length_starting; int length_implementation; + if (!outf) + outf = stdout; record_length = atoi_n (buf, 5); if (record_length < 25) return -1; @@ -55,12 +59,28 @@ int MDF marc_display (const char *buf, FILE *outf) identifier_length = atoi_n (buf+11, 1); base_address = atoi_n (buf+12, 4); + indicator_length = identifier_length = 2; + length_data_entry = atoi_n (buf+20, 1); length_starting = atoi_n (buf+21, 1); length_implementation = atoi_n (buf+22, 1); + 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); + } 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; ) { @@ -73,6 +93,8 @@ int MDF marc_display (const char *buf, FILE *outf) 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; @@ -80,11 +102,15 @@ int MDF marc_display (const char *buf, FILE *outf) 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) { for (j = 0; j