]> git.lizzy.rs Git - dragonnet.git/blob - typegen/main.c
Add type enum generation
[dragonnet.git] / typegen / main.c
1 #include <ctype.h>
2 #include <dragontype/number.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 static size_t split(char ***strs, char *s, const char *delim)
8 {
9         size_t i = 0;
10         *strs = malloc((1+i) * sizeof(char *));
11
12         char *tok = strtok(s, delim);
13         while (tok != NULL) {
14                 *strs = realloc(*strs, (1+i) * sizeof(char *));
15                 (*strs)[i++] = tok;
16                 tok = strtok(NULL, delim);
17         }
18
19         return i;
20 }
21
22 int main(__attribute((unused)) int argc, __attribute((unused)) char **argv)
23 {
24         FILE *fp = fopen("types.dnet", "r");
25
26         char data[1 << 16];
27         memset(data, 0, sizeof data);
28         fread(data, sizeof *data, sizeof data, fp);
29
30         fclose(fp);
31         fp = fopen("dnet-types.h", "w");
32         fprintf(fp, "#include <dragontype/number.h>\n\n");
33
34         char **msgs;
35         size_t msgs_len = split(&msgs, data, "\n");
36
37         char *msg = NULL;
38         for (size_t i = 0; i < msgs_len; ++i) {
39                 if (msgs[i][0] != '\t') {
40                         if (msg != NULL)
41                                 fprintf(fp, "} %s;\n\n", msg);
42
43                         msg = msgs[i];
44                         fprintf(fp, "typedef struct {\n");
45                 } else {
46                         char **tokens;
47                         split(&tokens, msgs[i], " ");
48
49                         char type[15];
50                         if (    // Numeric types
51                                         strcmp(&tokens[0][1], "u8") == 0 || strcmp(&tokens[0][1], "s8")
52                                         || strcmp(&tokens[0][1], "u16") || strcmp(&tokens[0][1], "s16")
53                                         || strcmp(&tokens[0][1], "u32") || strcmp(&tokens[0][1], "s32")
54                                         || strcmp(&tokens[0][1], "u64") || strcmp(&tokens[0][1], "s64")
55                                         || strcmp(&tokens[0][1], "f32") || strcmp(&tokens[0][1], "f64")
56                                         // Vectors (2 elements)
57                                         || strcmp(&tokens[0][1], "v2u8") || strcmp(&tokens[0][1], "v2s8")
58                                         || strcmp(&tokens[0][1], "v2u16") || strcmp(&tokens[0][1], "v2s16")
59                                         || strcmp(&tokens[0][1], "v2u32") || strcmp(&tokens[0][1], "v2s32")
60                                         || strcmp(&tokens[0][1], "v2u64") || strcmp(&tokens[0][1], "v2s64")
61                                         || strcmp(&tokens[0][1], "v2f32") || strcmp(&tokens[0][1], "v2f32")
62                                         || strcmp(&tokens[0][1], "v2f64") || strcmp(&tokens[0][1], "v2f64")
63                                         // Vectors (3 elements)
64                                         || strcmp(&tokens[0][1], "v3u8") || strcmp(&tokens[0][1], "v3s8")
65                                         || strcmp(&tokens[0][1], "v3u16") || strcmp(&tokens[0][1], "v3s16")
66                                         || strcmp(&tokens[0][1], "v3u32") || strcmp(&tokens[0][1], "v3s32")
67                                         || strcmp(&tokens[0][1], "v3u64") || strcmp(&tokens[0][1], "v3s64")
68                                         || strcmp(&tokens[0][1], "v3f32") || strcmp(&tokens[0][1], "v3f64")
69                                         // Vectors (4 elements)
70                                         || strcmp(&tokens[0][1], "v4u8") || strcmp(&tokens[0][1], "v4s8")
71                                         || strcmp(&tokens[0][1], "v4u16") || strcmp(&tokens[0][1], "v4s16")
72                                         || strcmp(&tokens[0][1], "v4u32") || strcmp(&tokens[0][1], "v4s32")
73                                         || strcmp(&tokens[0][1], "v4u64") || strcmp(&tokens[0][1], "v4s64")
74                                         || strcmp(&tokens[0][1], "v4f32") || strcmp(&tokens[0][1], "v4f64")
75                                         // AABB2
76                                         || strcmp(&tokens[0][1], "aabb2u8") || strcmp(&tokens[0][1], "aabb2s8")
77                                         || strcmp(&tokens[0][1], "aabb2u16") || strcmp(&tokens[0][1], "aabb2s16")
78                                         || strcmp(&tokens[0][1], "aabb2u32") || strcmp(&tokens[0][1], "aabb2s32")
79                                         || strcmp(&tokens[0][1], "aabb2u64") || strcmp(&tokens[0][1], "aabb2s64")
80                                         || strcmp(&tokens[0][1], "aabb2f32") || strcmp(&tokens[0][1], "aabb2f64")
81                                         // AABB3
82                                         || strcmp(&tokens[0][1], "aabb3u8") || strcmp(&tokens[0][1], "aabb3s8")
83                                         || strcmp(&tokens[0][1], "aabb3u16") || strcmp(&tokens[0][1], "aabb3s16")
84                                         || strcmp(&tokens[0][1], "aabb3u32") || strcmp(&tokens[0][1], "aabb3s32")
85                                         || strcmp(&tokens[0][1], "aabb3u64") || strcmp(&tokens[0][1], "aabb3s64")
86                                         || strcmp(&tokens[0][1], "aabb3f32") || strcmp(&tokens[0][1], "aabb3f64")
87                                         // AABB4
88                                         || strcmp(&tokens[0][1], "aabb4u8") || strcmp(&tokens[0][1], "aabb4s8")
89                                         || strcmp(&tokens[0][1], "aabb4u16") || strcmp(&tokens[0][1], "aabb4s16")
90                                         || strcmp(&tokens[0][1], "aabb4u32") || strcmp(&tokens[0][1], "aabb4s32")
91                                         || strcmp(&tokens[0][1], "aabb4u64") || strcmp(&tokens[0][1], "aabb4s64")
92                                         || strcmp(&tokens[0][1], "aabb4f32") || strcmp(&tokens[0][1], "aabb4f64"))
93                                 sprintf(type, "%s ", &tokens[0][1]);
94                         else if (strcmp(&tokens[0][1], "string"))
95                                 // String
96                                 strcpy(type, "char *");
97                         else if (strcmp(&tokens[0][1], "blob"))
98                                 // Blob
99                                 strcpy(type, "DragonnetBlob ");
100
101                         fprintf(fp, "\t%s%s;\n", type, tokens[1]);
102                         free(tokens);
103                 }
104         }
105
106         fprintf(fp, "} %s;\n\ntypedef enum {\n", msg);
107         for (size_t i = 0; i < msgs_len; ++i) {
108                 if (msgs[i][0] == '\t')
109                         continue;
110
111                 char upper[1 + strlen(msgs[i])];
112                 char *ptr = upper;
113                 strcpy(upper, msgs[i]);
114
115                 while ((*ptr = *ptr ? toupper(*ptr) : '\0'))
116                         ++ptr;
117
118                 if (i == msgs_len-1)
119                         fprintf(fp, "\tDRAGONNET_TYPE_%s\n", upper);
120                 else
121                         fprintf(fp, "\tDRAGONNET_TYPE_%s,\n", upper);
122         }
123
124         fprintf(fp, "} DragonnetType;\n");
125
126         free(msgs);
127         fclose(fp);
128 }