/*create a function and add it into function list *the function is defined by an extdef node in syntax tree*/ struct func_descriptor* create_function(struct tree_node* specifier_node, struct tree_node* fundec_node){ char* func_name = fundec_node -> child -> unit_value; if(find_func(func_table_head, func_name) != NULL){ printf("Error type 4 at line %d: Function \'%s\'redifine\n", fundec_node -> lineno, func_name); semantic_error_flag = true; return NULL; } if(is_struct_type(specifier_node) && is_struct_definition(specifier_node -> child)){ printf("Warnning: struct defined inside return field of function \'%s\'\n", func_name); } /*handle return type*/ struct type_descriptor* return_type = create_type(specifier_node); /*create func descriptor and add into list*/ struct func_descriptor* new_func_descriptor = create_func_descriptor(func_name, return_type, 0); add_func(func_table_head, new_func_descriptor); /*handle params*/ if(fundec_node -> child -> sibling -> sibling -> unit_code == VarList){ struct tree_node* varlist_node = fundec_node -> child -> sibling -> sibling; new_func_descriptor -> param_num = init_param_list(new_func_descriptor -> param_list_head, varlist_node); } return new_func_descriptor; }
int Cpp_Body_Writer::serialize_by_type(char *temp, const char **field){ char tmp[256] = {}; char subvalue[64] = {}; const char *subfield[5] = {}; switch(type_of_int(field[0])){ case 1: sprintf(temp, WRITE_INT_8, field[4]); break; case 2: sprintf(temp, WRITE_INT_16, field[4]); break; case 3: sprintf(temp, WRITE_INT_32, field[4]); break; case 4: sprintf(temp, WRITE_INT_64, field[4]); break; case 5: sprintf(temp, WRITE_UINT_8, field[4]); break; case 6: sprintf(temp, WRITE_UINT_16, field[4]); break; case 7: sprintf(temp, WRITE_UINT_32, field[4]); break; case 8: sprintf(temp, WRITE_UINT_64, field[4]); break; case 9: sprintf(temp, WRITE_DOUBLE, field[4]); break; case 10: sprintf(temp, WRITE_BOOL, field[4]); break; case 11: sprintf(temp, WRITE_STRING, field[4]); break; case 12: sprintf(subvalue, "%s[i]", field[4]); subfield[0] = field[1]; subfield[4] = subvalue; serialize_by_type(tmp, subfield); sprintf(temp, WRITE_VECTOR, field[4], field[4], field[4], field[4], tmp); break; case 13: if(is_struct_type(field[2])){ sprintf(temp, WRITE_STD_MAP_STRUCT, field[4], field[1], field[2], field[4], field[4]); } else { subfield[0] = field[1]; subfield[4] = MAP_FIRST; serialize_by_type(tmp, subfield); subfield[0] = field[2]; subfield[4] = MAP_SECOND; serialize_by_type(tmp + 128, subfield); sprintf(temp, WRITE_STD_MAP_BASE, field[4], field[1], field[2], field[4], field[4], tmp, tmp + 128); } break; case 14: if(is_struct_type(field[2])){ sprintf(temp, WRITE_BOOST_MAP_STRUCT, field[4], field[1], field[2], field[4], field[4]); } else { subfield[0] = field[1]; subfield[4] = MAP_FIRST; serialize_by_type(tmp, subfield); subfield[0] = field[2]; subfield[4] = MAP_SECOND; serialize_by_type(tmp + 128, subfield); sprintf(temp, WRITE_BOOST_MAP_BASE, field[4], field[1], field[2], field[4], field[4], tmp, tmp + 128); } break; default: sprintf(temp, WRITE_STRUCT, field[4]); break; } return 0; }