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);
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"};");