]> mj.ucw.cz Git - pciutils.git/commitdiff
dump: Refactor file parsing
authorMartin Mareš <mj@ucw.cz>
Sun, 5 Apr 2026 16:35:24 +0000 (18:35 +0200)
committerMartin Mareš <mj@ucw.cz>
Sun, 5 Apr 2026 16:35:24 +0000 (18:35 +0200)
lib/dump.c

index 00ebc9e3e7828aab8f7b1ed387ac7a8c39c6c345..db111685c6340e49d8d816bc614ca3c624cf93eb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     The PCI Library -- Reading of Bus Dumps
  *
- *     Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz>
+ *     Copyright (c) 1997--2026 Martin Mares <mj@ucw.cz>
  *
  *     Can be freely distributed and used under the terms of the GNU GPL v2+.
  *
@@ -55,27 +55,18 @@ dump_validate(char *s, char *fmt)
   return 1;
 }
 
-static void
-dump_init(struct pci_access *a)
+static const char *
+dump_parse(struct pci_access *a, FILE *f)
 {
-  char *name = pci_get_param(a, "dump.name");
-  FILE *f;
   char buf[256];
   struct pci_dev *dev = NULL;
   int len, mn, bn, dn, fn, i, j;
 
-  if (!name)
-    a->error("dump: File name not given.");
-  if (!(f = fopen(name, "r")))
-    a->error("dump: Cannot open %s: %s", name, strerror(errno));
   while (fgets(buf, sizeof(buf)-1, f))
     {
       char *z = strchr(buf, '\n');
       if (!z)
-       {
-         fclose(f);
-         a->error("dump: line too long or unterminated");
-       }
+       return "Line too long or unterminated";
       *z-- = 0;
       if (z >= buf && *z == '\r')
        *z-- = 0;
@@ -104,10 +95,7 @@ dump_init(struct pci_access *a)
                 sscanf(z, "%x", &j) == 1 && j < 256)
            {
              if (i >= 4096)
-               {
-                 fclose(f);
-                 a->error("dump: At most 4096 bytes of config space are supported");
-               }
+               return "At most 4096 bytes of config space are supported";
              if (i >= dd->allocated)   /* Need to re-allocate the buffer */
                {
                  dump_alloc_data(dev, 4096);
@@ -123,13 +111,30 @@ dump_init(struct pci_access *a)
                z++;
            }
          if (*z)
-           {
-             fclose(f);
-             a->error("dump: Malformed line");
-           }
+           return "Malformed line";
        }
     }
+
+  return NULL;
+}
+
+static void
+dump_init(struct pci_access *a)
+{
+  char *name = pci_get_param(a, "dump.name");
+  FILE *f;
+
+  if (!name)
+    a->error("dump: File name not given.");
+  if (!(f = fopen(name, "r")))
+    a->error("dump: Cannot open %s: %s", name, strerror(errno));
+
+  const char *err = dump_parse(a, f);
+
   fclose(f);
+
+  if (err)
+    a->error("dump: %s", err);
 }
 
 static void