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 // Can't be allocated on the stack for some reason
13 char *str = malloc(1+strlen(s));
16 char *tok = strtok(str, delim);
18 *strs = realloc(*strs, (1+i) * sizeof(char *));
19 (*strs)[i++] = strdup(tok);
20 tok = strtok(NULL, delim);
27 static void free_split(char **strs, size_t n)
29 for (size_t i = 0; i < n; ++i)
35 int main(__attribute((unused)) int argc, __attribute((unused)) char **argv)
37 FILE *fp = fopen("types.dnet", "r");
40 memset(data, '\0', sizeof data);
41 fread(data, sizeof *data, sizeof data, fp);
46 FILE *c_fp = fopen("dnet-types.c", "w");
47 fprintf(c_fp, "#include <dragonnet/recv.h>\n");
48 fprintf(c_fp, "#include <dragonnet/send.h>\n\n");
49 fprintf(c_fp, "#include \"dnet-types.h\"\n\n");
51 FILE *h_fp = fopen("dnet-types.h", "w");
52 fprintf(h_fp, "#include <dragontype/number.h>\n\n");
55 size_t msgs_len = split(&msgs, data, "\n");
59 for (size_t i = 0; i < msgs_len; ++i) {
60 if (msgs[i][0] != '\t') {
62 fprintf(h_fp, "} %s;\n\n", msg);
65 fprintf(h_fp, "typedef struct {\n");
68 size_t tokens_len = split(&tokens, msgs[i], " ");
70 fprintf(h_fp, "\t%s %s;\n", &tokens[0][1], tokens[1]);
71 free_split(tokens, tokens_len);
76 fprintf(h_fp, "} %s;\n\n", msg);
79 // Create (de)serialization functions
80 for (size_t i = 0; i < msgs_len; ++i) {
81 if (msgs[i][0] != '\t') {
83 fprintf(c_fp, "}\n\n");
86 fprintf(c_fp, "void dragonnet_send_%s(DragonnetPeer *p, %s type)\n{\n", msg, msg);
89 size_t tokens_len = split(&tokens, msgs[i], " ");
91 if (i >= msgs_len-1 || msgs[1+i][0] != '\t')
92 fprintf(c_fp, "\tsend_%s(p, true, type.%s);\n", &tokens[0][1], tokens[1]);
94 fprintf(c_fp, "\tsend_%s(p, false, type.%s);\n", &tokens[0][1], tokens[1]);
96 free_split(tokens, tokens_len);
101 fprintf(c_fp, "}\n\n");
104 for (size_t i = 0; i < msgs_len; ++i) {
105 if (msgs[i][0] != '\t') {
107 fprintf(c_fp, "\treturn type;\n");
108 fprintf(c_fp, "}\n\n");
112 fprintf(c_fp, "%s dragonnet_recv_%s(DragonnetPeer *p)\n{\n", msg, msg);
113 fprintf(c_fp, "\t%s type = {0};\n", msg);
116 size_t tokens_len = split(&tokens, msgs[i], " ");
118 fprintf(c_fp, "\ttype.%s = recv_%s(p);\n", tokens[1], &tokens[0][1]);
119 free_split(tokens, tokens_len);
124 fprintf(c_fp, "\treturn type;\n");
125 fprintf(c_fp, "}\n");
130 for (size_t i = 0; i < msgs_len; ++i)
131 if (msgs[i][0] != '\t')
134 fprintf(h_fp, "typedef enum {\n");
135 for (size_t i = 0; i < msgs_len; ++i) {
136 if (msgs[i][0] == '\t')
139 char upper[1 + strlen(msgs[i])];
141 strcpy(upper, msgs[i]);
143 while ((*ptr = *ptr ? toupper(*ptr) : '\0'))
147 fprintf(h_fp, "\tDRAGONNET_TYPE_%s\n", upper);
149 fprintf(h_fp, "\tDRAGONNET_TYPE_%s,\n", upper);
152 fprintf(h_fp, "} DragonnetType;\n");
154 free_split(msgs, msgs_len);