Changeset 1438 for trunk


Ignore:
Timestamp:
09/13/11 00:55:01 (8 months ago)
Author:
stefanct
Message:

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

Signed-off-by: Stefan Tauner <stefan.tauner@…>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/print.c

    r1431 r1438  
    5959} 
    6060 
    61 #define POS_PRINT(x) do { pos += strlen(x); msg_ginfo(x); } while (0) 
    62  
    63 static int digits(int n) 
    64 { 
    65         int i; 
    66  
    67         if (!n) 
    68                 return 1; 
    69  
    70         for (i = 0; n; ++i) 
    71                 n /= 10; 
    72  
    73         return i; 
    74 } 
    75  
    7661static void print_supported_chips(void) 
    7762{ 
    78         int okcol = 0, pos = 0, i, chipcount = 0; 
     63        const char *delim = "/"; 
     64        const int mintoklen = 5; 
     65        const int border = 2; 
     66        int i, chipcount = 0; 
    7967        int maxvendorlen = strlen("Vendor") + 1; 
    8068        int maxchiplen = strlen("Device") + 1; 
     69        int maxtypelen = strlen("Type") + 1; 
    8170        const struct flashchip *f; 
    8271        char *s; 
    83  
     72        char *tmpven, *tmpdev; 
     73        int tmpvenlen, tmpdevlen, curvenlen, curdevlen; 
     74 
     75        /* calculate maximum column widths and by iterating over all chips */ 
    8476        for (f = flashchips; f->name != NULL; f++) { 
    8577                /* Ignore "unknown XXXX SPI chip" entries. */ 
     
    8779                        continue; 
    8880                chipcount++; 
    89                 maxvendorlen = max(maxvendorlen, strlen(f->vendor)); 
    90                 maxchiplen = max(maxchiplen, strlen(f->name)); 
     81 
     82                /* Find maximum vendor length (respecting line splitting). */ 
     83                tmpven = (char *)f->vendor; 
     84                do { 
     85                        /* and take minimum token lengths into account */ 
     86                        tmpvenlen = 0; 
     87                        do { 
     88                                tmpvenlen += strcspn(tmpven, delim); 
     89                                /* skip to the address after the first token */ 
     90                                tmpven += tmpvenlen; 
     91                                if (tmpven[0] == '\0') 
     92                                        break; 
     93                                tmpven++; 
     94                        } while (tmpvenlen < mintoklen); 
     95                        maxvendorlen = max(maxvendorlen, tmpvenlen); 
     96                        if (tmpven[0] == '\0') 
     97                                break; 
     98                } while (1); 
     99 
     100                /* same for device name */ 
     101                tmpdev = (char *)f->name; 
     102                do { 
     103                        tmpdevlen = 0; 
     104                        do { 
     105                                tmpdevlen += strcspn(tmpdev, delim); 
     106                                tmpdev += tmpdevlen; 
     107                                if (tmpdev[0] == '\0') 
     108                                        break; 
     109                                tmpdev++; 
     110                        } while (tmpdevlen < mintoklen); 
     111                        maxchiplen = max(maxchiplen, tmpdevlen); 
     112                        if (tmpdev[0] == '\0') 
     113                                break; 
     114                } while (1); 
     115 
     116                s = flashbuses_to_text(f->bustype); 
     117                maxtypelen = max(maxtypelen, strlen(s)); 
     118                free(s); 
    91119        } 
    92         maxvendorlen++; 
    93         maxchiplen++; 
    94         okcol = maxvendorlen + maxchiplen; 
     120        maxvendorlen += border; 
     121        maxchiplen += border; 
     122        maxtypelen += border; 
    95123 
    96124        msg_ginfo("Supported flash chips (total: %d):\n\n", chipcount); 
     
    102130                msg_ginfo(" "); 
    103131 
    104         msg_ginfo("Tested   Known    Size/kB:  Type:\n"); 
    105         for (i = 0; i < okcol; i++) 
    106                 msg_ginfo(" "); 
    107         msg_ginfo("OK       Broken\n\n"); 
     132        msg_ginfo("Test"); 
     133        for (i = 0; i < border; i++) 
     134                msg_ginfo(" "); 
     135        msg_ginfo("Known"); 
     136        for (i = 0; i < border; i++) 
     137                msg_ginfo(" "); 
     138        msg_ginfo(" Size"); 
     139        for (i = 0; i < border; i++) 
     140                msg_ginfo(" "); 
     141 
     142        msg_ginfo("Type"); 
     143        for (i = strlen("Type"); i < maxtypelen; i++) 
     144                msg_ginfo(" "); 
     145        msg_gdbg("Voltage"); 
     146        msg_ginfo("\n"); 
     147 
     148        for (i = 0; i < maxvendorlen + maxchiplen; i++) 
     149                msg_ginfo(" "); 
     150        msg_ginfo("OK  "); 
     151        for (i = 0; i < border; i++) 
     152                msg_ginfo(" "); 
     153        msg_ginfo("Broken"); 
     154        for (i = 0; i < border; i++) 
     155                msg_ginfo(" "); 
     156        msg_ginfo("[kB]"); 
     157        for (i = 0; i < border + maxtypelen; i++) 
     158                msg_ginfo(" "); 
     159        msg_gdbg("range [V]"); 
     160        msg_ginfo("\n\n"); 
    108161        msg_ginfo("(P = PROBE, R = READ, E = ERASE, W = WRITE)\n\n"); 
    109162 
     
    113166                        continue; 
    114167 
    115                 msg_ginfo("%s", f->vendor); 
    116                 for (i = strlen(f->vendor); i < maxvendorlen; i++) 
    117                         msg_ginfo(" "); 
    118                 msg_ginfo("%s", f->name); 
    119                 for (i = strlen(f->name); i < maxchiplen; i++) 
    120                         msg_ginfo(" "); 
    121  
    122                 pos = maxvendorlen + maxchiplen; 
    123                 if ((f->tested & TEST_OK_MASK)) { 
    124                         if ((f->tested & TEST_OK_PROBE)) 
    125                                 POS_PRINT("P "); 
    126                         if ((f->tested & TEST_OK_READ)) 
    127                                 POS_PRINT("R "); 
    128                         if ((f->tested & TEST_OK_ERASE)) 
    129                                 POS_PRINT("E "); 
    130                         if ((f->tested & TEST_OK_WRITE)) 
    131                                 POS_PRINT("W "); 
     168                /* support for multiline vendor names: 
     169                 * - make a copy of the original vendor name 
     170                 * - use strok to put the first token in tmpven 
     171                 * - keep track of the length of all tokens on the current line 
     172                 *   for ' '-padding in curvenlen 
     173                 * - check if additional tokens should be printed on the current 
     174                 *   line 
     175                 * - after all other values are printed print the surplus tokens 
     176                 *   on fresh lines 
     177                 */ 
     178                tmpven = malloc(strlen(f->vendor) + 1); 
     179                if (tmpven == NULL) { 
     180                        msg_gerr("Out of memory!\n"); 
     181                        exit(1); 
    132182                } 
    133                 while (pos < okcol + 9) { 
    134                         msg_ginfo(" "); 
    135                         pos++; 
     183                strcpy(tmpven, f->vendor); 
     184 
     185                tmpven = strtok(tmpven, delim); 
     186                msg_ginfo("%s", tmpven); 
     187                curvenlen = strlen(tmpven); 
     188                while ((tmpven = strtok(NULL, delim)) != NULL) { 
     189                        msg_ginfo("%s", delim); 
     190                        curvenlen++; 
     191                        tmpvenlen = strlen(tmpven); 
     192                        if (tmpvenlen >= mintoklen) 
     193                                break; /* big enough to be on its own line */ 
     194                        msg_ginfo("%s", tmpven); 
     195                        curvenlen += tmpvenlen; 
    136196                } 
    137                 if ((f->tested & TEST_BAD_MASK)) { 
    138                         if ((f->tested & TEST_BAD_PROBE)) 
    139                                 POS_PRINT("P "); 
    140                         if ((f->tested & TEST_BAD_READ)) 
    141                                 POS_PRINT("R "); 
    142                         if ((f->tested & TEST_BAD_ERASE)) 
    143                                 POS_PRINT("E "); 
    144                         if ((f->tested & TEST_BAD_WRITE)) 
    145                                 POS_PRINT("W "); 
     197 
     198                for (i = curvenlen; i < maxvendorlen; i++) 
     199                        msg_ginfo(" "); 
     200 
     201                /* support for multiline device names as above */ 
     202                tmpdev = malloc(strlen(f->name) + 1); 
     203                if (tmpdev == NULL) { 
     204                        msg_gerr("Out of memory!\n"); 
     205                        exit(1); 
    146206                } 
    147  
    148                 while (pos < okcol + 18) { 
    149                         msg_ginfo(" "); 
    150                         pos++; 
     207                strcpy(tmpdev, f->name); 
     208 
     209                tmpdev = strtok(tmpdev, delim); 
     210                msg_ginfo("%s", tmpdev); 
     211                curdevlen = strlen(tmpdev); 
     212                while ((tmpdev = strtok(NULL, delim)) != NULL) { 
     213                        msg_ginfo("%s", delim); 
     214                        curdevlen++; 
     215                        tmpdevlen = strlen(tmpdev); 
     216                        if (tmpdevlen >= mintoklen) 
     217                                break; /* big enough to be on its own line */ 
     218                        msg_ginfo("%s", tmpdev); 
     219                        curdevlen += tmpdevlen; 
    151220                } 
    152                 msg_ginfo("%d", f->total_size); 
    153                 for (i = 0; i < 10 - digits(f->total_size); i++) 
     221 
     222                for (i = curdevlen; i < maxchiplen; i++) 
     223                        msg_ginfo(" "); 
     224 
     225                if ((f->tested & TEST_OK_PROBE)) 
     226                        msg_ginfo("P"); 
     227                else 
     228                        msg_ginfo(" "); 
     229                if ((f->tested & TEST_OK_READ)) 
     230                        msg_ginfo("R"); 
     231                else 
     232                        msg_ginfo(" "); 
     233                if ((f->tested & TEST_OK_ERASE)) 
     234                        msg_ginfo("E"); 
     235                else 
     236                        msg_ginfo(" "); 
     237                if ((f->tested & TEST_OK_WRITE)) 
     238                        msg_ginfo("W"); 
     239                else 
     240                        msg_ginfo(" "); 
     241                for (i = 0; i < border; i++) 
     242                        msg_ginfo(" "); 
     243 
     244                if ((f->tested & TEST_BAD_PROBE)) 
     245                        msg_ginfo("P"); 
     246                else 
     247                        msg_ginfo(" "); 
     248                if ((f->tested & TEST_BAD_READ)) 
     249                        msg_ginfo("R"); 
     250                else 
     251                        msg_ginfo(" "); 
     252                if ((f->tested & TEST_BAD_ERASE)) 
     253                        msg_ginfo("E"); 
     254                else 
     255                        msg_ginfo(" "); 
     256                if ((f->tested & TEST_BAD_WRITE)) 
     257                        msg_ginfo("W"); 
     258                else 
     259                        msg_ginfo(" "); 
     260                for (i = 0; i < border + 1; i++) 
     261                        msg_ginfo(" "); 
     262 
     263                msg_ginfo("%5d", f->total_size); 
     264                for (i = 0; i < border; i++) 
    154265                        msg_ginfo(" "); 
    155266 
    156267                s = flashbuses_to_text(f->bustype); 
    157                 msg_ginfo("%s\n", s); 
     268                msg_ginfo("%s", s); 
     269                for (i = strlen(s); i < maxtypelen; i++) 
     270                        msg_ginfo(" "); 
    158271                free(s); 
     272 
     273                if (f->voltage.min == 0 && f->voltage.max == 0) 
     274                        msg_gdbg("no info"); 
     275                else 
     276                        msg_gdbg("%0.02f;%0.02f", 
     277                                 f->voltage.min/(double)1000, 
     278                                 f->voltage.max/(double)1000); 
     279 
     280                /* print surplus vendor and device name tokens */ 
     281                while (tmpven != NULL || tmpdev != NULL) { 
     282                        msg_ginfo("\n"); 
     283                        if (tmpven != NULL){ 
     284                                msg_ginfo("%s", tmpven); 
     285                                curvenlen = strlen(tmpven); 
     286                                while ((tmpven = strtok(NULL, delim)) != NULL) { 
     287                                        msg_ginfo("%s", delim); 
     288                                        curvenlen++; 
     289                                        tmpvenlen = strlen(tmpven); 
     290                                        /* big enough to be on its own line */ 
     291                                        if (tmpvenlen >= mintoklen) 
     292                                                break; 
     293                                        msg_ginfo("%s", tmpven); 
     294                                        curvenlen += tmpvenlen; 
     295                                } 
     296                        } else 
     297                                curvenlen = 0; 
     298 
     299                        for (i = curvenlen; i < maxvendorlen; i++) 
     300                                msg_ginfo(" "); 
     301 
     302                        if (tmpdev != NULL){ 
     303                                msg_ginfo("%s", tmpdev); 
     304                                curdevlen = strlen(tmpdev); 
     305                                while ((tmpdev = strtok(NULL, delim)) != NULL) { 
     306                                        msg_ginfo("%s", delim); 
     307                                        curdevlen++; 
     308                                        tmpdevlen = strlen(tmpdev); 
     309                                        /* big enough to be on its own line */ 
     310                                        if (tmpdevlen >= mintoklen) 
     311                                                break; 
     312                                        msg_ginfo("%s", tmpdev); 
     313                                        curdevlen += tmpdevlen; 
     314                                } 
     315                        } 
     316                } 
     317                msg_ginfo("\n"); 
    159318        } 
    160319} 
Note: See TracChangeset for help on using the changeset viewer.