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