- Timestamp:
- 09/13/11 00:55:01 (8 months ago)
- File:
-
- 1 edited
-
trunk/print.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/print.c
r1431 r1438 59 59 } 60 60 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 76 61 static void print_supported_chips(void) 77 62 { 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; 79 67 int maxvendorlen = strlen("Vendor") + 1; 80 68 int maxchiplen = strlen("Device") + 1; 69 int maxtypelen = strlen("Type") + 1; 81 70 const struct flashchip *f; 82 71 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 */ 84 76 for (f = flashchips; f->name != NULL; f++) { 85 77 /* Ignore "unknown XXXX SPI chip" entries. */ … … 87 79 continue; 88 80 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); 91 119 } 92 maxvendorlen ++;93 maxchiplen ++;94 okcol = maxvendorlen + maxchiplen;120 maxvendorlen += border; 121 maxchiplen += border; 122 maxtypelen += border; 95 123 96 124 msg_ginfo("Supported flash chips (total: %d):\n\n", chipcount); … … 102 130 msg_ginfo(" "); 103 131 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"); 108 161 msg_ginfo("(P = PROBE, R = READ, E = ERASE, W = WRITE)\n\n"); 109 162 … … 113 166 continue; 114 167 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); 132 182 } 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; 136 196 } 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); 146 206 } 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; 151 220 } 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++) 154 265 msg_ginfo(" "); 155 266 156 267 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(" "); 158 271 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"); 159 318 } 160 319 }
Note: See TracChangeset
for help on using the changeset viewer.
