Handle numeric subfields correctly.
[yaz-moved-to-github.git] / src / marc_read_line.c
index 739ec86..d669576 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2013 Index Data
  * See the file LICENSE for details.
  */
 
 #include <assert.h>
 #include <stdio.h>
 #include <string.h>
-#include <ctype.h>
 
 #include <yaz/marcdisp.h>
 #include <yaz/wrbuf.h>
 #include <yaz/yaz-util.h>
 
-int yaz_gets(int (*getbyte)(void *client_data),
-             void (*ungetbyte)(int b, void *client_data),
-             void *client_data,
-             WRBUF w)
+static int yaz_gets(int (*getbyte)(void *client_data),
+                    void (*ungetbyte)(int b, void *client_data),
+                    void *client_data,
+                    WRBUF w)
 {
     size_t sz = 0;
     int ch = getbyte(client_data);
@@ -92,7 +91,7 @@ static int yaz_marc_line_gets(int (*getbyte)(void *client_data),
     return 1;
 }
 
-    
+
 int yaz_marc_read_line(yaz_marc_t mt,
                        int (*getbyte)(void *client_data),
                        void (*ungetbyte)(int b, void *client_data),
@@ -128,7 +127,7 @@ int yaz_marc_read_line(yaz_marc_t mt,
         }
         else if (line[0] == '(') /* annotation, skip it */
             ;
-        else if (line_len == 24 && atoi_n_check(line, 5, &val) && val >= 24)
+        else if (line_len == 24 && atoi_n_check(line, 5, &val))
         {
             /* deal with header lines:  00366nam  22001698a 4500
             */
@@ -144,7 +143,7 @@ int yaz_marc_read_line(yaz_marc_t mt,
                                 &length_implementation);
             header_created = 1;
         }
-        else if (line_len > 5 && line[0] != ' ' && line[1] != ' ' 
+        else if (line_len > 4 && line[0] != ' ' && line[1] != ' '
                  && line[2] != ' ' && line[3] == ' ' )
         {
             /* deal with data/control lines: 245 12 ........ */
@@ -196,14 +195,15 @@ int yaz_marc_read_line(yaz_marc_t mt,
                 {
                     const char *next;
                     size_t len;
-                    
+
                     assert(cp[0] == marker_ch);
                     cp++;
                     next = cp;
                     while ((next = strchr(next, marker_ch)))
                     {
                         if ((next[1] >= 'A' && next[1] <= 'Z')
-                            ||(next[1] >= 'a' && next[1] <= 'z'))
+                            ||(next[1] >= 'a' && next[1] <= 'z')
+                            ||(next[1] >= '0' && next[1] <= '9'))
                         {
                             if (!marker_skip)
                                 break;
@@ -231,7 +231,6 @@ int yaz_marc_read_line(yaz_marc_t mt,
                             cp++;
                         }
                     }
-                    assert(len >= 0);
                     yaz_marc_add_subfield(mt, cp, len);
                     if (!next)
                         break;