]> git.lizzy.rs Git - dragonnet.git/blob - typegen/main.c
Rename messages to types
[dragonnet.git] / typegen / main.c
1 #include <dragontype/number.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 static size_t split(char ***strs, char *s, const char *delim)
7 {
8         size_t i = 0;
9         *strs = malloc((1+i) * sizeof(char *));
10
11         char *tok = strtok(s, delim);
12         while (tok != NULL) {
13                 *strs = realloc(*strs, (1+i) * sizeof(char *));
14                 (*strs)[i++] = tok;
15                 tok = strtok(NULL, delim);
16         }
17
18         return i;
19 }
20
21 int main(__attribute((unused)) int argc, __attribute((unused)) char **argv)
22 {
23         FILE *fp = fopen("types.dnet", "r");
24
25         char data[1 << 16];
26         memset(data, 0, sizeof data);
27         fread(data, sizeof *data, sizeof data, fp);
28
29         fclose(fp);
30         fp = fopen("dnet-types.h", "w");
31         fprintf(fp, "#include <dragontype/number.h>\n\n");
32
33         char **msgs;
34         size_t msgs_len = split(&msgs, data, "\n");
35
36         char *msg = NULL;
37         for (size_t i = 0; i < msgs_len; i++) {
38                 if (msgs[i][0] != '\t') {
39                         if (msg != NULL)
40                                 fprintf(fp, "} %s;\n", msg);
41
42                         msg = msgs[i];
43                         fprintf(fp, "typedef struct {\n");
44                 } else {
45                         char **tokens;
46                         split(&tokens, msgs[i], " ");
47
48                         char type[10];
49                         if (strcmp(tokens[0], "\ts8") == 0)
50                                 strcpy(type, "s8 ");
51                         else if (strcmp(tokens[0], "\ts16") == 0)
52                                 strcpy(type, "s16 ");
53                         else if (strcmp(tokens[0], "\ts32") == 0)
54                                 strcpy(type, "s32 ");
55                         else if (strcmp(tokens[0], "\ts64") == 0)
56                                 strcpy(type, "s64 ");
57                         else if (strcmp(tokens[0], "\tu8") == 0)
58                                 strcpy(type, "u8 ");
59                         else if (strcmp(tokens[0], "\tu16") == 0)
60                                 strcpy(type, "u16 ");
61                         else if (strcmp(tokens[0], "\tu32") == 0)
62                                 strcpy(type, "u32 ");
63                         else if (strcmp(tokens[0], "\tu64") == 0)
64                                 strcpy(type, "u64 ");
65
66                         fprintf(fp, "\t%s%s;\n", type, tokens[1]);
67                         free(tokens);
68                 }
69         }
70
71         fprintf(fp, "} %s;\n", msg);
72
73         free(msgs);
74         fclose(fp);
75 }