static error_code_t _on_union(generator_reader_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_read_%s(tlibc_abstract_reader_t *self, 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_read_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_read_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, 3, "if((ret = tlibc_read_string(self, data->%s, %s) != E_TLIBC_NOERROR) goto done;", de_union->union_field_list.union_field_list[i].name, de_union->union_field_list.union_field_list[i].simple_type.string_length); } else { generator_print(&self->super, 3, "if((ret = tlibc_read_"); generator_print_type_name(&self->super, st); generator_printline(&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_read_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, 0, "\tdefault:"); generator_printline(&self->super, 0, "\t\tbreak;"); generator_printline(&self->super, 0, "\t}"); generator_printline(&self->super, 0, "\tif((ret = tlibc_read_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, 0, "\treturn ret;"); generator_printline(&self->super, 0, "}"); return E_TD_NOERROR; }
const syn_simple_type_t* symbols_get_real_type(const symbols_t *self, const syn_simple_type_t* sn_type) { if(sn_type->st == E_ST_REFER) { const symbol_t *ptr = symbols_search(self, "", sn_type->st_refer); if(ptr == NULL) { return NULL; } if(ptr->type == EN_HST_TYPEDEF) { return symbols_get_real_type(self, &ptr->body.type.type); } else { return sn_type; } } return sn_type; }
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; }