Beispiel #1
0
/*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;
}