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(generator_writer_c_t *self, const syn_union_t *de_union) { 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 union %s *data, enum %s selector)", de_union->name, de_union->name, de_union->parameters.par_list[0].type.st_refer); 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_union_begin(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_union->name); generator_printline(&self->super, 0, "\tswitch(selector)"); generator_printline(&self->super, 0, "\t{"); for(i = 0; i < de_union->union_field_list.union_field_list_num; ++i) { const syn_simple_type_t *st = symbols_get_real_type(self->super.symbols, &de_union->union_field_list.union_field_list[i].simple_type); generator_printline(&self->super, 1, "case %s:", de_union->union_field_list.union_field_list[i].key); generator_printline(&self->super, 2, "if((ret = tlibc_write_field_begin(self, \"%s\")) == E_TLIBC_NOERROR)", de_union->union_field_list.union_field_list[i].name); generator_printline(&self->super, 2, "{"); if(st->st == E_ST_STRING) { generator_printline(&self->super, 2, "if((ret = tlibc_write_string(self, data->%s, %s)) != E_TLIBC_NOERROR) goto done;", de_union->union_field_list.union_field_list[i].name, st->string_length); } else { generator_print(&self->super, 2, "if((ret = tlibc_write_"); generator_print_type_name(&self->super, st); generator_print(&self->super, 0, "(self, &data->%s)) != E_TLIBC_NOERROR) goto done;", de_union->union_field_list.union_field_list[i].name); } generator_printline(&self->super, 2, "}"); generator_printline(&self->super, 2, "else if(ret != E_TLIBC_IGNORE)"); generator_printline(&self->super, 3, "goto done;"); generator_printline(&self->super, 2, "if((ret = tlibc_write_field_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_union->union_field_list.union_field_list[i].name); generator_printline(&self->super, 2, "break;"); } generator_printline(&self->super, 1, "default:"); generator_printline(&self->super, 2, "break;"); generator_printline(&self->super, 1, "}"); generator_printline(&self->super, 1, "if((ret = tlibc_write_union_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_union->name); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, "done:"); generator_printline(&self->super, 1, "return ret;"); generator_printline(&self->super, 0, "}"); return E_TD_NOERROR; }
static error_code_t _on_const(generator_types_h_t *self, const syn_const_t *de_const) { generator_print(&self->super, 0, "#define %s ", de_const->identifier); generator_print_value(&self->super, &de_const->val); generator_printline(&self->super, 0, ""); 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_enum(generator_types_h_t *self, const syn_enum_t *de_enum) { uint32_t i; generator_printline(&self->super, 0, "typedef enum %s", de_enum->name); generator_printline(&self->super, 0, "{"); for(i = 0;i < de_enum->enum_def_list_num; ++i) { generator_print(&self->super, 0, "\t%s = ", de_enum->enum_def_list[i].identifier); generator_print_value(&self->super, &de_enum->enum_def_list[i].val); generator_print(&self->super, 0, ","); if(de_enum->enum_def_list[i].comment.text[0]) { generator_printline(&self->super, 0, "//%s", de_enum->enum_def_list[i].comment.text); } else { generator_printline(&self->super, 0, ""); } } generator_printline(&self->super, 0, "}%s_t;", de_enum->name); 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; }
static error_code_t _on_struct(generator_writer_c_t *self, const syn_struct_t *de_struct) { 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 struct %s *data)", de_struct->name, de_struct->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_struct_begin(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_struct->name); for(i = 0; i < de_struct->field_list.field_list_num; ++i) { generator_printline(&self->super, 0, ""); //condition if(de_struct->field_list.field_list[i].condition.oper != E_EO_NON) { const char *op = NULL; switch(de_struct->field_list.field_list[i].condition.oper) { case E_EO_AND: op = "&"; break; case E_EO_EQUAL: op = "=="; break; case E_EO_UNEQUAL: op = "!="; break; case E_EO_BOOL: op = NULL; break; default: assert(0); } if(op) { generator_print(&self->super, 0, "\tif(data->%s %s ", de_struct->field_list.field_list[i].condition.op0, op); generator_print_value(&self->super, &de_struct->field_list.field_list[i].condition.op1); generator_printline(&self->super, 0, ")"); } else { generator_printline(&self->super, 0, "\tif(data->%s)", de_struct->field_list.field_list[i].condition.op0); } } else { generator_printline(&self->super, 0, "\t"); } generator_printline(&self->super, 0, "\t{"); if(de_struct->field_list.field_list[i].type.type == E_SNT_CONTAINER) { if(de_struct->field_list.field_list[i].type.ct.ct == E_CT_VECTOR) { const syn_simple_type_t *vector_type = symbols_get_real_type(self->super.symbols, &de_struct->field_list.field_list[i].type.ct.vector_type); generator_printline(&self->super, 0, "\t\tuint32_t i;"); generator_printline(&self->super, 0, "\t\tif((ret = tlibc_write_vector_begin(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 2, "{"); generator_printline(&self->super, 3, "if((ret = tlibc_write_field_begin(self, \"%s_num\")) == E_TLIBC_NOERROR)", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 3, "{"); generator_print(&self->super, 4, "if((ret = tlibc_write_"); generator_print_type_name(&self->super, &g_vec_num_type); generator_printline(&self->super, 0, "(self, &data->"VEC_NUM_TYPE_STYLE")) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 3, "}"); generator_printline(&self->super, 3, "else if (ret != E_TLIBC_IGNORE)"); generator_printline(&self->super, 4, "goto done;"); generator_printline(&self->super, 3, "if((ret = tlibc_write_field_end(self, \"%s_num\")) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 2, "}"); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 2, "for(i = 0; i < %s; ++i)", de_struct->field_list.field_list[i].type.ct.vector_length); generator_printline(&self->super, 2, "{"); generator_printline(&self->super, 3, "if(i == data->"VEC_NUM_TYPE_STYLE") break;", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 3, "if((ret = tlibc_write_vector_element_begin(self, \"%s\", i)) == E_TLIBC_NOERROR)", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 3, "{"); if(vector_type->st == E_ST_STRING) { generator_printline(&self->super, 4, "if((ret = tlibc_write_string(self, data->%s[i], %s)) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier, vector_type->string_length); } else { generator_print(&self->super, 4, "if((ret = tlibc_write_"); generator_print_type_name(&self->super, vector_type); generator_print(&self->super, 0, "(self, &data->%s[i]", de_struct->field_list.field_list[i].identifier); if(de_struct->field_list.field_list[i].args.arg_list_num > 0) { generator_printline(&self->super, 0, ", data->%s", de_struct->field_list.field_list[i].args.arg_list[0]); } generator_printline(&self->super, 0, ")) != E_TLIBC_NOERROR) goto done;"); } generator_printline(&self->super, 3, "}"); generator_printline(&self->super, 3, "else if(ret != E_TLIBC_IGNORE)"); generator_printline(&self->super, 4, "goto done;"); generator_printline(&self->super, 3, "if((ret = tlibc_write_vector_element_end(self, \"%s\", i)) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 2, "}"); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 2, "if((ret = tlibc_write_vector_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier); } } else if(de_struct->field_list.field_list[i].type.type == E_SNT_SIMPLE) { const syn_simple_type_t *st = symbols_get_real_type(self->super.symbols, &de_struct->field_list.field_list[i].type.st); generator_printline(&self->super, 2, "if((ret = tlibc_write_field_begin(self, \"%s\")) == E_TLIBC_NOERROR)", de_struct->field_list.field_list[i].identifier); generator_printline(&self->super, 2, "{"); if(st->st == E_ST_STRING) { generator_printline(&self->super, 3, "if((ret = tlibc_write_string(self, data->%s, %s)) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier, st->string_length); } else { generator_print(&self->super, 3, "if((ret = tlibc_write_"); generator_print_type_name(&self->super, st); generator_print(&self->super, 0, "(self, &data->%s", de_struct->field_list.field_list[i].identifier); if(de_struct->field_list.field_list[i].args.arg_list_num > 0) { generator_print(&self->super, 0, ", data->%s", de_struct->field_list.field_list[i].args.arg_list[0]); } generator_printline(&self->super, 0, ")) != E_TLIBC_NOERROR) goto done;"); } generator_printline(&self->super, 2, "}"); generator_printline(&self->super, 2, "else if (ret != E_TLIBC_IGNORE)"); generator_printline(&self->super, 3, "goto done;"); generator_printline(&self->super, 2, "if((ret = tlibc_write_field_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_struct->field_list.field_list[i].identifier); } generator_printline(&self->super, 1, "}"); } generator_printline(&self->super, 0, ""); generator_printline(&self->super, 1, "if((ret = tlibc_write_struct_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_struct->name); generator_printline(&self->super, 0, ""); generator_printline(&self->super, 0, "done:"); generator_printline(&self->super, 1, "return ret;"); generator_printline(&self->super, 0, "}"); return E_TD_NOERROR; }
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; }