implemented enum serialization generation
This commit is contained in:
parent
fdf11cec7a
commit
19deaea93e
5 changed files with 106 additions and 27 deletions
|
|
@ -25,6 +25,7 @@ int kwil_typename_to_prefix(const char* restrict type_name, char* out_prefix, si
|
|||
if(len > out_size) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// generate a function prefix for a type name
|
||||
strcpy(out_prefix, type_name);
|
||||
|
||||
|
|
@ -44,7 +45,7 @@ int kwil_header_generate(struct kwil_header_t* self) {
|
|||
setvbuf(file, file_buffer, _IOLBF, 255);
|
||||
|
||||
if(!file) {
|
||||
printf("Failed to open kwil header for writing");
|
||||
printf("Failed to open %s for writing", filename);
|
||||
free(filename);
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -62,7 +63,8 @@ int kwil_header_generate(struct kwil_header_t* self) {
|
|||
kwil_struct_generate_to_json(&type->struct_type, file, type->type_name);
|
||||
break;
|
||||
case KWIL_TYPE_ENUM:
|
||||
//kwil_enum_generate_to_string(&type->enum_type, file, type->type_name);
|
||||
kwil_enum_generate_json_length(&type->enum_type, file, type->type_name);
|
||||
kwil_enum_generate_to_json(&type->enum_type, file, type->type_name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -184,3 +186,34 @@ int kwil_field_generate_to_json(struct kwil_field_t* self, FILE* file) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int kwil_enum_generate_json_length(struct kwil_enum_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(enum %s* src) {\\\n"
|
||||
" switch(*src) {\\\n", prefix, type_name);
|
||||
for(int option_index = 0; option_index < self->enum_values_len; ++option_index) {
|
||||
fprintf(file, " case %s: return %zu;\\\n",
|
||||
self->enum_values[option_index].name, strlen(self->enum_values[option_index].name));
|
||||
}
|
||||
fprintf(file, " }\\\n"
|
||||
"}\\\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kwil_enum_generate_to_json(struct kwil_enum_t* self, FILE* file, const char* type_name) {
|
||||
char prefix[48];
|
||||
kwil_typename_to_prefix(type_name, prefix, 47);
|
||||
fprintf(file, "size_t %s_to_json(enum %s* src, char* out) {\\\n"
|
||||
" switch(*src) {\\\n", prefix, type_name);
|
||||
|
||||
for(int option_index = 0; option_index < self->enum_values_len; ++option_index) {
|
||||
fprintf(file, " case %s:\\\n"
|
||||
" return sprintf(out, \"\\\"%s\\\"\");\\\n",
|
||||
self->enum_values[option_index].name, self->enum_values[option_index].name);
|
||||
}
|
||||
|
||||
fprintf(file, " }\\\n"
|
||||
"}\\\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,13 @@
|
|||
|
||||
extern int kwil_header_generate(struct kwil_header_t* self);
|
||||
|
||||
extern int kwil_struct_generate_json_length(struct kwil_struct_t* self, FILE* file, const char* type_name);
|
||||
extern int kwil_struct_generate_to_json(struct kwil_struct_t* self, FILE* file, const char* type_name);
|
||||
|
||||
extern int kwil_field_generate_to_json(struct kwil_field_t* self, FILE* file);
|
||||
|
||||
|
||||
extern int kwil_enum_generate_json_length(struct kwil_enum_t* self, FILE* file, const char* type_name);
|
||||
extern int kwil_enum_generate_to_json(struct kwil_enum_t* self, FILE* file, const char* type_name);
|
||||
|
||||
#endif // !_kwil_generate_H
|
||||
|
|
|
|||
|
|
@ -56,18 +56,21 @@ int read_typename(FILE* file, char* out_buf, int max_size) {
|
|||
char buffer[7];
|
||||
buffer[6] = '\0';
|
||||
|
||||
for(int i = 0; i < 6; ++i) {
|
||||
buffer[i] = fgetc(file);
|
||||
c = next_non_whitespace(file);
|
||||
for(int i = 0; i < 6 && (ispunct(c) || isalnum(c)); ++i) {
|
||||
buffer[i] = c;
|
||||
c = fgetc(file);
|
||||
}
|
||||
|
||||
// next line is not a compatible type declaration,
|
||||
// write null terminator and return zero
|
||||
if(strncmp(buffer, "struct", 7) != 0 && strncmp(buffer, "enum", 4) != 0) {
|
||||
if(strncmp(buffer, "struct ", 6) != 0 && strncmp(buffer, "enum ", 4) != 0) {
|
||||
*out_buf = '\0';
|
||||
printf("WARNING: KWIL_ENUM or KWIL_STRUCT specifier before incompatible declaration.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ignore the whitespace after "struct"
|
||||
// ignore the whitespace after "struct" or "enum"
|
||||
c = next_non_whitespace(file);
|
||||
|
||||
// write all text until the next whitespace or '{' to the out buffer
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue