kwil now generates a length get function and _to_json will no longer allocate memory
parent
c492835813
commit
675aadbe0d
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue