81 lines
2.4 KiB
C
81 lines
2.4 KiB
C
#include "kwil_generate.h"
|
|
#include "kwil_serialize.h"
|
|
#include "kwil_deserialize.h"
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
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 <string.h>\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);
|
|
}
|