#include "kwil_generate.h" #include "kwil_serialize.h" #include "kwil_deserialize.h" #include #include #include int kwil_header_generate(struct kwil_header_t* self) { char file_buffer[255]; char* filename; kwil_header_generated_file_name(self, &filename); FILE* file = fopen(filename, "w+"); setvbuf(file, file_buffer, _IOLBF, 255); if(!file) { printf("Failed to open %s for writing", filename); free(filename); return 1; } fprintf(file, "#include \n"); fprintf(file, "#define KWIL_GEN_IMPL(...)\\\n"); for(int type_index = 0; type_index < self->types_len; ++type_index) { struct kwil_type_t* type = self->types + type_index; printf("Generating functions for %s\n", type->type_name); switch(type->type_tag) { case KWIL_TYPE_STRUCT: kwil_struct_generate_json_length(&type->struct_type, file, type->type_name); kwil_struct_generate_to_json(&type->struct_type, file, type->type_name); kwil_struct_generate_from_json(&type->struct_type, type->type_name, file); break; case KWIL_TYPE_ENUM: kwil_enum_generate_json_length(&type->enum_type, file, type->type_name); kwil_enum_generate_to_json(&type->enum_type, file, type->type_name); kwil_enum_generate_from_json(&type->enum_type, type->type_name, file); break; } } fprintf(file, "\n"); fclose(file); free(filename); return 0; } int kwil_header_generated_file_name(struct kwil_header_t* self, char** out) { int len = strlen(self->file_name); char* filename = malloc(len + 5); strncpy(filename, self->file_name, len-2); strcpy(filename + len-2, ".kwil.h"); *out = filename; return len; } int kwil_typename_to_prefix(const char* restrict type_name, char* restrict out_prefix, size_t out_size) { if(strncmp("enum ", type_name, 5) == 0) { type_name += 5; } else if(strncmp("struct ", type_name, 7) == 0) { type_name += 7; } int len = strlen(type_name); if(len > out_size) { return 1; } // generate a function prefix for a type name strcpy(out_prefix, type_name); // remove _t postfix if relevant if(strcmp(out_prefix + len -3, "_t") == 0) { *(out_prefix + len - 3) = '\0'; } return strlen(out_prefix); }