1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +02:00

Reformat -L output and add printing of chip voltage ranges to print.c

Besides adding output for the voltage ranges, this patch also changes
various aspects of the -L output:
- sizes are right aligned now with a fixed length of 5
- space between columns is selectable with a constant
- test results are always shown in the same column ("PR" and " R"
  instead of "PR" and "R ")
- vendor and device names are split on a delimiter (currently '/') and
  spread over mutliple lines but only if the tokens are not too short.
  all other columns are printed on the first line of a chip.
- voltage ranges are printed in verbose mode only

it also gets rid of POS_PRINT and digits

Corresponding to flashrom svn r1438.

Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
This commit is contained in:
Stefan Tauner 2011-09-12 22:55:01 +00:00
parent ae418d87b2
commit 29e5d31084

269
print.c
View File

@ -58,40 +58,68 @@ char *flashbuses_to_text(enum chipbustype bustype)
return ret;
}
#define POS_PRINT(x) do { pos += strlen(x); msg_ginfo(x); } while (0)
static int digits(int n)
{
int i;
if (!n)
return 1;
for (i = 0; n; ++i)
n /= 10;
return i;
}
static void print_supported_chips(void)
{
int okcol = 0, pos = 0, i, chipcount = 0;
const char *delim = "/";
const int mintoklen = 5;
const int border = 2;
int i, chipcount = 0;
int maxvendorlen = strlen("Vendor") + 1;
int maxchiplen = strlen("Device") + 1;
int maxtypelen = strlen("Type") + 1;
const struct flashchip *f;
char *s;
char *tmpven, *tmpdev;
int tmpvenlen, tmpdevlen, curvenlen, curdevlen;
/* calculate maximum column widths and by iterating over all chips */
for (f = flashchips; f->name != NULL; f++) {
/* Ignore "unknown XXXX SPI chip" entries. */
if (!strncmp(f->name, "unknown", 7))
continue;
chipcount++;
maxvendorlen = max(maxvendorlen, strlen(f->vendor));
maxchiplen = max(maxchiplen, strlen(f->name));
/* Find maximum vendor length (respecting line splitting). */
tmpven = (char *)f->vendor;
do {
/* and take minimum token lengths into account */
tmpvenlen = 0;
do {
tmpvenlen += strcspn(tmpven, delim);
/* skip to the address after the first token */
tmpven += tmpvenlen;
if (tmpven[0] == '\0')
break;
tmpven++;
} while (tmpvenlen < mintoklen);
maxvendorlen = max(maxvendorlen, tmpvenlen);
if (tmpven[0] == '\0')
break;
} while (1);
/* same for device name */
tmpdev = (char *)f->name;
do {
tmpdevlen = 0;
do {
tmpdevlen += strcspn(tmpdev, delim);
tmpdev += tmpdevlen;
if (tmpdev[0] == '\0')
break;
tmpdev++;
} while (tmpdevlen < mintoklen);
maxchiplen = max(maxchiplen, tmpdevlen);
if (tmpdev[0] == '\0')
break;
} while (1);
s = flashbuses_to_text(f->bustype);
maxtypelen = max(maxtypelen, strlen(s));
free(s);
}
maxvendorlen++;
maxchiplen++;
okcol = maxvendorlen + maxchiplen;
maxvendorlen += border;
maxchiplen += border;
maxtypelen += border;
msg_ginfo("Supported flash chips (total: %d):\n\n", chipcount);
msg_ginfo("Vendor");
@ -101,10 +129,35 @@ static void print_supported_chips(void)
for (i = strlen("Device"); i < maxchiplen; i++)
msg_ginfo(" ");
msg_ginfo("Tested Known Size/kB: Type:\n");
for (i = 0; i < okcol; i++)
msg_ginfo("Test");
for (i = 0; i < border; i++)
msg_ginfo(" ");
msg_ginfo("OK Broken\n\n");
msg_ginfo("Known");
for (i = 0; i < border; i++)
msg_ginfo(" ");
msg_ginfo(" Size");
for (i = 0; i < border; i++)
msg_ginfo(" ");
msg_ginfo("Type");
for (i = strlen("Type"); i < maxtypelen; i++)
msg_ginfo(" ");
msg_gdbg("Voltage");
msg_ginfo("\n");
for (i = 0; i < maxvendorlen + maxchiplen; i++)
msg_ginfo(" ");
msg_ginfo("OK ");
for (i = 0; i < border; i++)
msg_ginfo(" ");
msg_ginfo("Broken");
for (i = 0; i < border; i++)
msg_ginfo(" ");
msg_ginfo("[kB]");
for (i = 0; i < border + maxtypelen; i++)
msg_ginfo(" ");
msg_gdbg("range [V]");
msg_ginfo("\n\n");
msg_ginfo("(P = PROBE, R = READ, E = ERASE, W = WRITE)\n\n");
for (f = flashchips; f->name != NULL; f++) {
@ -112,50 +165,156 @@ static void print_supported_chips(void)
if (!strncmp(f->name, "unknown", 7))
continue;
msg_ginfo("%s", f->vendor);
for (i = strlen(f->vendor); i < maxvendorlen; i++)
msg_ginfo(" ");
msg_ginfo("%s", f->name);
for (i = strlen(f->name); i < maxchiplen; i++)
/* support for multiline vendor names:
* - make a copy of the original vendor name
* - use strok to put the first token in tmpven
* - keep track of the length of all tokens on the current line
* for ' '-padding in curvenlen
* - check if additional tokens should be printed on the current
* line
* - after all other values are printed print the surplus tokens
* on fresh lines
*/
tmpven = malloc(strlen(f->vendor) + 1);
if (tmpven == NULL) {
msg_gerr("Out of memory!\n");
exit(1);
}
strcpy(tmpven, f->vendor);
tmpven = strtok(tmpven, delim);
msg_ginfo("%s", tmpven);
curvenlen = strlen(tmpven);
while ((tmpven = strtok(NULL, delim)) != NULL) {
msg_ginfo("%s", delim);
curvenlen++;
tmpvenlen = strlen(tmpven);
if (tmpvenlen >= mintoklen)
break; /* big enough to be on its own line */
msg_ginfo("%s", tmpven);
curvenlen += tmpvenlen;
}
for (i = curvenlen; i < maxvendorlen; i++)
msg_ginfo(" ");
/* support for multiline device names as above */
tmpdev = malloc(strlen(f->name) + 1);
if (tmpdev == NULL) {
msg_gerr("Out of memory!\n");
exit(1);
}
strcpy(tmpdev, f->name);
tmpdev = strtok(tmpdev, delim);
msg_ginfo("%s", tmpdev);
curdevlen = strlen(tmpdev);
while ((tmpdev = strtok(NULL, delim)) != NULL) {
msg_ginfo("%s", delim);
curdevlen++;
tmpdevlen = strlen(tmpdev);
if (tmpdevlen >= mintoklen)
break; /* big enough to be on its own line */
msg_ginfo("%s", tmpdev);
curdevlen += tmpdevlen;
}
for (i = curdevlen; i < maxchiplen; i++)
msg_ginfo(" ");
pos = maxvendorlen + maxchiplen;
if ((f->tested & TEST_OK_MASK)) {
if ((f->tested & TEST_OK_PROBE))
POS_PRINT("P ");
msg_ginfo("P");
else
msg_ginfo(" ");
if ((f->tested & TEST_OK_READ))
POS_PRINT("R ");
msg_ginfo("R");
else
msg_ginfo(" ");
if ((f->tested & TEST_OK_ERASE))
POS_PRINT("E ");
msg_ginfo("E");
else
msg_ginfo(" ");
if ((f->tested & TEST_OK_WRITE))
POS_PRINT("W ");
}
while (pos < okcol + 9) {
msg_ginfo("W");
else
msg_ginfo(" ");
for (i = 0; i < border; i++)
msg_ginfo(" ");
pos++;
}
if ((f->tested & TEST_BAD_MASK)) {
if ((f->tested & TEST_BAD_PROBE))
POS_PRINT("P ");
if ((f->tested & TEST_BAD_READ))
POS_PRINT("R ");
if ((f->tested & TEST_BAD_ERASE))
POS_PRINT("E ");
if ((f->tested & TEST_BAD_WRITE))
POS_PRINT("W ");
}
while (pos < okcol + 18) {
if ((f->tested & TEST_BAD_PROBE))
msg_ginfo("P");
else
msg_ginfo(" ");
pos++;
}
msg_ginfo("%d", f->total_size);
for (i = 0; i < 10 - digits(f->total_size); i++)
if ((f->tested & TEST_BAD_READ))
msg_ginfo("R");
else
msg_ginfo(" ");
if ((f->tested & TEST_BAD_ERASE))
msg_ginfo("E");
else
msg_ginfo(" ");
if ((f->tested & TEST_BAD_WRITE))
msg_ginfo("W");
else
msg_ginfo(" ");
for (i = 0; i < border + 1; i++)
msg_ginfo(" ");
msg_ginfo("%5d", f->total_size);
for (i = 0; i < border; i++)
msg_ginfo(" ");
s = flashbuses_to_text(f->bustype);
msg_ginfo("%s\n", s);
msg_ginfo("%s", s);
for (i = strlen(s); i < maxtypelen; i++)
msg_ginfo(" ");
free(s);
if (f->voltage.min == 0 && f->voltage.max == 0)
msg_gdbg("no info");
else
msg_gdbg("%0.02f;%0.02f",
f->voltage.min/(double)1000,
f->voltage.max/(double)1000);
/* print surplus vendor and device name tokens */
while (tmpven != NULL || tmpdev != NULL) {
msg_ginfo("\n");
if (tmpven != NULL){
msg_ginfo("%s", tmpven);
curvenlen = strlen(tmpven);
while ((tmpven = strtok(NULL, delim)) != NULL) {
msg_ginfo("%s", delim);
curvenlen++;
tmpvenlen = strlen(tmpven);
/* big enough to be on its own line */
if (tmpvenlen >= mintoklen)
break;
msg_ginfo("%s", tmpven);
curvenlen += tmpvenlen;
}
} else
curvenlen = 0;
for (i = curvenlen; i < maxvendorlen; i++)
msg_ginfo(" ");
if (tmpdev != NULL){
msg_ginfo("%s", tmpdev);
curdevlen = strlen(tmpdev);
while ((tmpdev = strtok(NULL, delim)) != NULL) {
msg_ginfo("%s", delim);
curdevlen++;
tmpdevlen = strlen(tmpdev);
/* big enough to be on its own line */
if (tmpdevlen >= mintoklen)
break;
msg_ginfo("%s", tmpdev);
curdevlen += tmpdevlen;
}
}
}
msg_ginfo("\n");
}
}