1 #include <stdio.h> 2 #include <assert.h> 3 #include <stdint.h> 4 5 int main(int argc, char *argv[]) { 6 assert(argc == 3); 7 8 FILE *in = fopen(argv[1], "rb"); 9 assert(in != NULL); 10 11 FILE *out = fopen(argv[2], "w"); 12 assert(out != NULL); 13 14 char line[128]; 15 uint32_t addr; 16 union { 17 uint8_t _8[4]; 18 uint32_t _32; 19 } data[4]; 20 while (fgets(line, 128, in) != NULL) { 21 if (line[0] == '@') { 22 sscanf(line + 1, "%x", &addr); 23 assert(addr % 4 == 0); 24 fprintf(out, "@%08x\n", addr / 4); 25 } 26 else { 27 int ret = sscanf(line, 28 "%hhx%hhx%hhx%hhx" 29 "%hhx%hhx%hhx%hhx" 30 "%hhx%hhx%hhx%hhx" 31 "%hhx%hhx%hhx%hhx", 32 &data[0]._8[0], &data[0]._8[1], &data[0]._8[2], &data[0]._8[3], 33 &data[1]._8[0], &data[1]._8[1], &data[1]._8[2], &data[1]._8[3], 34 &data[2]._8[0], &data[2]._8[1], &data[2]._8[2], &data[2]._8[3], 35 &data[3]._8[0], &data[3]._8[1], &data[3]._8[2], &data[3]._8[3]); 36 37 assert(ret == EOF || ret == 4 || ret == 8 || ret == 12 || ret == 16); 38 39 if (ret == EOF) continue; 40 41 if (ret >= 4) fprintf(out, "%08x ", data[0]._32); 42 if (ret >= 8) fprintf(out, "%08x ", data[1]._32); 43 if (ret >= 12) fprintf(out, "%08x ", data[2]._32); 44 if (ret >= 16) fprintf(out, "%08x ", data[3]._32); 45 fprintf(out, "\n"); 46 } 47 } 48 49 fclose(in); 50 fclose(out); 51 52 return 0; 53 } 54