Example #1
0
def gen_py_detailed(file, xml_data):
	for struct_data in xml_data:
		file.new_line(2);
		file.write_line(r"#" + struct_data.desc);
		file.write_line(r"class " + struct_data.name + r":");

		for field_data in struct_data.fields:
			file.write_line(r"#" + field_data.desc, 1);
			if "single" == field_data.mode:
				file.write_line(r"#" + pro_type.get_type(field_data.type) + r" " + field_data.name + r";", 1);
			elif "list" == field_data.mode:
				file.write_line(r"#" + r"std::vector<" + pro_type.get_type(field_data.type) + r"> " + field_data.name + r";", 1);
			elif "array" == field_data.mode:
				file.write_line(r"#" + pro_type.get_type(field_data.type) + r" " + field_data.name + r"[" + field_data.size + r"];", 1);
		file.new_line();

		#read();
		file.write_line(r"def read_from_buf(self, ba):", 1);
		for field_data in struct_data.fields:
			file.write_line(r"#" + field_data.desc + r" " + field_data.mode + r" " + field_data.type + r" " + field_data.name, 2);
			if "single" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					if "string16" == field_data.type:
						file.write_line(r"self." + field_data.name + "_len___ = ba.read_uint16" + "();", 2);
						file.write_line(r"self." + field_data.name + r" = ba.read_" + field_data.type + "(" + r"self." + field_data.name + r"_len___, " + field_data.max_len + r");", 2);
						file.write_line(r"if(self." + field_data.name + " == None): return False;", 2);
						
					else:
						file.write_line(r"self." + field_data.name + " = ba.read_" + field_data.type + "();", 2);
						file.write_line(r"if(self." + field_data.name + " == None): return False;", 2);
				else:
					file.write_line(r"self." + field_data.name + " = " + share_struct + field_data.type + "();", 2);
					file.write_line(r"if( not self." + field_data.name + ".read_from_buf(ba)): return False;", 2);
			elif "list" == field_data.mode:
				field_data_name_list_cnt = field_data.name + "_list_cnt__";
				field_data_name_list_item = field_data.name + "_list_item__";
				file.write_line(field_data_name_list_cnt + " = ba.read_uint32();", 2);
				file.write_line(r"if(" + field_data_name_list_cnt + r" == None): return False;", 2);
				file.write_line(r"self." + field_data.name + r" = [];", 2);
				file.write_line(r"for i in range(" + field_data_name_list_cnt + r"):", 2);
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r"self." + field_data.name + ".append(ba.read_" + field_data.type + r"());", 3);
					file.write_line(r"if(self." + field_data.name + r"[i] == None): return False;", 3);
				else:
					file.write_line(r"self." + field_data.name + ".append(" + share_struct + field_data.type + r"());", 3);
					file.write_line(r"if( not self." + field_data.name + r"[i].read_from_buf(ba)): return False;", 3);
			elif "array" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r"self." + field_data.name + r" = ba.read_buf(" + field_data.size + r");", 2);
					file.write_line(r"if(self." + field_data.name + " == None): return False;", 2);
				else:
					file.write_line(r"error!", 2);
		file.new_line();
		file.write_line(r"return True;", 2, 2);

		#write();
		file.write_line(r"def write_to_buf(self, ba):", 1);
		for field_data in struct_data.fields:
			file.write_line(r"#" + field_data.desc + r" " + field_data.mode + r" " + field_data.type + r" " + field_data.name, 2);
			if "single" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					if "string16" == field_data.type:
						file.write_line(r"self." + field_data.name + "_len__ = len(self." + field_data.name + r");", 2);
						file.write_line(r"if(not ba.write_uint16" + r"(self." + field_data.name + "_len__)): return False;", 2);	
						file.write_line(r"if(not ba.write_" + field_data.type + r"(self." + field_data.name + ", self." + field_data.name + "_len__, " + field_data.max_len + r")): return False;", 2);	
					else:
						file.write_line(r"if(not ba.write_" + field_data.type + r"(self." + field_data.name + ")): return False;", 2);
				else:
					file.write_line(r"if(not isinstance(self." + field_data.name + r", " + share_struct + field_data.type +")): return False;", 2);
					file.write_line(r"if(not self." + field_data.name + r".write_to_buf(ba)): return False;", 2);
			elif "list" == field_data.mode:
				field_data_name_list_cnt = field_data.name + "_list_cnt__";
				field_data_name_list_item = field_data.name + "_list_item__";
				file.write_line(field_data_name_list_cnt + " = len(self." + field_data.name + r");", 2);
				file.write_line(r"ba.write_uint32(" +field_data_name_list_cnt+r");", 2);
				file.write_line(r"for i in range(" + field_data_name_list_cnt + r"):", 2);
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r"if(not ba.write_" + field_data.type + r"(self." +field_data.name+r"[i])): return False;", 3);
				else:
					file.write_line(r"if(not isinstance(self." +field_data.name+r"[i], "+ share_struct + field_data.type+")): return False;", 3);
					file.write_line(r"if(not self." +field_data.name+r"[i].write_to_buf(ba)): return False;", 3);
			elif "array" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r"ba.write_buf(self." + field_data.name + ", "+field_data.size+r");", 2);
				else:
					file.write_line(r"error!", 2);
		file.new_line();
		file.write_line(r"return True;", 2, 2);
		
		#echo();
		file.write_line(r'def echo(self, print_hex=False, tabs=""):', 1);
		for field_data in struct_data.fields:
			file.write_line(r"#" + field_data.desc + r" " + field_data.mode + r" " + field_data.type + r" " + field_data.name, 2);
			file.write_line(r'print tabs+r"======' + field_data.desc + r" " + field_data.mode + r" " + field_data.type + r" " + field_data.name + r'";', 2);
			if "single" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r'print tabs+"[' + field_data.name +  r']=%s"%(str(self.' + field_data.name + r'));', 2);
				else:
					file.write_line(r'print tabs+"[' + field_data.name + r']=>{";', 2);
					file.write_line(r'self.' + field_data.name +r'.echo(print_hex, tabs+"    ");', 2);
					file.write_line(r'print tabs+"}";', 2);
			elif "list" == field_data.mode:
				file.write_line(r'print tabs+r"[' + field_data.name + r']=>{";', 2);
				file.write_line(r'for i in range(len(self.' + field_data.name + ')):', 2);
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r'print tabs+"    [%d]="%(i)+str(self.' + field_data.name + r'[i]); ', 3);
				else:
					file.write_line(r'print tabs+r"    [%d]=>{"%(i);', 3);
					file.write_line(r'self.' + field_data.name + r'[i].echo(print_hex,tabs+"    "*2);', 3);
				file.write_line(r'print tabs+"}\n";', 2);
			elif "array" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r'tmp_str=str(self.' + field_data.name + r');', 2);
					file.write_line(r'if(print_hex):tmp_str=show.bin2hex(tmp_str);', 2);
					file.write_line(r'print tabs+"['+ field_data.name +r']=%s"%(tmp_str);', 2);
				else:
					file.write_line(r"error!", 2);
		file.new_line();
		file.write_line(r"return True;", 2, 2);
Example #2
0
def gen_cpp_detailed(file, xml_data, base_class_name):
	for struct_data in xml_data:
		file.new_line(2);
		file.write_line(r"//" + struct_data.desc);
		file.write_line(r"struct " + struct_data.name + base_class_name + r"{");
		
		init_string = [];
		for field_data in struct_data.fields:
			file.write_line(r"//" + field_data.desc, 1);
			if "single" == field_data.mode:
				if "std::string" == pro_type.get_type(field_data.type):
					file.write_line(r"static const uint32_t " + field_data.name + r"_max_len__ = " + field_data.max_len + r";", 1);
				file.write_line(pro_type.get_type(field_data.type) + r" " + field_data.name + r";", 1);
				
				if pro_type.is_sys_type(field_data.type):
					if "std::string" == pro_type.get_type(field_data.type):
						init_string.append(r"this->" + field_data.name + r".clear();");
					else:
						init_string.append(r"this->" + field_data.name + r" = 0;");
				else:
					init_string.append(r"this->" + field_data.name + r".init();");
			elif "list" == field_data.mode:
				file.write_line(r"std::vector<" + pro_type.get_type(field_data.type) + r"> " + field_data.name + r";", 1);
				init_string.append(r"this->" + field_data.name + r".clear();");
			elif "array" == field_data.mode:
				file.write_line(pro_type.get_type(field_data.type) + r" " + field_data.name + r"[" + field_data.size + r"];", 1);
				if pro_type.is_sys_type(field_data.type):
					init_string.append(r"::memset(this->" + field_data.name + r", 0, sizeof(this->" + field_data.name + r"));");
		file.new_line();
		#初始化函数
		file.write_line(struct_data.name + r"(){this->init();}", 1);
		
		#函数init()
		file.write_line(r"virtual void init(){", 1);
		for i in init_string:
			file.write_line(i, 2);
		file.write_line(r"}", 1);

		#read();
		file.write_line(r"virtual bool read(el::lib_msg_byte_t& msg_byte){", 1);
		for field_data in struct_data.fields:
			if "single" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					if "std::string" == pro_type.get_type(field_data.type):
						file.write_line(r"if(!msg_byte.read_" + field_data.type + "(this->" + field_data.name + ", " + struct_data.name + r"::" + field_data.name + r"_max_len__)) return false;", 2);
					else:
						file.write_line(r"if(!msg_byte.read_" + field_data.type + "(this->" + field_data.name + ")) return false;", 2);
				else:
					file.write_line(r"if(!this->" + field_data.name + ".read(msg_byte)) return false;", 2);
			elif "list" == field_data.mode:
				field_data_name_list_cnt = field_data.name + "_list_cnt__";
				field_data_name_list_item = field_data.name + "_list_item__";
				file.write_line(r"uint32_t " + field_data_name_list_cnt + ";", 2);
				file.write_line(r"if(!msg_byte.read_uint32(" + field_data_name_list_cnt + ")) return false;", 2);
#				if pro_type.is_sys_type(field_data.type):
#					file.write_line(pro_type.get_type(field_data.type) + " " + field_data_name_list_item + ";", 2);
#				else:
#					file.write_line(field_data.type + " " + field_data_name_list_item + ";", 2);
				file.write_line(r"this->" + field_data.name + ".clear();", 2);
				file.write_line(r"for(uint32_t i = 0; i < " + field_data_name_list_cnt + "; i++){", 2);
				if pro_type.is_sys_type(field_data.type):
					file.write_line(pro_type.get_type(field_data.type) + " " + field_data_name_list_item + ";", 3);
				else:
					file.write_line(field_data.type + " " + field_data_name_list_item + ";", 3);
				if pro_type.is_sys_type(field_data.type):
					file.write_line(r"if(!msg_byte.read_" + field_data.type + "(" + field_data_name_list_item + ")) return false;", 3);
				else:
					file.write_line(r"if(!" + field_data_name_list_item + ".read(msg_byte)) return false;", 3);
				
				file.write_line(r"this->" + field_data.name + ".push_back(" + field_data_name_list_item + ");", 3);
				file.write_line(r"}", 2);
			elif "array" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					if pro_type.is_sys_type_integer(field_data.type):
						file.write_line(r"for(uint32_t i = 0; i < " + field_data.size + "; i++){", 2);
						file.write_line(r"if(!msg_byte.read_" + field_data.type + "(this->" + field_data.name + "[i])) return false;", 3);
						file.write_line(r"}", 2);
					else:
						file.write_line(r"if(!msg_byte.read_buf((char*)this->" + field_data.name + ", sizeof(this->" + field_data.name + "))) return false;", 2);
				else:
					file.write_line(r"error!", 2);
				
		file.write_line(r"return true;", 2);
		file.write_line(r"}", 1);
		
		#write();
		file.write_line(r"virtual bool write(el::lib_msg_byte_t& msg_byte){", 1);
		for field_data in struct_data.fields:
			if "single" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					if "std::string" == pro_type.get_type(field_data.type):
						file.write_line(r"if(!msg_byte.write_" + field_data.type + "(this->" + field_data.name + ", " + struct_data.name + r"::" + field_data.name + r"_max_len__)) return false;", 2);
					else:
						file.write_line(r"if(!msg_byte.write_" + field_data.type + "(this->" + field_data.name + ")) return false;", 2);
				else:
					file.write_line(r"if(!this->" + field_data.name + ".write(msg_byte)) return false;", 2);
			elif "list" == field_data.mode:
				file.write_line(r"if(!msg_byte.write_uint32(this->" + field_data.name + ".size())) return false;", 2);
				file.write_line(r"for(uint32_t i = 0; i < this->" + field_data.name + ".size(); i++){", 2);
				if pro_type.is_sys_type(field_data.type):
					file.write_line("if(!msg_byte.write_" + field_data.type + "(this->" + field_data.name + "[i])) return false;", 3);
				else:
					file.write_line(r"if(!this->" + field_data.name + "[i].write(msg_byte)) return false;", 3);
				file.write_line(r"}", 2);
			elif "array" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
				############################3
					if pro_type.is_sys_type_integer(field_data.type):
						file.write_line(r"for(uint32_t i = 0; i < " + field_data.size + "; i++){", 2);
						file.write_line(r"if(!msg_byte.write_" + field_data.type + "(this->" + field_data.name + "[i])) return false;", 3);
						file.write_line(r"}", 2);
					else:
				##############################
						if "char" != field_data.type and "uint8_t" != field_data.type and "int8_t" != field_data.type:
							file.write_line(r"error! type", 2);
						else:
							file.write_line(r"if(!msg_byte.write_buf(this->" + field_data.name + ", sizeof(this->" + field_data.name +"))) return false;", 2);

		file.write_line(r"return true;", 2);
		file.write_line(r"}", 1);
		
		#show();
		file.write_line(r"virtual void show(uint32_t idx = 0){", 1);
		file.write_line(r"std::string pre_str__;", 2);
		file.write_line(r"for(uint32_t i = 0; i < idx; i++){", 2);
		file.write_line(r'pre_str__ += "<<";', 3);
		file.write_line(r"}", 2);
		file.write_line(r"idx++;", 2);
		for field_data in struct_data.fields:
			if "single" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
					if "std::string" == pro_type.get_type(field_data.type):
						file.write_line(r'TRACE_MSG_LOG("%s[' + field_data.name + r":" + pro_type.gen_show_type(field_data.type) + r']", pre_str__.c_str(), this->' + field_data.name + r'.c_str());', 2);
					else:
						file.write_line(r'TRACE_MSG_LOG("%s[' + field_data.name + r":" + pro_type.gen_show_type(field_data.type) + r']", pre_str__.c_str(), this->' + field_data.name + r');', 2);
				else:
					file.write_line(r"this->" + field_data.name + r".show(idx);", 2);
			elif "list" == field_data.mode:
				file.write_line(r'TRACE_MSG_LOG("%s[' + field_data.name + r'_size:%u]", pre_str__.c_str(), (uint32_t)this->' + field_data.name + r'.size());', 2);
				
				file.write_line(r"for(uint32_t i = 0; i < " + field_data.name + r".size(); i++){", 2);
				file.write_line(r'TRACE_MSG_LOG("idx__:%u", i + 1);', 3);
				if pro_type.is_sys_type(field_data.type):
					if "std::string" == pro_type.get_type(field_data.type):
						file.write_line(r'TRACE_MSG_LOG("%s[' + field_data.name + r":" + pro_type.gen_show_type(field_data.type) + r']", pre_str__.c_str(), ' + field_data.name + r'[i].c_str());', 3);
					else:
						file.write_line(r'TRACE_MSG_LOG("%s[' + field_data.name + r":" + pro_type.gen_show_type(field_data.type) + r']", pre_str__.c_str(), ' + field_data.name + r'[i]);', 3);
				else:
					file.write_line(r"this->" + field_data.name + r"[i].show(idx);", 3);

				file.write_line(r"}", 2);
			elif "array" == field_data.mode:
				if pro_type.is_sys_type(field_data.type):
				########################
					if pro_type.is_sys_type_integer(field_data.type):
						file.write_line(r"for(uint32_t i = 0; i < " + field_data.size + "; i++){", 2);
						file.write_line(r'TRACE_MSG_LOG("%s[' + field_data.name + r"_%u:" + pro_type.gen_show_type(field_data.type) + r']", pre_str__.c_str(), i, (uint32_t)this->' + field_data.name + r'[i]);', 3);
						file.write_line(r"}", 2);
					else:
				########################
						file.write_line(r'TRACE_MSG_LOG("%s[' + field_data.name + r":" + pro_type.gen_show_type(field_data.type) + r']", pre_str__.c_str(), this->' + field_data.name + r');', 2);
				else:
					file.write_line(r"error!", 2);
		file.write_line(r"}", 1);
		
		file.write_line(r"};");