2 #include <dragontype/number.h>
7 static size_t split(char ***strs, char *s, const char *delim)
10 *strs = malloc((1+i) * sizeof(char *));
12 char *tok = strtok(s, delim);
14 *strs = realloc(*strs, (1+i) * sizeof(char *));
16 tok = strtok(NULL, delim);
22 int main(__attribute((unused)) int argc, __attribute((unused)) char **argv)
24 FILE *fp = fopen("types.dnet", "r");
27 memset(data, 0, sizeof data);
28 fread(data, sizeof *data, sizeof data, fp);
31 fp = fopen("dnet-types.h", "w");
32 fprintf(fp, "#include <dragontype/number.h>\n\n");
35 size_t msgs_len = split(&msgs, data, "\n");
38 for (size_t i = 0; i < msgs_len; ++i) {
39 if (msgs[i][0] != '\t') {
41 fprintf(fp, "} %s;\n\n", msg);
44 fprintf(fp, "typedef struct {\n");
47 split(&tokens, msgs[i], " ");
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")
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")
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")
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"))
96 strcpy(type, "char *");
97 else if (strcmp(&tokens[0][1], "blob"))
99 strcpy(type, "DragonnetBlob ");
101 fprintf(fp, "\t%s%s;\n", type, tokens[1]);
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')
111 char upper[1 + strlen(msgs[i])];
113 strcpy(upper, msgs[i]);
115 while ((*ptr = *ptr ? toupper(*ptr) : '\0'))
119 fprintf(fp, "\tDRAGONNET_TYPE_%s\n", upper);
121 fprintf(fp, "\tDRAGONNET_TYPE_%s,\n", upper);
124 fprintf(fp, "} DragonnetType;\n");