xref: /XiangShan/tools/readmemh/groupby-4byte.c (revision 5a7b942b030b799f8086bf9a6096981200fb8b46)
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