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 \"dnet-types.h\"\n");
48 fprintf(c_fp, "#include <dragonnet/send.h>\n\n");
50 FILE *h_fp = fopen("dnet-types.h", "w");
51 fprintf(h_fp, "#include <dragontype/number.h>\n\n");
54 size_t msgs_len = split(&msgs, data, "\n");
58 for (size_t i = 0; i < msgs_len; ++i) {
59 if (msgs[i][0] != '\t') {
61 fprintf(h_fp, "} %s;\n\n", msg);
64 fprintf(h_fp, "typedef struct {\n");
67 size_t tokens_len = split(&tokens, msgs[i], " ");
69 fprintf(h_fp, "\t%s %s;\n", &tokens[0][1], tokens[1]);
70 free_split(tokens, tokens_len);
75 fprintf(h_fp, "} %s;\n\n", msg);
78 // Create (de)serialization functions
79 for (size_t i = 0; i < msgs_len; ++i) {
80 if (msgs[i][0] != '\t') {
82 fprintf(c_fp, "}\n\n");
85 fprintf(c_fp, "void dragonnet_send_%s(DragonnetPeer *p, %s type)\n{\n", msg, msg);
88 size_t tokens_len = split(&tokens, msgs[i], " ");
90 fprintf(c_fp, "\tsend_%s(p, type.%s);\n", &tokens[0][1], tokens[1]);
91 free_split(tokens, tokens_len);
96 fprintf(c_fp, "}\n\n");
99 for (size_t i = 0; i < msgs_len; ++i) {
100 if (msgs[i][0] != '\t') {
102 fprintf(c_fp, "\treturn type;\n");
103 fprintf(c_fp, "}\n\n");
107 fprintf(c_fp, "%s dragonnet_recv_%s(DragonnetPeer *p)\n{\n", msg, msg);
108 fprintf(c_fp, "\t%s type = {0};\n", msg);
111 size_t tokens_len = split(&tokens, msgs[i], " ");
113 fprintf(c_fp, "\ttype.%s = recv_%s(p);\n", tokens[1], &tokens[0][1]);
114 free_split(tokens, tokens_len);
119 fprintf(c_fp, "\treturn type;\n");
120 fprintf(c_fp, "}\n");
125 for (size_t i = 0; i < msgs_len; ++i)
126 if (msgs[i][0] != '\t')
129 fprintf(h_fp, "typedef enum {\n");
130 for (size_t i = 0; i < msgs_len; ++i) {
131 if (msgs[i][0] == '\t')
134 char upper[1 + strlen(msgs[i])];
136 strcpy(upper, msgs[i]);
138 while ((*ptr = *ptr ? toupper(*ptr) : '\0'))
142 fprintf(h_fp, "\tDRAGONNET_TYPE_%s\n", upper);
144 fprintf(h_fp, "\tDRAGONNET_TYPE_%s,\n", upper);
147 fprintf(h_fp, "} DragonnetType;\n");
149 free_split(msgs, msgs_len);