static error_code_t _on_field_list(generator_types_h_t *self, const syn_field_list_t *field_list) { uint32_t i; for(i = 0; i < field_list->field_list_num; ++i) { if(field_list->field_list[i].type.type == E_SNT_CONTAINER) { //为vector对象自动生成一个计数器对象, 所以一个vector类型的对象需要占用两个符号。 if(field_list->field_list[i].type.ct.ct == E_CT_VECTOR) { generator_print(&self->super, 1, ""); generator_print_ctype(&self->super, &g_vec_num_type); generator_printline(&self->super, 0, " "VEC_NUM_TYPE_STYLE";", field_list->field_list[i].identifier); generator_print(&self->super, 1, ""); generator_print_ctype(&self->super, &field_list->field_list[i].type.ct.vector_type); generator_print(&self->super, 0, " %s", field_list->field_list[i].identifier); generator_print(&self->super, 0, "[%s]", field_list->field_list[i].type.ct.vector_length); if(field_list->field_list[i].type.ct.vector_type.st == E_ST_STRING) { generator_print(&self->super, 0, "[%s]", field_list->field_list[i].type.ct.vector_type.string_length); } } } else { generator_print(&self->super, 1, ""); generator_print_ctype(&self->super, &field_list->field_list[i].type.st); generator_print(&self->super, 0, " %s", field_list->field_list[i].identifier); if(field_list->field_list[i].type.st.st == E_ST_STRING) { generator_print(&self->super, 0, "[%s]", field_list->field_list[i].type.st.string_length); } generator_print(&self->super, 0, ""); } generator_print(&self->super, 0, ";"); if(field_list->field_list[i].comment.text[0]) { generator_print(&self->super, 0, "//%s", field_list->field_list[i].comment.text); } generator_printline(&self->super, 0, ""); } return E_TD_NOERROR; }
static error_code_t _on_union(td_generator_writer_h_t *self, const syn_union_t *de_union) { generator_print(&self->super, 0, "tlibc_error_code_t tlibc_write_%s(tlibc_abstract_writer_t *self, const union %s *data, ", de_union->name, de_union->name); generator_print_ctype(&self->super, &de_union->parameters.par_list[0].type); generator_printline(&self->super, 0, " selector);"); generator_printline(&self->super, 0, ""); return E_TD_NOERROR; }
static error_code_t _on_typedef(generator_types_h_t *self, const syn_typedef_t *de_typedef) { generator_print(&self->super, 0, "typedef "); generator_print_ctype(&self->super, &de_typedef->type); generator_print(&self->super, 0, " %s", de_typedef->name); if(de_typedef->type.st == E_ST_STRING) { generator_print(&self->super, 0, "[%s]", de_typedef->type.string_length); } generator_print(&self->super, 0, ";"); generator_printline(&self->super, 0, ""); return E_TD_NOERROR; }
//todo优化字符串匹配代码 static error_code_t _on_enum(generator_reader_c_t *self, const syn_enum_t *de_enum) { uint32_t i; generator_printline(&self->super, 0, "tlibc_error_code_t tlibc_read_%s(tlibc_abstract_reader_t *self, enum %s *data)", de_enum->name, de_enum->name); generator_printline(&self->super, 0, "{"); generator_printline(&self->super, 0, "\ttlibc_error_code_t ret = E_TLIBC_NOERROR;"); generator_printline(&self->super, 0, "\tif((ret = tlibc_read_enum_begin(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name); generator_printline(&self->super, 0, ""); generator_print(&self->super, 0, "\tret = tlibc_read_"); generator_print_type_name(&self->super, &g_enum_type); generator_print(&self->super, 0, "(self, ("); generator_print_ctype(&self->super, &g_enum_type); generator_printline(&self->super, 0, "*)data);"); generator_printline(&self->super, 0, "\tif(ret == E_TLIBC_PLEASE_READ_ENUM_NAME)"); generator_printline(&self->super, 0, "\t{"); generator_printline(&self->super, 0, "\t\tchar name[TLIBC_MAX_LENGTH_OF_IDENTIFIER];"); generator_printline(&self->super, 0, "\t\tif((ret = tlibc_read_string(self, name, TLIBC_MAX_LENGTH_OF_IDENTIFIER)) != E_TLIBC_NOERROR) goto done;"); generator_printline(&self->super, 0, "\t\tfor(;;)"); generator_printline(&self->super, 0, "\t\t{"); for(i = 0; i < de_enum->enum_def_list_num; ++i) { generator_printline(&self->super, 0, "\t\t\tif(strcmp(name, \"%s\") == 0)", de_enum->enum_def_list[i].identifier); generator_printline(&self->super, 0, "\t\t\t{"); generator_printline(&self->super, 0, "\t\t\t\t*data = %s;", de_enum->enum_def_list[i].identifier); generator_printline(&self->super, 0, "\t\t\t\tbreak;"); generator_printline(&self->super, 0, "\t\t\t}"); } generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, "\t\t\tret = E_TLIBC_NOT_FOUND;"); generator_printline(&self->super, 0, "\t\t\tgoto done;"); generator_printline(&self->super, 0, "\t\t}"); generator_printline(&self->super, 0, "\t}"); generator_printline(&self->super, 0, "\telse if(ret != E_TLIBC_NOERROR)"); generator_printline(&self->super, 0, "\t{"); generator_printline(&self->super, 0, "\t\tgoto done;"); generator_printline(&self->super, 0, "\t}"); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, "\tif((ret = tlibc_read_enum_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name); generator_printline(&self->super, 0, "done:"); generator_printline(&self->super, 0, "\treturn ret;"); generator_printline(&self->super, 0, "}"); generator_printline(&self->super, 0, ""); return E_TD_NOERROR; }
static error_code_t _on_enum(generator_writer_c_t *self, const syn_enum_t *de_enum) { uint32_t i; generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, "tlibc_error_code_t tlibc_write_%s(tlibc_abstract_writer_t *self, const enum %s *data)", de_enum->name, de_enum->name); generator_printline(&self->super, 0, "{"); generator_printline(&self->super, 0, "\ttlibc_error_code_t ret = E_TLIBC_NOERROR;"); generator_printline(&self->super, 0, "\tif((ret = tlibc_write_enum_begin(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name); generator_printline(&self->super, 0, ""); generator_print(&self->super, 0, "\tret = tlibc_write_"); generator_print_type_name(&self->super, &g_enum_type); generator_print(&self->super, 0, "(self, (const "); generator_print_ctype(&self->super, &g_enum_type); generator_printline(&self->super, 0, "*)data);"); generator_printline(&self->super, 0, "\tif(ret == E_TLIBC_PLEASE_READ_ENUM_NAME)"); generator_printline(&self->super, 0, "\t{"); generator_printline(&self->super, 0, "\t\tswitch(*data)"); generator_printline(&self->super, 0, "\t\t{"); for(i = 0; i < de_enum->enum_def_list_num; ++i) { generator_printline(&self->super, 0, "\t\tcase %s:", de_enum->enum_def_list[i].identifier); generator_printline(&self->super, 0, "\t\t\tif((ret = tlibc_write_string(self, \"%s\", %u)) == E_TLIBC_NOERROR) break;", de_enum->enum_def_list[i].identifier, strlen(de_enum->enum_def_list[i].identifier)); generator_printline(&self->super, 0, "\t\t\tbreak;"); } generator_printline(&self->super, 0, "\t\tdefault:"); generator_printline(&self->super, 0, "\t\t\tret = E_TLIBC_NOT_FOUND;"); generator_printline(&self->super, 0, "\t\t\tgoto done;"); generator_printline(&self->super, 0, "\t\t}"); generator_printline(&self->super, 0, "\t}"); generator_printline(&self->super, 0, "\telse if(ret != E_TLIBC_NOERROR)"); generator_printline(&self->super, 0, "\t{"); generator_printline(&self->super, 0, "\t\tgoto done;"); generator_printline(&self->super, 0, "\t}"); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, "\tif((ret = tlibc_write_enum_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name); generator_printline(&self->super, 0, "done:"); generator_printline(&self->super, 0, "\treturn ret;"); generator_printline(&self->super, 0, "}"); return E_TD_NOERROR; }
static error_code_t _on_union_field_list(generator_types_h_t *self, const syn_union_field_list_t *union_field_list) { uint32_t i; for(i = 0; i < union_field_list->union_field_list_num; ++i) { generator_print(&self->super, 1, ""); generator_print_ctype(&self->super, &union_field_list->union_field_list[i].simple_type); generator_print(&self->super, 0, " %s", union_field_list->union_field_list[i].name); if(union_field_list->union_field_list[i].simple_type.st == E_ST_STRING) { generator_print(&self->super, 0, "[%s]", union_field_list->union_field_list[i].name, union_field_list->union_field_list[i].simple_type.string_length); } generator_print(&self->super, 0, ";"); if(union_field_list->union_field_list[i].comment.text[0]) { generator_print(&self->super, 0, "//%s", union_field_list->union_field_list[i].comment.text); } generator_printline(&self->super, 0, ""); } return E_TD_NOERROR; }