feat: handle more complex types
NOTE: doesn't handles union and arrays, considere attributes part of the type
This commit is contained in:
43
cmeta.h
43
cmeta.h
@@ -78,6 +78,11 @@ void sb_append(String_Builder* sb, const char* data) {
|
|||||||
sb->data[sb->length] = '\0';
|
sb->data[sb->length] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sb_append_ch(String_Builder* sb, char ch) {
|
||||||
|
char buf[2] = {ch, '\0'};
|
||||||
|
sb_append(sb, buf);
|
||||||
|
}
|
||||||
|
|
||||||
#define da_append(da, item) \
|
#define da_append(da, item) \
|
||||||
do { \
|
do { \
|
||||||
if ((da)->count + 1 > (da)->capacity) { \
|
if ((da)->count + 1 > (da)->capacity) { \
|
||||||
@@ -142,6 +147,7 @@ bool parse_struct(Parsed_Struct_Info* info) {
|
|||||||
char* name = NULL;
|
char* name = NULL;
|
||||||
|
|
||||||
Parsed_Field_Infos fields = {0};
|
Parsed_Field_Infos fields = {0};
|
||||||
|
String_Builder field = {0};
|
||||||
|
|
||||||
if (!lexer_expect_keyword("typedef")) goto fail;
|
if (!lexer_expect_keyword("typedef")) goto fail;
|
||||||
if (!lexer_expect_keyword("struct")) goto fail;
|
if (!lexer_expect_keyword("struct")) goto fail;
|
||||||
@@ -157,19 +163,36 @@ bool parse_struct(Parsed_Struct_Info* info) {
|
|||||||
if (lexer.token == '}') break;
|
if (lexer.token == '}') break;
|
||||||
lexer.parse_point = mark;
|
lexer.parse_point = mark;
|
||||||
|
|
||||||
if (!lexer_expect(CLEX_id, "field type")) goto fail;
|
field.length = 0;
|
||||||
char* field_type = strdup(lexer.string);
|
while (stb_c_lexer_get_token(&lexer) && lexer.token != ';') {
|
||||||
|
if (lexer.token <= 255) {
|
||||||
|
// TODO: parse arrays
|
||||||
|
if(lexer.token == '[') goto fail;
|
||||||
|
|
||||||
if (!lexer_expect(CLEX_id, "field name")) goto fail;
|
sb_append_ch(&field, (char)lexer.token);
|
||||||
char* field_name = strdup(lexer.string);
|
sb_append_ch(&field, ' ');
|
||||||
|
} else {
|
||||||
|
// TODO: parse unions
|
||||||
|
if(strcmp(lexer.string, "union") == 0) goto fail;
|
||||||
|
|
||||||
Parsed_Field_Info field = {
|
// TODO: parse attributes
|
||||||
|
sb_append(&field, lexer.string);
|
||||||
|
sb_append_ch(&field, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
field.data[field.length - 1] = '\0';
|
||||||
|
|
||||||
|
char* last_space = strrchr(field.data, ' ');
|
||||||
|
char* field_name = strdup(last_space + 1);
|
||||||
|
|
||||||
|
field.data[last_space - field.data] = '\0';
|
||||||
|
|
||||||
|
char* field_type = strdup(field.data);
|
||||||
|
|
||||||
|
da_append(&fields, ((Parsed_Field_Info) {
|
||||||
.type = field_type,
|
.type = field_type,
|
||||||
.name = field_name,
|
.name = field_name,
|
||||||
};
|
}));
|
||||||
da_append(&fields, field);
|
|
||||||
|
|
||||||
if(!lexer_expect(';', NULL)) goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lexer_expect(CLEX_id, "type name")) goto fail;
|
if (!lexer_expect(CLEX_id, "type name")) goto fail;
|
||||||
@@ -185,6 +208,8 @@ bool parse_struct(Parsed_Struct_Info* info) {
|
|||||||
|
|
||||||
result = true;
|
result = true;
|
||||||
fail:
|
fail:
|
||||||
|
free(field.data);
|
||||||
|
|
||||||
if(!result) {
|
if(!result) {
|
||||||
free(name);
|
free(name);
|
||||||
for(size_t i = 0; i < fields.count; i += 1) {
|
for(size_t i = 0; i < fields.count; i += 1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user