static int exp_enum(ndxml *node, FILE *pf) { int total =(int) ndxml_getsub_num(node) ; for (int i=0; i<total; ++i) { ndxml *sub = ndxml_getnodei(node, i); nd_assert(sub) ; const char *pcomment = ndxml_getattr_val(sub, "comment") ; if (pcomment) { fprintf(pf, "// %s \n", pcomment) ; } fprintf(pf, "enum %s { \n", ndxml_getname(sub)) ; for (int x=0; x< ndxml_getsub_num(sub); ++x) { ndxml *element = ndxml_getnodei(sub, x) ; pcomment = ndxml_getattr_val(element, "comment") ; const char *pvalue = ndxml_getattr_val(element, "value") ; if (pvalue && pvalue[0] ) { fprintf(pf, "\t%s =%s,//%s\n", ndxml_getname(element),pvalue, pcomment?pcomment:"\t " ) ; } else { fprintf(pf, "\t%s,//%s\n", ndxml_getname(element), pcomment?pcomment:"\t "); } } fprintf(pf, "};\n\n\n") ; } return 0; }
int read_config(ndxml *xmlroot, const char *name, struct server_config *scfg) { ndxml *xml_sub,*xml_listen ; int base_port = read_base_port(xmlroot) ; memset(scfg, 0, sizeof(scfg)) ; if (0==base_port) { return -1; } xml_sub = ndxml_refsub(xmlroot,name) ; if (!xml_sub){ T_ERROR("read base port error") ; } if(-1== read_instance_info(xml_sub, &scfg->i_cfg)) { return -1 ; } xml_listen = ndxml_refsub(xml_sub,"listen") ; if (!xml_listen){ T_ERROR("read base port error") ; } if(-1== read_listen_cfg(xml_listen, base_port,&scfg->l_cfg) ) { return -1 ; } // scfg->reliable_num = 0; xml_listen = ndxml_refsub(xml_sub,"reliable_host") ; if (xml_listen){ read_iplist(xml_listen, scfg->reliable_hosts, MAX_RELIABLE_HOST ) ; for(int i=0; i<MAX_RELIABLE_HOST; i++) { union { ndip_t ip ; NDUINT8 buf[4] ; }readip,ipmask; readip.ip = scfg->reliable_hosts[i] ; if (readip.ip ==0){ break ; } ipmask.ip = 0xffffffff; for (int x=0; x<4; x++) { if (0xff== readip.buf[x]){ ipmask.buf[x] = 0 ; } } scfg->reliable_ipmask[i] = ipmask.ip; scfg->reliable_num++; } //get netmask } //read connectors xml_listen = ndxml_refsub(xml_sub,"connectors") ; if (xml_listen){ for (int i=0; i< ND_CONNECT_OTHER_HOSTR_NUM && i<ndxml_num(xml_listen); i++) { ndxml *pnode = ndxml_getnodei(xml_listen, i) ; if(0== read_connect_cfg(pnode, base_port, &scfg->i_cfg.connectors[i]) ) { const char *pname = ndxml_getattr_val(pnode, "name") ; if (pname && pname[0]) { strncpy(scfg->i_cfg.connectors[i].connector_name, pname,sizeof(scfg->i_cfg.connectors[i].connector_name)) ; } else { pname = ndxml_getname(pnode) ; strncpy(scfg->i_cfg.connectors[i].connector_name, pname,sizeof(scfg->i_cfg.connectors[i].connector_name)) ; } } } } return 0 ; }
int _out_data_forUE(ndxml *sub, FILE *pf,FILE *pfCpp) { const char *pName = ndxml_getname(sub) ; if (!pName) { return-1 ; } //char name_buf[256] ; const char *pComment = ndxml_getattr_val(sub, "comment"); if (pComment) { fprintf(pf, "// %s\n", pComment) ; } fprintf(pf, "USTRUCT(BlueprintType)\nstruct %s \n{\n\tGENERATED_USTRUCT_BODY();\n", pName) ; char buf_read_func[4096] ; char buf_write_func[4096] ; char *pReadStream = buf_read_func; char *pWriteStream = buf_write_func ; size_t read_size = sizeof(buf_read_func); size_t write_size = sizeof(buf_write_func); int subNodes = ndxml_getsub_num(sub) ; for (int n=0; n<subNodes; ++n) { ndxml *node1 = ndxml_refsubi(sub,n) ; int bIsString =false ; const char *pType = ndxml_getattr_val(node1, "type"); if (0==ndstricmp((char*)pType, (char*)"string")||0==ndstricmp((char*)pType, (char*)"char") ) { pType = "char" ; bIsString = true ; } const char *pArray = ndxml_getattr_val(node1,"isArray") ; const char *pValName = ndxml_getattr_val(node1, "name") ; fprintf(pf,"\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"%s\")\n ", "NetStream") ; if (pArray && pArray[0] && pArray[0]=='1') { if (bIsString) { fprintf(pf,"\t%s %s[%s]; \t//%s \n\n",getTypeForUE4(pType), pValName, ndxml_getattr_val(node1, "arrayMarco"),ndxml_getattr_val(node1, "comment") ) ; //read-string function int size = snprintf(pReadStream, read_size, "\tREAD_STREAM_STRING(inmsg, data.%s, %s);\n",pValName , ndxml_getattr_val(node1, "arrayMarco")) ; pReadStream += size ; read_size -= size; //write string function size = snprintf(pWriteStream, write_size, "\tWRITE_STREAM(omsg,data.%s);\n",pValName ) ; pWriteStream += size ; write_size -= size; } else { fprintf(pf,"\tuint16 %sCount; \t \n", pValName ) ; fprintf(pf,"\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category = \"%s\")\n ", "NetStream") ; fprintf(pf,"\t%s %s[%s]; \t//%s \n\n",getTypeForUE4(pType), pValName, ndxml_getattr_val(node1, "arrayMarco"), ndxml_getattr_val(node1, "comment") ) ; //write push function // fprintf(pf, "\tUFUNCTION(BlueprintPure, Category = \"%s\")\n", "NetStream") ; fprintf(pf, "\tbool push_%s(const %s &val)\n\t{\n", pValName, getTypeForUE4(pType)); fprintf(pf, "\t\tif (%sCount < %s) {\n", pValName, ndxml_getattr_val(node1, "arrayMarco")); fprintf(pf, "\t\t\t%s[%sCount++] = val;\n", pValName, pValName); fprintf(pf, "\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n"); //read array string fucntion int size = snprintf(pReadStream, read_size, "\n\tREAD_STREAM(inmsg,data.%sCount);\n" "\tif( data.%sCount > %s ) {\n\t\treturn -1;\n\t}\n ", pValName,pValName, ndxml_getattr_val(node1, "arrayMarco") ) ; pReadStream += size ; read_size -= size; size = snprintf(pReadStream, read_size, "\tfor(int i =0; i<data.%sCount;++i )" "{\n\t\tREAD_STREAM(inmsg,data.%s[i]);\n\t}\n ", pValName, pValName ) ; pReadStream += size ; read_size -= size; //write array string function size = snprintf(pWriteStream, write_size, "\n\tif(data.%sCount > %s) {\n\t\treturn -1; \n\t} \n ", pValName, ndxml_getattr_val(node1, "arrayMarco") ) ; pWriteStream += size ; write_size -= size; size = snprintf(pWriteStream, write_size, "\tWRITE_STREAM(omsg,data.%sCount);\n" "\tfor(int i =0 ; i < data.%sCount;++i){\n" "\t\tWRITE_STREAM(omsg,data.%s[i]); \n\t} \n", pValName,pValName,pValName ) ; pWriteStream += size ; write_size -= size; } } else { fprintf(pf,"\t%s %s; \t//%s \n",getTypeForUE4(pType), pValName, ndxml_getattr_val(node1, "comment") ) ; //readstream int size = snprintf(pReadStream, read_size, "\tREAD_STREAM(inmsg, data.%s);\n", pValName); pReadStream += size ; read_size -= size; size = snprintf(pWriteStream, write_size, "\tWRITE_STREAM(omsg,data.%s);\n", pValName); pWriteStream += size ; write_size -= size; } fprintf(pf,"\n") ; } fprintf(pf, "\tUFUNCTION(BlueprintPure, Category = \"%s\")\n","NetStream") ; fprintf(pf, "\tint ReadStream_%s(NDIStreamMsg &inmsg);\n\n", pName) ; fprintf(pf, "\tUFUNCTION(BlueprintPure, Category = \"%s\"\n", "NetStream") ; fprintf(pf, "\tint WriteStream_%s(NDOStreamMsg &omsg) const;\n\n",pName) ; //out function body fprintf(pfCpp, "int %s::ReadStream_%s(NDIStreamMsg &inmsg)\n{\n", pName, pName) ; fprintf(pfCpp, "\treturn ReadStream(inmsg,*this);\n}\n\n") ; fprintf(pfCpp, "int %s::WriteStream_%s(NDOStreamMsg &omsg) const\n{\n",pName,pName) ; fprintf(pfCpp, "\treturn WriteStream(omsg,*this);\n}\n\n") ; fprintf(pf, "};\n") ; fprintf(pfCpp, "\nint ReadStream(NDIStreamMsg &inmsg,%s &data)\n{\n", pName) ; fprintf(pfCpp, "%s\n\tTRYTO_MOVE_STRUCT_END(inmsg);\n\treturn 0; \n}\n\n", buf_read_func) ; fprintf(pfCpp, "int WriteStream(NDOStreamMsg &omsg,const %s &data)\n{\n",pName) ; fprintf(pfCpp, "%s\n\tEND_STRUCT_STREAM(omsg); \n\treturn 0; \n}\n", buf_write_func); fprintf(pf, "int ReadStream(NDIStreamMsg &inmsg,%s &data);\n", pName) ; fprintf(pf, "int WriteStream(NDOStreamMsg &omsg,const %s &data);\n",pName) ; return 0; }
int _save_dataTypeNode(ndxml *sub, FILE *pf,FILE *pfCpp, const char *version, bool SaveDB) { const char *pName = ndxml_getname(sub) ; if (!pName) { return-1 ; } char name_buf[256] ; char construct_func[1024*16]; const char *pComment = ndxml_getattr_val(sub, "comment"); if (pComment) { fprintf(pf, "// %s\n", pComment) ; } if (SaveDB) { snprintf(name_buf, sizeof(name_buf), "%s_v%s",pName,version) ; pName = name_buf ; //fprintf(pf, "struct %s \n{\n ", pName) ; //fprintf(pf, "\t%s() \n\t{\n\t\tmemset(this, 0, sizeof(*this) ); \n\t}\n\n",pName, ) ; } else { //fprintf(pf, "struct %s \n{\n ", pName) ; //fprintf(pf, "\t%s() \n\t{\n\t\tmemset(this, 0, sizeof(*this) ); \n\t}\n\n",pName) ; } fprintf(pf, "struct %s \n{\n ", pName); fprintf(pf, "\t%s() \n\t{\n%s\t}\n\n", pName, _get_construction_func(construct_func, sizeof(construct_func), sub)); fprintf(pf, "\t%s& operator=(const %s &r)\n\t{\n%s\t\treturn *this;\n\t}\n\n", pName, pName, _get_copy_function_func(construct_func, sizeof(construct_func), sub)); char buf_read_func[4096] ; char buf_write_func[4096]; char buf_toUser_func[4096]; char buf_fromUser_func[4096]; char buf_toJson_func[4096]; char *pReadStream = buf_read_func; char *pWriteStream = buf_write_func ; char *pTouserStream = buf_toUser_func; char *pFromuserStream = buf_fromUser_func; char *pToJsonStream = buf_toJson_func; size_t read_size = sizeof(buf_read_func); size_t write_size = sizeof(buf_write_func); size_t toUser_size = sizeof(buf_toUser_func); size_t fromUser_size = sizeof(buf_fromUser_func); size_t toJson_size = sizeof(buf_toJson_func); int subNodes = ndxml_getsub_num(sub) ; for (int n=0; n<subNodes; ++n) { ndxml *node1 = ndxml_refsubi(sub,n) ; int bIsString =false ; const char *pType = ndxml_getattr_val(node1, "type"); if (0==ndstricmp((char*)pType, (char*)"string")||0==ndstricmp((char*)pType, (char*)"char") ) { pType = "char" ; bIsString = true ; } const char *pArray = ndxml_getattr_val(node1,"isArray") ; const char *pValName = ndxml_getattr_val(node1, "name") ; // if (is_base_type(pType)) { // int size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_NODE_NEW_LINE(p, outSize);\n"); // pToJsonStream += size; // toJson_size -= size; // } if (pArray && pArray[0] && pArray[0]=='1') { if (bIsString) { fprintf(pf,"\t%s %s[%s]; \t//%s \n",getType(pType,version), pValName, ndxml_getattr_val(node1, "arrayMarco"),ndxml_getattr_val(node1, "comment") ) ; //read-string function int size = snprintf(pReadStream, read_size, "\t\tREAD_STREAM_STRING(inmsg, data.%s, %s);\n",pValName , ndxml_getattr_val(node1, "arrayMarco")) ; pReadStream += size ; read_size -= size; //write string function size = snprintf(pWriteStream, write_size, "\t\tWRITE_STREAM(omsg,data.%s);\n",pValName ) ; pWriteStream += size ; write_size -= size; //write to userdefine function size = snprintf(pTouserStream, toUser_size, "\t\tTO_USER_DEF_TEXT(paramUserData, %s, paramInputData);\n", pValName); pTouserStream += size; toUser_size -= size; size = snprintf(pFromuserStream, fromUser_size, "\t\tFROM_USER_DEF_TEXT(paramUserData, %s, paramInputData, %s);\n", pValName, ndxml_getattr_val(node1, "arrayMarco")); pFromuserStream += size; fromUser_size -= size; //to json char *pToJsonStream = buf_toJson_func; size_t PrintJson(char *buf, size_t bufsize, const char *name, NDUINT8 &data); size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_BASE_PRINT_TOBUF(p, outSize, \"%s\", (const char*)data.%s);\n", pValName, pValName); pToJsonStream += size; toJson_size -= size; } else { fprintf(pf,"\tNDUINT16 %sCount; \t \n", pValName ) ; fprintf(pf,"\t%s %s[%s]; \t//%s \n",getType(pType,version), pValName, ndxml_getattr_val(node1, "arrayMarco"), ndxml_getattr_val(node1, "comment") ) ; //write push function fprintf(pf, "\tbool push_%s(const %s &val)\n\t{\n", pValName, getType(pType, version)); fprintf(pf, "\t\tif (%sCount < %s) {\n", pValName, ndxml_getattr_val(node1, "arrayMarco")); fprintf(pf, "\t\t\t%s[%sCount++] = val;\n", pValName, pValName); fprintf(pf, "\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n"); //read array string fucntion int size = snprintf(pReadStream, read_size, "\n\t\tREAD_STREAM(inmsg,data.%sCount);\n" "\t\tif( data.%sCount > %s ) {\n\t\t\treturn -1;\n\t\t}\n ", pValName,pValName, ndxml_getattr_val(node1, "arrayMarco") ) ; pReadStream += size ; read_size -= size; size = snprintf(pReadStream, read_size, "\t\tfor(int i =0; i<data.%sCount;++i )" "{\n\t\t\tREAD_STREAM(inmsg,data.%s[i]);\n\t\t}\n ", pValName, pValName ) ; pReadStream += size ; read_size -= size; //write array string function size = snprintf(pWriteStream, write_size, "\n\t\tif(data.%sCount > %s) {\n\t\t\treturn -1; \n\t\t} \n ", pValName, ndxml_getattr_val(node1, "arrayMarco") ) ; pWriteStream += size ; write_size -= size; size = snprintf(pWriteStream, write_size, "\t\tWRITE_STREAM(omsg,data.%sCount);\n" "\t\tfor(int i =0 ; i < data.%sCount;++i){\n" "\t\t\tWRITE_STREAM(omsg,data.%s[i]); \n\t\t} \n", pValName,pValName,pValName ) ; pWriteStream += size ; write_size -= size; //usef define function if (is_base_type(pType)) { size = snprintf(pTouserStream, toUser_size, "\t\tTO_USER_DEF_BASE_ARR(paramUserData, %s, paramInputData);\n", pValName); pTouserStream += size; toUser_size -= size; size = snprintf(pFromuserStream, fromUser_size, "\t\tFROM_USER_DEF_BASE_ARR(paramUserData, %s, paramInputData, %s);\n", pValName, ndxml_getattr_val(node1, "arrayMarco")); pFromuserStream += size; fromUser_size -= size; size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_BASEARRAY_PRINT_TOBUF(p, outSize, \"%s\", data.%s,data.%sCount);\n", pValName, pValName, pValName); pToJsonStream += size; toJson_size -= size; } else { size = snprintf(pTouserStream, toUser_size, "\t\tTO_USER_DEF_NODE_ARR(paramUserData, %s, paramInputData);\n", pValName); pTouserStream += size; toUser_size -= size; size = snprintf(pFromuserStream, fromUser_size, "\t\tFROM_USER_DEF_NODE_ARR(paramUserData, %s, paramInputData, %s);\n", pValName, ndxml_getattr_val(node1, "arrayMarco")); pFromuserStream += size; fromUser_size -= size; size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_ARRAY_PRINT_TOBUF(p, outSize, \"%s\", data.%s,data.%sCount);\n", pValName, pValName, pValName); pToJsonStream += size; toJson_size -= size; } } } else { fprintf(pf,"\t%s %s; \t//%s \n",getType(pType,version), pValName, ndxml_getattr_val(node1, "comment") ) ; //readstream int size = snprintf(pReadStream, read_size, "\t\tREAD_STREAM(inmsg, data.%s);\n", pValName); pReadStream += size ; read_size -= size; size = snprintf(pWriteStream, write_size, "\t\tWRITE_STREAM(omsg,data.%s);\n", pValName); pWriteStream += size ; write_size -= size; if (is_base_type(pType) || ndstricmp("binaryData",pType)==0) { size = snprintf(pTouserStream, toUser_size, "\t\tTO_USER_DEF_ELE(paramUserData, %s, paramInputData);\n", pValName); pTouserStream += size; toUser_size -= size; size = snprintf(pFromuserStream, fromUser_size, "\t\tFROM_USER_DEF_ELE(paramUserData, %s, paramInputData);\n", pValName); pFromuserStream += size; fromUser_size -= size; size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_BASE_PRINT_TOBUF(p, outSize, \"%s\", data.%s);\n", pValName, pValName); pToJsonStream += size; toJson_size -= size; } else { size = snprintf(pTouserStream, toUser_size, "\t\tTO_USER_DEF_NODE(paramUserData, %s, paramInputData);\n", pValName); pTouserStream += size; toUser_size -= size; size = snprintf(pFromuserStream, fromUser_size, "\t\tFROM_USER_DEF_NODE(paramUserData, %s, paramInputData);\n", pValName); pFromuserStream += size; fromUser_size -= size; size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_NODE_PRINT_TOBUF(p, outSize, \"%s\", data.%s);\n", pValName, pValName); pToJsonStream += size; toJson_size -= size; } } if (n==subNodes-1) { /*int size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_NODE_NEW_LINE(p, outSize);\n"); pToJsonStream += size; toJson_size -= size;*/ } else { int size = snprintf(pToJsonStream, toJson_size, "\t\tJSON_NODE_INTERVAL(p, outSize);\n"); pToJsonStream += size; toJson_size -= size; } } fprintf(pf, "};\n") ; fprintf(pfCpp, "\n\tint ReadStream(NDIStreamMsg &inmsg,NetMessage::%s &data)\n\t{\n", pName) ; fprintf(pfCpp, "%s\n\t\tTRYTO_MOVE_STRUCT_END(inmsg);\n\t\treturn 0; \n\t}\n", buf_read_func) ; fprintf(pfCpp, "\tint WriteStream(NDOStreamMsg &omsg,const NetMessage::%s &data)\n\t{\n", pName) ; fprintf(pfCpp, "\t\t\n"); fprintf(pfCpp, "%s\n\t\tEND_STRUCT_STREAM(omsg); \n\t\treturn 0; \n\t}\n", buf_write_func) ; fprintf(pf, "int ReadStream(NDIStreamMsg &inmsg,NetMessage::%s &data);\n", pName) ; fprintf(pf, "int WriteStream(NDOStreamMsg &omsg,const NetMessage::%s &data);\n", pName) ; //write json size_t PrintJson(char *buf, size_t bufsize, const char *name, const char*data); fprintf(pf, "size_t PrintJson(char *buf, size_t bufsize, const char *, %s &data);\n", pName); fprintf(pfCpp, "\n\tsize_t PrintJson(char *outBuf, size_t outSize, const char *name, %s &data)\n ", pName); fprintf(pfCpp, "\t{\n\t\tchar *p = outBuf;\n\t\tJSON_NODE_OUT_BEGIN(p,outSize);\n"); fprintf(pfCpp, "%s\n\t\tJSON_NODE_OUT_END(p,outSize);\n\t\treturn (p-outBuf); \n\t}\n", buf_toJson_func); //write to user-define data paramUserData, %s, paramInputData fprintf(pfCpp, "#ifndef WITHOUT_LOGIC_PARSER\n"); fprintf(pfCpp, "\n\tint ToUserDef(LogicUserDefStruct ¶mUserData,const NetMessage::%s ¶mInputData)\n\t{\n", pName); fprintf(pfCpp, "%s\n\t\treturn 0; \n\t}\n", buf_toUser_func); fprintf(pfCpp, "\tint FromUserDef(const LogicUserDefStruct ¶mUserData, NetMessage::%s ¶mInputData)\n\t{\n", pName); fprintf(pfCpp, "%s\n\t\treturn 0; \n\t}\n", buf_fromUser_func); fprintf(pfCpp, "#endif\n\n"); fprintf(pf, "#ifndef WITHOUT_LOGIC_PARSER\n"); fprintf(pf, "int ToUserDef(LogicUserDefStruct &userData,const NetMessage::%s &data);\n", pName); fprintf(pf, "int FromUserDef(const LogicUserDefStruct &userData, NetMessage::%s &data);\n", pName); fprintf(pf, "#endif\n\n\n"); return 0; }
int get_name_sort(ndxml_root *xmlfile,name_list_t &res_list) { name_list_t org_list ; ndxml *xnode = ndxml_getnode(xmlfile, "DataType") ; if (!xnode) { fprintf(stderr, " build marco error MarcoDefine node unexist\n" ) ; return -1 ; } int total = ndxml_getsub_num(xnode) ; //get original list for (int i=0; i<total; ++i) { ndxml *sub = ndxml_refsubi(xnode,i) ; ref_order_t node ; node.name = ndxml_getname(sub) ; node.is_used = 0 ; const char *saveDB = ndxml_getattr_val(sub, "saveDB") ; if (saveDB) { node.is_saveDB = atoi(saveDB) ; } else { node.is_saveDB = 0 ; } org_list.push_back(node) ; } //check name for (name_list_t::iterator it= org_list.begin(); it!=org_list.end();++it ) { for (name_list_t::iterator it_sub= it + 1; it_sub!=org_list.end();++it_sub ) { if (it->name == it_sub->name) { fprintf(stderr, "%s name duplicate\n", it->name.c_str()); exit(1) ; } } } //check is ref not after this int free_numb =(int) org_list.size() ; while (free_numb > 0) { free_numb = 0 ; for (name_list_t::iterator it= org_list.begin(); it!=org_list.end();++it ) { //cheng reference by other if (it->is_used) { continue ; } ndxml *subNode1 = ndxml_refsub(xnode,it->name.c_str()) ; int sub_num = ndxml_getsub_num(subNode1) ; bool is_ref = false ; for (int i=0; i<sub_num; ++i) { ndxml *subNode2 = ndxml_refsubi(subNode1,i) ; const char *myName = ndxml_getattr_val(subNode2, "type") ; for (name_list_t::iterator it_sub= org_list.begin(); it_sub!=org_list.end(); ++it_sub) { if (it_sub->is_used || it==it_sub) { continue ; } if (0== strcmp(myName, it_sub->name.c_str()) ) { is_ref = true ; break ; } } } if (is_ref==false) { res_list.push_back(*it) ; it->is_used = 1; } else { ++free_numb ; } } } return 0; }