kwil now generates a length get function and _to_json will no longer allocate memory

main
Sara 2023-09-13 10:39:33 +02:00
parent c492835813
commit 675aadbe0d
1 changed files with 33 additions and 15 deletions

View File

@ -43,13 +43,16 @@ int kwil_header_generate(struct kwil_header_t* self) {
return 1;
}
fprintf(file, "#include <string.h>\n"
"#define KWIL_GEN_IMPL(...)\\\n");
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);
break;
case KWIL_TYPE_ENUM:
@ -67,6 +70,7 @@ int kwil_header_generate(struct kwil_header_t* self) {
static
void kwil_field_generate_to_string(struct kwil_field_t* self, FILE* file) {
char custom_type_prefix[48];
switch(self->type_tag) {
case KWIL_FIELD_CHAR:
if(self->array_length > 0 || self->array_dynamic) {
@ -85,12 +89,17 @@ void kwil_field_generate_to_string(struct kwil_field_t* self, FILE* file) {
case KWIL_FIELD_UNSIGNED:
fprintf(file, " json_len += sprintf(json + json_len, \"%%u\", src->%s);\\\n", self->name_str);
break;
default: break;
case KWIL_FIELD_UNKNOWN:
case KWIL_FIELD_CUSTOM:
kwil_typename_to_prefix(self->type_str, custom_type_prefix, 47);
fprintf(file, " json_len += %s_to_json(&src->%s, json + json_len);\\\n", custom_type_prefix, self->name_str);
break;
}
}
static
void kwil_field_get_serialized_length(struct kwil_field_t* self, FILE* file) {
char custom_type_prefix[48];
size_t len = strlen(self->name_str) + 4; // "name": ,
fprintf(file, " /* length of %s */\\\n"
@ -116,34 +125,43 @@ void kwil_field_get_serialized_length(struct kwil_field_t* self, FILE* file) {
break;
case KWIL_FIELD_CUSTOM:
case KWIL_FIELD_UNKNOWN:
fprintf(file, ";\\\n");
kwil_typename_to_prefix(self->type_str, custom_type_prefix, 47);
fprintf(file, " + %s_json_length(&src->%s);\\\n", custom_type_prefix, self->name_str);
break;
}
}
int kwil_struct_generate_json_length(struct kwil_struct_t* self, FILE* file, const char* type_name) {
char prefix[48];
kwil_typename_to_prefix(type_name, prefix, 47);
fprintf(file, "size_t %s_json_length(struct %s* src) {\\\n"
" size_t json_capacity = 2;\\\n",// allocate at least two for "{}\0"
prefix, type_name);
for(int field_index = 0; field_index < self->fields_len; ++field_index) {
kwil_field_get_serialized_length(self->fields + field_index, file);
}
fprintf(file, " return json_capacity;\\\n"
"}\\\n");
return 0;
}
int kwil_struct_generate_to_json(struct kwil_struct_t* self, FILE* file, const char* type_name) {
char prefix[48];
kwil_typename_to_prefix(type_name, prefix, 47);
fprintf(file, "int %s_to_json(struct %s* src, char** out_json) {\\\n"
" int json_capacity = 2; \\\n" // allocate at least two for "{}\0"
fprintf(file, "int %s_to_json(struct %s* src, char* json) {\\\n"
, prefix, type_name);
for(int field_index = 0; field_index < self->fields_len; ++field_index) {
kwil_field_get_serialized_length(self->fields + field_index, file);
}
fprintf(file, " char* json = malloc(json_capacity);\\\n"
" int json_len = 1;\\\n"
" strcpy(json, \"{\");\\\n"
" *out_json = json;\\\n");
fprintf(file, " int json_len = 1;\\\n"
" strcpy(json, \"{\");\\\n");
for(int field_index = 0; field_index < self->fields_len; ++field_index) {
kwil_field_generate_to_json(self->fields + field_index, file);
}
fprintf(file, " strcpy(json + json_len - 1, \"}\");\\\n"
" return json_capacity;\\\n"
" return json_len;\\\n"
"}\\\n");
fflush(file);