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