without this the magic numbers need to be kept in sync with the maximum length 
of the
strings printed in the corresponding column. if not an overflow and a nasty ' 
'-storm occurs
on executing flashrom -L.

Signed-off-by: Stefan Tauner <[email protected]>
---
 print.c      |  101 +++++++++++++++++++++++++++++++++++++++------------------
 programmer.h |    8 ++--
 2 files changed, 73 insertions(+), 36 deletions(-)

diff --git a/print.c b/print.c
index 3760cc4..c21aef6 100644
--- a/print.c
+++ b/print.c
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <assert.h>
 #include "flash.h"
 #include "flashchips.h"
 #include "programmer.h"
@@ -77,9 +78,11 @@ static int digits(int n)
 static void print_supported_chips(void)
 {
        int okcol = 0, pos = 0, i, chipcount = 0;
-       int maxchiplen = 0, maxvendorlen = 0;
+       int maxvendorlen = strlen("Vendor") + 1;
+       int maxchiplen = strlen("Device") + 1;
        const struct flashchip *f;
 
+       assert(flashchips != NULL);
        for (f = flashchips; f->name != NULL; f++) {
                /* Ignore "unknown XXXX SPI chip" entries. */
                if (!strncmp(f->name, "unknown", 7))
@@ -158,63 +161,97 @@ static void print_supported_chips(void)
 #if CONFIG_INTERNAL == 1
 static void print_supported_chipsets(void)
 {
-       int i, j, chipsetcount = 0;
+       int i, chipsetcount = 0;
        const struct penable *c = chipset_enables;
+       int maxvendorlen = strlen("Vendor") + 1;
+       int maxchipsetlen = strlen("Chipset") + 1;
 
-       for (i = 0; c[i].vendor_name != NULL; i++)
+       assert(chipset_enables != NULL);
+       for (c = chipset_enables; c->vendor_name != NULL; c++) {
                chipsetcount++;
+               maxvendorlen = max(maxvendorlen, strlen(c->vendor_name));
+               maxchipsetlen = max(maxchipsetlen, strlen(c->device_name));
+       }
+       maxvendorlen++;
+       maxchipsetlen++;
+
+       printf("\nSupported chipsets (total: %d):\n\n", chipsetcount);
+
+       printf("Vendor");
+       for (i = strlen("Vendor"); i < maxvendorlen; i++)
+               printf(" ");
+
+       printf("Chipset");
+       for (i = strlen("Chipset"); i < maxchipsetlen; i++)
+               printf(" ");
 
-       printf("\nSupported chipsets (total: %d):\n\nVendor:                  "
-              "Chipset:                 PCI IDs:\n\n", chipsetcount);
+       printf("PCI IDs   State\n\n");
 
-       for (i = 0; c[i].vendor_name != NULL; i++) {
-               printf("%s", c[i].vendor_name);
-               for (j = 0; j < 25 - strlen(c[i].vendor_name); j++)
+       for (c = chipset_enables; c->vendor_name != NULL; c++) {
+               printf("%s", c->vendor_name);
+               for (i = 0; i < maxvendorlen - strlen(c->vendor_name); i++)
                        printf(" ");
-               printf("%s", c[i].device_name);
-               for (j = 0; j < 25 - strlen(c[i].device_name); j++)
+               printf("%s", c->device_name);
+               for (i = 0; i < maxchipsetlen - strlen(c->device_name); i++)
                        printf(" ");
-               printf("%04x:%04x%s\n", c[i].vendor_id, c[i].device_id,
-                      (c[i].status == OK) ? "" : " (untested)");
+               printf("%04x:%04x%s\n", c->vendor_id, c->device_id,
+                      (c->status == OK) ? "" : " (untested)");
        }
 }
 
 static void print_supported_boards_helper(const struct board_info *boards,
                                   const char *devicetype)
 {
-       int i, j, boardcount_good = 0, boardcount_bad = 0;
-       const struct board_pciid_enable *b = board_pciid_enables;
-
-       for (i = 0; boards[i].vendor != NULL; i++) {
-               if (boards[i].working)
+       int i, boardcount_good = 0, boardcount_bad = 0;
+       const struct board_pciid_enable *e = board_pciid_enables;
+       const struct board_info *b = boards;
+       int maxvendorlen = strlen("Vendor") + 1;
+       int maxboardlen = strlen("Board") + 1;
+
+       assert(boards != NULL);
+       for (b = boards; b->vendor != NULL; b++) {
+               maxvendorlen = max(maxvendorlen, strlen(b->vendor));
+               maxboardlen = max(maxboardlen, strlen(b->name));
+               if (b->working)
                        boardcount_good++;
                else
                        boardcount_bad++;
        }
+       maxvendorlen++;
+       maxboardlen++;
+
+       printf("\nKnown %s (good: %d, bad: %d):\n\n",
+              devicetype, boardcount_good, boardcount_bad);
+
+       printf("Vendor");
+       for (i = strlen("Vendor"); i < maxvendorlen; i++)
+               printf(" ");
+
+       printf("Board");
+       for (i = strlen("Board"); i < maxboardlen; i++)
+               printf(" ");
 
-       printf("\nKnown %s (good: %d, bad: %d):"
-              "\n\nVendor:                  Board:                      "
-              "Status: Required option:"
-              "\n\n", devicetype, boardcount_good, boardcount_bad);
+       printf("Status  Required option\n\n");
 
-       for (i = 0; boards[i].vendor != NULL; i++) {
-               printf("%s", boards[i].vendor);
-               for (j = 0; j < 25 - strlen(boards[i].vendor); j++)
+       assert(board_pciid_enables != NULL);
+       for (b = boards; b->vendor != NULL; b++) {
+               printf("%s", b->vendor);
+               for (i = 0; i < maxvendorlen - strlen(b->vendor); i++)
                        printf(" ");
-               printf("%s", boards[i].name);
-               for (j = 0; j < 28 - strlen(boards[i].name); j++)
+               printf("%s", b->name);
+               for (i = 0; i < maxboardlen - strlen(b->name); i++)
                        printf(" ");
-               printf((boards[i].working) ? "OK      " : "BAD     ");
+               printf((b->working) ? "OK      " : "BAD     ");
 
-               for (j = 0; b[j].vendor_name != NULL; j++) {
-                       if (strcmp(b[j].vendor_name, boards[i].vendor)
-                           || strcmp(b[j].board_name, boards[i].name))
+               for (e = board_pciid_enables; e->vendor_name != NULL; e++) {
+                       if (strcmp(e->vendor_name, b->vendor)
+                           || strcmp(e->board_name, b->name))
                                continue;
-                       if (b[j].lb_vendor == NULL)
+                       if (e->lb_vendor == NULL)
                                printf("(autodetected)");
                        else
-                               printf("-m %s:%s", b[j].lb_vendor,
-                                                  b[j].lb_part);
+                               printf("-m %s:%s", e->lb_vendor,
+                                                  e->lb_part);
                }
                printf("\n");
        }
diff --git a/programmer.h b/programmer.h
index b68aa88..e1147f1 100644
--- a/programmer.h
+++ b/programmer.h
@@ -145,7 +145,7 @@ struct bitbang_spi_master {
 struct penable {
        uint16_t vendor_id;
        uint16_t device_id;
-       int status;
+       int status; /* OK=0 and NT=1 are defines only. Beware! */
        const char *vendor_name;
        const char *device_name;
        int (*doit) (struct pci_dev *dev, const char *name);
@@ -174,10 +174,10 @@ struct board_pciid_enable {
        uint16_t second_card_vendor;
        uint16_t second_card_device;
 
-       /* Pattern to match DMI entries */
+       /* Pattern to match DMI entries. May be NULL. */
        const char *dmi_pattern;
 
-       /* The vendor / part name from the coreboot table. */
+       /* The vendor / part name from the coreboot table. May be NULL. */
        const char *lb_vendor;
        const char *lb_part;
 
@@ -188,7 +188,7 @@ struct board_pciid_enable {
 
        int max_rom_decode_parallel;
        int status;
-       int (*enable) (void);
+       int (*enable) (void); /* May be NULL. */
 };
 
 extern const struct board_pciid_enable board_pciid_enables[];
-- 
1.7.1


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to