#include #include #include static unsigned char spd[256]; int readhex(const char *filename) { int pos = 0, i, end; unsigned int n; char buf[128], *hex; FILE *f = fopen(filename, "r"); if (!f) { fprintf(stderr, "%s: fopen(%s): %s\n", __func__, filename, strerror(errno)); return 0; } memset(spd, 0, sizeof spd); while (pos < sizeof spd && fgets(buf, sizeof buf, f)) { hex = strtok(buf, ":"); hex = strtok(NULL, ":"); for (i = 0; i < 16; i++) { if (sscanf(hex, " %02x%n", &n, &end) < 1) goto done; spd[pos++] = n; hex += end; } } done: fclose(f); return pos; } int writebin(const char *filename) { FILE *f = fopen(filename, "wb"); size_t n; if (!f) { fprintf(stderr, "%s: fopen(%s): %s\n", __func__, filename, strerror(errno)); return 0; } n = fwrite(spd, 1, sizeof spd, f); fclose(f); if (n != sizeof spd) { if (ferror(f)) fprintf(stderr, "%s: fwrite: %s\n", __func__, strerror(errno)); else fprintf(stderr, "%s: Short write! Got %zd, want %zd.\n", __func__, n, sizeof spd); return 0; } return 1; } int main(int argc, char *argv[]) { if (argc < 3) { fprintf(stderr, "syntax: %s input output\n", argv[0]); return 1; } if (!readhex(argv[1])) { fprintf(stderr, "Unable to read hex data from %s\n", argv[1]); return 1; } if (!writebin(argv[2])) { fprintf(stderr, "Unable to write binary data to %s\n", argv[2]); return 1; } return 0; }