X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fmarc_read_iso2709.c;h=54d865354e8d119e0d6c96d136025fa23334636c;hp=aee41b43ad04470ec0a318e94c1a4bce7f617a9f;hb=8a980f7051e22ca1e4fac0395ed7f8647cd9eda3;hpb=54db174ec4113c44b05f3766dc6f8ad665968cfb diff --git a/src/marc_read_iso2709.c b/src/marc_read_iso2709.c index aee41b4..54d8653 100644 --- a/src/marc_read_iso2709.c +++ b/src/marc_read_iso2709.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2006, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2009 Index Data * See the file LICENSE for details. - * - * $Id: marc_read_iso2709.c,v 1.1 2006-12-15 12:37:18 adam Exp $ */ /** @@ -151,8 +149,23 @@ int yaz_marc_read_iso2709(yaz_marc_t mt, const char *buf, int bsize) { /* datafield */ i += identifier_flag-1; - yaz_marc_add_datafield(mt, tag, buf+i, indicator_length); - i += indicator_length; + if (indicator_length) + { + /* skip RS/FS bytes in indicator. They are not allowed there */ + int j; + for (j = indicator_length; --j >= 0; ) + if (buf[j+i] < ' ') + { + j++; + i += j; + end_offset += j; + yaz_marc_cprintf(mt, "Bad indicator data. " + "Skipping %d bytes", j); + break; + } + yaz_marc_add_datafield(mt, tag, buf+i, indicator_length); + i += indicator_length; + } while (i < end_offset && buf[i] != ISO2709_RS && buf[i] != ISO2709_FS) @@ -164,7 +177,8 @@ int yaz_marc_read_iso2709(yaz_marc_t mt, const char *buf, int bsize) buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS && buf[i] != ISO2709_FS) i++; - yaz_marc_add_subfield(mt, buf+code_offset, i - code_offset); + if (i > code_offset) + yaz_marc_add_subfield(mt, buf+code_offset, i - code_offset); } } else @@ -184,7 +198,7 @@ int yaz_marc_read_iso2709(yaz_marc_t mt, const char *buf, int bsize) if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS) { yaz_marc_cprintf(mt, "No separator at end of field length=%d", - data_length); + data_length); } } return record_length; @@ -193,6 +207,7 @@ int yaz_marc_read_iso2709(yaz_marc_t mt, const char *buf, int bsize) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab