]> git.lizzy.rs Git - dragonnet.git/blob - typegen/main.c
37b9fbddd0b74b4897ee490f50533e77cd8afaf7
[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[15];
49                         if (    // Numeric types
50                                         strcmp(&tokens[0][1], "u8") == 0 || strcmp(&tokens[0][1], "s8")
51                                         || strcmp(&tokens[0][1], "u16") || strcmp(&tokens[0][1], "s16")
52                                         || strcmp(&tokens[0][1], "u32") || strcmp(&tokens[0][1], "s32")
53                                         || strcmp(&tokens[0][1], "u64") || strcmp(&tokens[0][1], "s64")
54                                         || strcmp(&tokens[0][1], "f32") || strcmp(&tokens[0][1], "f64")
55                                         // Vectors (2 elements)
56                                         || strcmp(&tokens[0][1], "v2u8") || strcmp(&tokens[0][1], "v2s8")
57                                         || strcmp(&tokens[0][1], "v2u16") || strcmp(&tokens[0][1], "v2s16")
58                                         || strcmp(&tokens[0][1], "v2u32") || strcmp(&tokens[0][1], "v2s32")
59                                         || strcmp(&tokens[0][1], "v2u64") || strcmp(&tokens[0][1], "v2s64")
60                                         || strcmp(&tokens[0][1], "v2f32") || strcmp(&tokens[0][1], "v2f32")
61                                         || strcmp(&tokens[0][1], "v2f64") || strcmp(&tokens[0][1], "v2f64")
62                                         // Vectors (3 elements)
63                                         || strcmp(&tokens[0][1], "v3u8") || strcmp(&tokens[0][1], "v3s8")
64                                         || strcmp(&tokens[0][1], "v3u16") || strcmp(&tokens[0][1], "v3s16")
65                                         || strcmp(&tokens[0][1], "v3u32") || strcmp(&tokens[0][1], "v3s32")
66                                         || strcmp(&tokens[0][1], "v3u64") || strcmp(&tokens[0][1], "v3s64")
67                                         || strcmp(&tokens[0][1], "v3f32") || strcmp(&tokens[0][1], "v3f64")
68                                         // Vectors (4 elements)
69                                         || strcmp(&tokens[0][1], "v4u8") || strcmp(&tokens[0][1], "v4s8")
70                                         || strcmp(&tokens[0][1], "v4u16") || strcmp(&tokens[0][1], "v4s16")
71                                         || strcmp(&tokens[0][1], "v4u32") || strcmp(&tokens[0][1], "v4s32")
72                                         || strcmp(&tokens[0][1], "v4u64") || strcmp(&tokens[0][1], "v4s64")
73                                         || strcmp(&tokens[0][1], "v4f32") || strcmp(&tokens[0][1], "v4f64")
74                                         // AABB2
75                                         || strcmp(&tokens[0][1], "aabb2u8") || strcmp(&tokens[0][1], "aabb2s8")
76                                         || strcmp(&tokens[0][1], "aabb2u16") || strcmp(&tokens[0][1], "aabb2s16")
77                                         || strcmp(&tokens[0][1], "aabb2u32") || strcmp(&tokens[0][1], "aabb2s32")
78                                         || strcmp(&tokens[0][1], "aabb2u64") || strcmp(&tokens[0][1], "aabb2s64")
79                                         || strcmp(&tokens[0][1], "aabb2f32") || strcmp(&tokens[0][1], "aabb2f64")
80                                         // AABB3
81                                         || strcmp(&tokens[0][1], "aabb3u8") || strcmp(&tokens[0][1], "aabb3s8")
82                                         || strcmp(&tokens[0][1], "aabb3u16") || strcmp(&tokens[0][1], "aabb3s16")
83                                         || strcmp(&tokens[0][1], "aabb3u32") || strcmp(&tokens[0][1], "aabb3s32")
84                                         || strcmp(&tokens[0][1], "aabb3u64") || strcmp(&tokens[0][1], "aabb3s64")
85                                         || strcmp(&tokens[0][1], "aabb3f32") || strcmp(&tokens[0][1], "aabb3f64")
86                                         // AABB4
87                                         || strcmp(&tokens[0][1], "aabb4u8") || strcmp(&tokens[0][1], "aabb4s8")
88                                         || strcmp(&tokens[0][1], "aabb4u16") || strcmp(&tokens[0][1], "aabb4s16")
89                                         || strcmp(&tokens[0][1], "aabb4u32") || strcmp(&tokens[0][1], "aabb4s32")
90                                         || strcmp(&tokens[0][1], "aabb4u64") || strcmp(&tokens[0][1], "aabb4s64")
91                                         || strcmp(&tokens[0][1], "aabb4f32") || strcmp(&tokens[0][1], "aabb4f64"))
92                                 sprintf(type, "%s ", &tokens[0][1]);
93                         else if (strcmp(&tokens[0][1], "string"))
94                                 // String
95                                 strcpy(type, "char *");
96                         else if (strcmp(&tokens[0][1], "blob"))
97                                 // Blob
98                                 strcpy(type, "DragonnetBlob ");
99
100                         fprintf(fp, "\t%s%s;\n", type, &tokens[0][1]);
101                         free(tokens);
102                 }
103         }
104
105         fprintf(fp, "} %s;\n", msg);
106
107         free(msgs);
108         fclose(fp);
109 }