请仔细阅读和分析下面函数,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码
特别注意:
1.保持所有原始功能不变
2.提高执行效率,降低计算复杂度
3.已经给定的结构体名字和元素不要更改,详细的中文注释
4.自动添加中文注释说明功能逻辑
5.不使用 auto,使用显式 for 循环
6.结构体采用32位定义
7.不要使用小函数,保持原始的函数定义
8.严格保持protobuf字段映射关系
函数中的 HDDMXng::TileType::TileType 映射为
message TileType
{
optional uint32 numarcs = 1;
optional uint32 gidx = 2;
optional uint32 numwires = 3;
optional sint32 xmin = 4;
optional sint32 xmax = 5;
optional sint32 ymin = 6;
optional sint32 ymax = 7;
optional uint32 xgridextent = 8;
optional uint32 ygridextent = 9;
optional string gname = 10;
optional string hwname = 11;
repeated SiteChildDef sitechilddefs = 12;
repeated sint32 sitepin2wire = 13 [packed = true];
optional uint32 numtileports = 14;
}
将 _BYTE tileType_msg[16] 映射为 HDDMXng::TileType tileType_msg;
void __fastcall HDDMTileType::readme_pb(
HDDMTileType *this,
std::istream *stream,
HDDMDevice *hddmDevice,
__int64 a4,
__int64 a5)
{
google::protobuf::Message *v6; // rdx
__int16 v7; // dx
std::string *v8; // rsi
__int16 v9; // ax
int n0x7FFFFFFF; // edx
char v11; // al
int n0x7FFFFFFF_2; // edx
int n0x7FFFFFFF_4; // edx
bool v14; // zf
__int16 word18; // ax
int n0x7FFFFFFF_6; // edx
__int16 word1A; // ax
unsigned __int64 v18; // rbx
__int64 qwordC0; // rdx
unsigned __int64 v20; // rax
__int64 *qwordB0; // rbp
__int64 qwordA8; // rdx
unsigned __int64 v23; // rax
__int64 *qwordB0_3; // r13
__int64 *qwordB0_1; // rbx
void *p__ZNSs4_Rep20_S_empty_rep_storageE; // rdi
__int64 v27; // rbp
__int64 qword38_1; // rax
__int64 v29; // rax
_DWORD *v30; // rax
HDDMTilePort *v31; // rbx
HDDMTilePort **hddmTilePortVec; // rax
__int64 v33; // r12
int word1C_1; // ebx
__int64 v35; // rbp
__int64 v36; // rbp
int word2_1; // ebx
__int64 v38; // r12
int v39; // r13d
__int64 v40; // rbp
int word1C_2; // r12d
_WORD *ushortVec; // rdx
int v43; // eax
int v44; // esi
__int64 qword200; // rdx
char *p_char1F8; // rsi
__int64 p_char1F8_1; // rax
__int64 v48; // rdx
char v49; // al
int v50; // r14d
HDDMTileFace *v51; // rbx
const HDDMWire *v52; // rbp
HDDMTilePort *v53; // r12
HDDMTilePort **v54; // rax
__int64 v55; // rax
google::protobuf::Message *v56; // rdx
__int64 *qwordB0_2; // r14
__int64 v58; // rax
void *p__ZNSs4_Rep20_S_empty_rep_storageE_1; // rdi
int v60; // edx
unsigned int hddmDeviceb; // [rsp+0h] [rbp-1A8h]
unsigned int v64; // [rsp+10h] [rbp-198h]
__int64 v65; // [rsp+18h] [rbp-190h]
int v66; // [rsp+18h] [rbp-190h]
int v67; // [rsp+20h] [rbp-188h]
unsigned __int16 v69; // [rsp+3Ch] [rbp-16Ch]
unsigned __int16 v70; // [rsp+3Eh] [rbp-16Ah]
char v71; // [rsp+5Fh] [rbp-149h] BYREF
_QWORD v72[2]; // [rsp+60h] [rbp-148h] BYREF
_QWORD v73[2]; // [rsp+70h] [rbp-138h] BYREF
HDDMTilePort *v74[2]; // [rsp+80h] [rbp-128h] BYREF
_QWORD v75[2]; // [rsp+90h] [rbp-118h] BYREF
int v76; // [rsp+A0h] [rbp-108h]
int v77; // [rsp+A4h] [rbp-104h]
unsigned int hddmDeviceb_1; // [rsp+A8h] [rbp-100h]
unsigned int v79; // [rsp+ACh] [rbp-FCh]
int word1C_3; // [rsp+B0h] [rbp-F8h]
char v81; // [rsp+B8h] [rbp-F0h]
_BYTE tileType_msg[16]; // [rsp+C0h] [rbp-E8h] BYREF
int word2; // [rsp+D0h] [rbp-D8h]
__int16 v84; // [rsp+D4h] [rbp-D4h]
int word1C; // [rsp+D8h] [rbp-D0h]
int n0x7FFFFFFF_1; // [rsp+DCh] [rbp-CCh]
int n0x7FFFFFFF_3; // [rsp+E0h] [rbp-C8h]
int n0x7FFFFFFF_5; // [rsp+E4h] [rbp-C4h]
int n0x7FFFFFFF_7; // [rsp+E8h] [rbp-C0h]
int word18_1; // [rsp+ECh] [rbp-BCh]
std::string *v91; // [rsp+F0h] [rbp-B8h]
std::string *v92; // [rsp+F8h] [rbp-B0h]
int word1A_1; // [rsp+100h] [rbp-A8h]
int v94; // [rsp+104h] [rbp-A4h]
__int64 v95; // [rsp+108h] [rbp-A0h]
int v96; // [rsp+110h] [rbp-98h]
__int64 v97; // [rsp+140h] [rbp-68h]
int v98; // [rsp+148h] [rbp-60h]
int v99; // [rsp+168h] [rbp-40h]
if ( HDDMDeviceDump::useXngMarks )
std::istream::read(stream, HDDMDeviceDump::markBuffer, 8);
if ( !(_BYTE)byte_992F640 && __cxa_guard_acquire(&byte_992F640) )
{
dword_992F530 = HDDMTileType::createtypenamemap((HDDMTileType *)&byte_992F640);
__cxa_guard_release(&byte_992F640);
}
HDDMXng::TileType::TileType((HDDMXng::TileType *)tileType_msg);
HDDMDevice::readMessage((HDDMDevice *)stream, (std::istream *)tileType_msg, v6);
v7 = v84;
v8 = v91;
HIWORD(this->tileType_code) = word2;
v9 = (v7 << 6) | this->tileType_code & 0x3F;
n0x7FFFFFFF = 0x7FFFFFFF;
LOWORD(this->tileType_code) = v9;
LOWORD(this->tileType_code7) = word1C;
v11 = v99;
if ( (v99 & 8) != 0 )
n0x7FFFFFFF = n0x7FFFFFFF_1;
this->tileType_code2 = n0x7FFFFFFF;
n0x7FFFFFFF_2 = 0x7FFFFFFF;
if ( (v11 & 0x10) != 0 )
n0x7FFFFFFF_2 = n0x7FFFFFFF_3;
this->tileType_code3 = n0x7FFFFFFF_2;
n0x7FFFFFFF_4 = 0x7FFFFFFF;
if ( (v11 & 0x20) != 0 )
n0x7FFFFFFF_4 = n0x7FFFFFFF_5;
v14 = (v11 & 0x40) == 0;
word18 = word18_1;
this->tileType_code4 = n0x7FFFFFFF_4;
n0x7FFFFFFF_6 = 0x7FFFFFFF;
if ( !v14 )
n0x7FFFFFFF_6 = n0x7FFFFFFF_7;
LOWORD(this->tileType_code6) = word18;
word1A = word1A_1;
this->tileType_code5 = n0x7FFFFFFF_6;
HIWORD(this->tileType_code6) = word1A;
std::string::assign((std::string *)&this->gname, v8);
std::string::assign((std::string *)&this->hwname, v92);
HDDMTileType::settypeenum(this);
v18 = v96;
v67 = v96;
std::vector<HDDMSiteType *>::resize(&this->hddmSiteTypeVec, v96);
std::vector<unsigned short>::resize(&this->ushortVec, v18);
qwordC0 = this->qwordC0;
v20 = (this->qwordC8 - qwordC0) >> 2;
if ( v18 > v20 )
{
std::vector<std::pair<short,short>>::_M_default_append(&this->qwordC0, v18 - v20);
}
else if ( v18 < v20 )
{
this->qwordC8 = qwordC0 + 4 * v18;
}
qwordB0 = (__int64 *)this->qwordB0;
qwordA8 = this->qwordA8;
v23 = ((__int64)qwordB0 - qwordA8) >> 3;
if ( v18 > v23 )
{
std::vector<std::string>::_M_default_append(&this->qwordA8, v18 - v23);
}
else if ( v18 < v23 )
{
qwordB0_3 = (__int64 *)(qwordA8 + 8 * v18);
if ( qwordB0 != qwordB0_3 )
{
if ( &_pthread_key_create )
{
qwordB0_1 = (__int64 *)(qwordA8 + 8 * v18);
do
{
p__ZNSs4_Rep20_S_empty_rep_storageE = (void *)(*qwordB0_1 - 24);
if ( p__ZNSs4_Rep20_S_empty_rep_storageE != &std::string::_Rep::_S_empty_rep_storage
&& _InterlockedExchangeAdd((volatile signed __int32 *)(*qwordB0_1 - 8), 0xFFFFFFFF) <= 0 )
{
std::string::_Rep::_M_destroy(p__ZNSs4_Rep20_S_empty_rep_storageE, v75);
}
++qwordB0_1;
}
while ( qwordB0 != qwordB0_1 );
}
else
{
qwordB0_2 = (__int64 *)(qwordA8 + 8 * v18);
do
{
v58 = *qwordB0_2;
p__ZNSs4_Rep20_S_empty_rep_storageE_1 = (void *)(*qwordB0_2 - 24);
if ( p__ZNSs4_Rep20_S_empty_rep_storageE_1 != &std::string::_Rep::_S_empty_rep_storage )
{
v60 = *(_DWORD *)(v58 - 8);
*(_DWORD *)(v58 - 8) = v60 - 1;
if ( v60 <= 0 )
std::string::_Rep::_M_destroy(p__ZNSs4_Rep20_S_empty_rep_storageE_1, v75);
}
++qwordB0_2;
}
while ( qwordB0 != qwordB0_2 );
}
}
this->qwordB0 = qwordB0_3;
}
if ( v67 > 0 )
{
v27 = 0;
do
{
v29 = *(_QWORD *)(v95 + 8 * v27);
*(_QWORD *)(this->hddmSiteTypeVec + 8 * v27) = *(_QWORD *)(hddmDevice->qword90
+ 8LL * *(unsigned __int16 *)(v29 + 24));
*(_WORD *)(this->ushortVec + 2 * v27) = *(_DWORD *)(v29 + 28);
*(_WORD *)(this->qwordC0 + 4 * v27) = *(_DWORD *)(v29 + 32);
*(_WORD *)(this->qwordC0 + 4 * v27 + 2) = *(_DWORD *)(v29 + 36);
std::string::assign((std::string *)(this->qwordA8 + 8 * v27), *(const std::string **)(v29 + 16));
std::string::string((std::string *)v72, (const std::string *)(this->qwordA8 + 8 * v27));
v65 = *(_QWORD *)(this->hddmSiteTypeVec + 8 * v27);
v30 = (_DWORD *)operator new(0x40u);
*(_QWORD *)v30 = this;
v30[2] = (unsigned __int16)v27;
v31 = (HDDMTilePort *)v30;
std::string::string((std::string *)(v30 + 4), (const std::string *)v72);
*((_QWORD *)v31 + 5) = 0;
*((_QWORD *)v31 + 6) = 0;
*((_QWORD *)v31 + 7) = 0;
*((_QWORD *)v31 + 4) = v31;
*((_QWORD *)v31 + 3) = v65;
v74[0] = v31;
std::string::_Rep::_M_dispose(v72[0] - 24LL, v75);
hddmTilePortVec = (HDDMTilePort **)this->hddmTilePortVec;
if ( hddmTilePortVec == (HDDMTilePort **)this->qword40 )
{
std::vector<HDDMSiteChildDef *>::_M_emplace_back_aux<HDDMSiteChildDef * const&>(&this->hddmSiteChildDefVec, v74);
}
else
{
if ( hddmTilePortVec )
{
*hddmTilePortVec = v74[0];
qword38_1 = this->hddmTilePortVec;
}
else
{
qword38_1 = 0;
}
this->hddmTilePortVec = qword38_1 + 8;
}
std::string::string((std::string *)v75, (const std::string *)(this->qwordA8 + 8 * v27));
v75[1] = v74[0];
std::_Rb_tree<std::string,std::pair<std::string const,HDDMSiteChildDef *>,std::_Select1st<std::pair<std::string const,HDDMSiteChildDef *>>,std::less<std::string>,std::allocator<std::pair<std::string const,HDDMSiteChildDef *>>>::_M_insert_unique<std::pair<std::string,HDDMSiteChildDef *>>(
&this->qword40 + 1,
v75);
++v27;
std::string::_Rep::_M_dispose(v75[0] - 24LL, v73);
}
while ( v67 > (int)v27 );
}
HDDMTileType::allocatewires(this, this->tileType_code7);
v33 = 0;
word1C_1 = 0;
if ( LOWORD(this->tileType_code7) )
{
do
{
v35 = this->hddmWireVec + v33;
HDDMWire::readme_pb(v35, stream, hddmDevice, a5);
*(_WORD *)(v35 + 10) = word1C_1;
std::string::string((std::string *)v73, (const std::string *)(v35 + 32));
*(_WORD *)std::map<std::string,unsigned short>::operator[](this->gap1C0, v73) = word1C_1++;
v33 += 88;
std::string::_Rep::_M_dispose(v73[0] - 24LL, v75);
}
while ( LOWORD(this->tileType_code7) > word1C_1 );
}
HDDMTileType::allocatearcs(this, HIWORD(this->tileType_code));
v36 = 0;
word2_1 = 0;
if ( HIWORD(this->tileType_code) )
{
do
{
v38 = this->hddmArcVec + v36;
HDDMArc::readme_pb((HDDMArc *)v38, stream, hddmDevice);
*(_WORD *)(v38 + 6) = word2_1++;
v36 += 24;
}
while ( HIWORD(this->tileType_code) > word2_1 );
}
v39 = v98;
std::vector<unsigned short>::resize(&this->qword1A8, v98);
v40 = 0;
if ( v39 > 0 )
{
while ( 1 )
{
while ( 1 )
{
word1C_2 = *(_DWORD *)(v97 + 4 * v40);
if ( word1C_2 >= 0 )
break;
LABEL_59:
if ( v39 <= (int)++v40 )
goto LABEL_60;
}
*(_WORD *)(this->qword1A8 + 2 * v40) = word1C_2;
if ( (_WORD)v67 )
{
ushortVec = (_WORD *)this->ushortVec;
v43 = 1;
while ( 1 )
{
v44 = v43;
if ( (unsigned __int16)v40 >= *ushortVec
&& ((unsigned __int16)v67 == v43 || (unsigned __int16)v40 < ushortVec[1]) )
{
break;
}
++ushortVec;
++v43;
if ( (unsigned __int16)v67 <= v44 )
goto LABEL_47;
}
v70 = v43 - 1;
v69 = v40 - *ushortVec;
}
LABEL_47:
qword200 = this->qword200;
LOWORD(v75[0]) = word1C_2;
p_char1F8 = &this->?;
if ( !qword200 )
goto LABEL_75;
do
{
while ( (unsigned __int16)word1C_2 <= *(_WORD *)(qword200 + 32) )
{
p_char1F8 = (char *)qword200;
qword200 = *(_QWORD *)(qword200 + 16);
if ( !qword200 )
goto LABEL_52;
}
qword200 = *(_QWORD *)(qword200 + 24);
}
while ( qword200 );
LABEL_52:
if ( &this->? == p_char1F8 || (unsigned __int16)word1C_2 < *((_WORD *)p_char1F8 + 16) )
{
LABEL_75:
v74[0] = (HDDMTilePort *)v75;
p_char1F8_1 = std::_Rb_tree<unsigned short,std::pair<unsigned short const,std::pair<unsigned short,unsigned short>>,std::_Select1st<std::pair<unsigned short const,std::pair<unsigned short,unsigned short>>>,std::less<unsigned short>,std::allocator<std::pair<unsigned short const,std::pair<unsigned short,unsigned short>>>>::_M_emplace_hint_unique<std::piecewise_construct_t const&,std::tuple<unsigned short &&>,std::tuple<>>(
this->?,
p_char1F8,
&qword_7B6AC49,
v74,
&v71,
word1C_2);
}
else
{
p_char1F8_1 = (__int64)p_char1F8;
}
*(_WORD *)(p_char1F8_1 + 34) = v70;
*(_WORD *)(p_char1F8_1 + 36) = v69;
v48 = 0;
if ( LOWORD(this->tileType_code7) > (unsigned __int16)word1C_2 )
v48 = this->hddmWireVec + 88LL * (unsigned __int16)word1C_2;
v49 = *(_BYTE *)(*(_QWORD *)(*(_QWORD *)(this->hddmSiteTypeVec + 8LL * v70) + 24LL) + 16LL * v69 + 5) & 0xC0;
switch ( v49 )
{
case 0:
*(_BYTE *)(v48 + 2) |= 5u;
goto LABEL_59;
case 0x80:
++v40;
*(_BYTE *)(v48 + 2) |= 6u;
if ( v39 <= (int)v40 )
goto LABEL_60;
break;
case 0x40:
++v40;
*(_BYTE *)(v48 + 2) |= 7u;
if ( v39 <= (int)v40 )
goto LABEL_60;
break;
default:
goto LABEL_59;
}
}
}
LABEL_60:
HDDMTileType::createedgeds(this);
HDDMTileType::createwirearcs(this, hddmDevice);
HDDMTileType::marknulltiles(this);
HDDMTileType::allocatetileports(this);
v66 = v94;
if ( v94 )
{
if ( HDDMDeviceDump::useXngMarks )
std::istream::read(stream, HDDMDeviceDump::markBuffer, 5);
v50 = 0;
do
{
HDDMXng::TilePort::TilePort((HDDMXng::TilePort *)v75);
HDDMDevice::readMessage((HDDMDevice *)stream, (std::istream *)v75, v56);
hddmDeviceb = hddmDeviceb_1;
v64 = v79;
if ( (v81 & 0x10) != 0 )
{
v51 = *(HDDMTileFace **)(*(_QWORD *)(*(_QWORD *)(this->qword228 + 8LL * (unsigned __int16)v76) + 24LL)
+ 8LL * (unsigned __int16)v77);
if ( (unsigned __int16)word1C_3 >= LOWORD(this->tileType_code7) )
v52 = 0;
else
v52 = (const HDDMWire *)(this->hddmWireVec + 88LL * (unsigned __int16)word1C_3);
}
else
{
v52 = 0;
v51 = *(HDDMTileFace **)(*(_QWORD *)(*(_QWORD *)(this->qword228 + 8LL * (unsigned __int16)v76) + 24LL)
+ 8LL * (unsigned __int16)v77);
}
v53 = (HDDMTilePort *)operator new(0x18u);
HDDMTilePort::HDDMTilePort(v53, v51, hddmDeviceb, v64, v52);
v74[0] = v53;
v54 = (HDDMTilePort **)*((_QWORD *)v51 + 4);
if ( v54 == *((HDDMTilePort ***)v51 + 5) )
{
std::vector<HDDMTilePort *>::_M_emplace_back_aux<HDDMTilePort * const&>((char *)v51 + 24, v74);
}
else
{
if ( v54 )
{
*v54 = v53;
v55 = *((_QWORD *)v51 + 4);
}
else
{
v55 = 0;
}
*((_QWORD *)v51 + 4) = v55 + 8;
}
if ( v52 )
HDDMWire::addtileport(v52, v74[0]);
++v50;
HDDMXng::TilePort::~TilePort((HDDMXng::TilePort *)v75);
}
while ( v50 != v66 );
}
HDDMXng::TileType::~TileType((HDDMXng::TileType *)tileType_msg);
}
void __fastcall HDDMTileType::writeme_pb(HDDMTileType *this, std::ostream *stream, __int16 a3)
{
int n0x7FFFFFFF; // ecx
int v6; // eax
int tileType_code3; // eax
int tileType_code6_low; // edx
std::string *p__ZN6google8protobuf8internal12kEmptyStringE_3; // rdi
__int64 v10; // rax
__int64 v11; // r12
__int64 v12; // r14
__int64 v13; // rbx
__int64 v14; // rax
std::string *p__ZN6google8protobuf8internal12kEmptyStringE_2; // rdi
int v16; // eax
int v17; // edx
int v18; // edx
int v19; // edx
__int64 qwordA8; // rdx
const std::string *v21; // r13
__int64 v22; // rax
int v23; // esi
__int64 qword1A8; // rax
__int64 src_2; // rdx
__int64 v26; // rbx
__int64 v27; // r13
int v28; // r12d
__int64 v29; // rax
int v30; // eax
__int64 *src_1; // r14
unsigned __int64 v32; // rdi
__int64 v33; // r12
int v34; // ebx
__int64 v35; // r12
int v36; // ebx
void *v37; // rdi
google::protobuf::internal::RepeatedPtrFieldBase *v38; // rbp
unsigned __int16 ***v39; // rbx
unsigned __int16 **v40; // r13
__int64 v41; // r14
unsigned __int16 *v42; // r15
int v43; // eax
int v44; // edx
int v45; // edx
const google::protobuf::Message *v46; // rdx
std::string *p__ZN6google8protobuf8internal12kEmptyStringE_4; // rdi
google::protobuf::internal::RepeatedPtrFieldBase *v49; // [rsp+10h] [rbp-148h]
void *v50; // [rsp+20h] [rbp-138h] BYREF
_BYTE *v51; // [rsp+28h] [rbp-130h]
__int64 v52; // [rsp+30h] [rbp-128h]
_BYTE v53[16]; // [rsp+40h] [rbp-118h] BYREF
int v54; // [rsp+50h] [rbp-108h]
int v55; // [rsp+54h] [rbp-104h]
int v56; // [rsp+58h] [rbp-100h]
int v57; // [rsp+5Ch] [rbp-FCh]
int v58; // [rsp+60h] [rbp-F8h]
int v59; // [rsp+68h] [rbp-F0h]
_BYTE v60[16]; // [rsp+70h] [rbp-E8h] BYREF
int tileType_code_high; // [rsp+80h] [rbp-D8h]
int v62; // [rsp+84h] [rbp-D4h]
int tileType_code7_low; // [rsp+88h] [rbp-D0h]
int n0x7FFFFFFF_1; // [rsp+8Ch] [rbp-CCh]
int tileType_code3_1; // [rsp+90h] [rbp-C8h]
int tileType_code4; // [rsp+94h] [rbp-C4h]
int tileType_code5; // [rsp+98h] [rbp-C0h]
int tileType_code6_low_1; // [rsp+9Ch] [rbp-BCh]
std::string *p__ZN6google8protobuf8internal12kEmptyStringE; // [rsp+A0h] [rbp-B8h]
std::string *p__ZN6google8protobuf8internal12kEmptyStringE_1; // [rsp+A8h] [rbp-B0h]
int tileType_code6_high; // [rsp+B0h] [rbp-A8h]
int v72; // [rsp+B4h] [rbp-A4h]
__int64 v73; // [rsp+B8h] [rbp-A0h] BYREF
int v74; // [rsp+C0h] [rbp-98h]
int v75; // [rsp+C4h] [rbp-94h]
int v76; // [rsp+C8h] [rbp-90h]
void *src; // [rsp+F0h] [rbp-68h]
int v78; // [rsp+F8h] [rbp-60h]
int v79; // [rsp+FCh] [rbp-5Ch]
__int64 v80; // [rsp+100h] [rbp-58h] BYREF
int v81; // [rsp+118h] [rbp-40h]
if ( HDDMDeviceDump::useXngMarks )
std::ostream::write(stream, "TILETYPE", 8);
HDDMXng::TileType::TileType((HDDMXng::TileType *)v60);
n0x7FFFFFFF = this->tileType_code2;
tileType_code_high = HIWORD(this->tileType_code);
v62 = LOWORD(this->tileType_code) >> 6;
tileType_code7_low = LOWORD(this->tileType_code7);
v6 = v81 | 7;
if ( n0x7FFFFFFF != 0x7FFFFFFF )
{
tileType_code3 = this->tileType_code3;
n0x7FFFFFFF_1 = n0x7FFFFFFF;
tileType_code3_1 = tileType_code3;
tileType_code4 = this->tileType_code4;
tileType_code5 = this->tileType_code5;
v6 = v81 | 0x7F;
}
tileType_code6_low = LOWORD(this->tileType_code6);
p__ZN6google8protobuf8internal12kEmptyStringE_3 = p__ZN6google8protobuf8internal12kEmptyStringE;
v81 = v6 | 0x380;
tileType_code6_low_1 = tileType_code6_low;
tileType_code6_high = HIWORD(this->tileType_code6);
if ( p__ZN6google8protobuf8internal12kEmptyStringE == (std::string *)&google::protobuf::internal::kEmptyString )
{
p__ZN6google8protobuf8internal12kEmptyStringE_3 = (std::string *)operator new(8u);
*(_QWORD *)p__ZN6google8protobuf8internal12kEmptyStringE_3 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24;
p__ZN6google8protobuf8internal12kEmptyStringE = p__ZN6google8protobuf8internal12kEmptyStringE_3;
}
std::string::assign(p__ZN6google8protobuf8internal12kEmptyStringE_3, (const std::string *)&this->gname);
if ( *((_QWORD *)this->hwname - 3) )
{
p__ZN6google8protobuf8internal12kEmptyStringE_4 = p__ZN6google8protobuf8internal12kEmptyStringE_1;
v81 |= 0x400u;
if ( p__ZN6google8protobuf8internal12kEmptyStringE_1 == (std::string *)&google::protobuf::internal::kEmptyString )
{
p__ZN6google8protobuf8internal12kEmptyStringE_4 = (std::string *)operator new(8u);
*(_QWORD *)p__ZN6google8protobuf8internal12kEmptyStringE_4 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24;
p__ZN6google8protobuf8internal12kEmptyStringE_1 = p__ZN6google8protobuf8internal12kEmptyStringE_4;
}
std::string::assign(p__ZN6google8protobuf8internal12kEmptyStringE_4, (const std::string *)&this->hwname);
}
v50 = 0;
v51 = 0;
v52 = 0;
if ( a3 )
{
HDDMTileType::getAllTilePorts(this, &v50);
if ( v51 != v50 )
{
v81 |= 0x2000u;
v72 = (v51 - (_BYTE *)v50) >> 3;
}
}
v10 = (__int64)(this->qword80 - this->hddmSiteTypeVec) >> 3;
if ( (_WORD)v10 )
{
v11 = 0;
v12 = 2LL * ((unsigned int)(unsigned __int16)v10 - 1) + 2;
do
{
v22 = v74;
v23 = v75;
if ( v74 >= v75 )
{
if ( v75 == v76 )
{
google::protobuf::internal::RepeatedPtrFieldBase::Reserve(
(google::protobuf::internal::RepeatedPtrFieldBase *)&v73,
v75 + 1);
v23 = v75;
}
v75 = v23 + 1;
v13 = operator new(0x30u);
HDDMXng::SiteChildDef::SiteChildDef((HDDMXng::SiteChildDef *)v13);
v14 = v74++;
*(_QWORD *)(v73 + 8 * v14) = v13;
}
else
{
++v74;
v13 = *(_QWORD *)(v73 + 8 * v22);
}
p__ZN6google8protobuf8internal12kEmptyStringE_2 = *(std::string **)(v13 + 16);
v16 = *(_DWORD *)(v13 + 44);
*(_DWORD *)(v13 + 24) = *(_WORD *)(*(_QWORD *)(this->hddmSiteTypeVec + 4 * v11) + 10LL) >> 6;
*(_DWORD *)(v13 + 44) = v16 | 1;
v17 = *(unsigned __int16 *)(this->ushortVec + v11);
*(_DWORD *)(v13 + 44) = v16 | 5;
*(_DWORD *)(v13 + 28) = v17;
v18 = *(__int16 *)(this->qwordC0 + 2 * v11);
*(_DWORD *)(v13 + 44) = v16 | 0xD;
*(_DWORD *)(v13 + 32) = v18;
v19 = *(__int16 *)(this->qwordC0 + 2 * v11 + 2);
*(_DWORD *)(v13 + 44) = v16 | 0x1D;
*(_DWORD *)(v13 + 36) = v19;
qwordA8 = this->qwordA8;
*(_DWORD *)(v13 + 44) = v16 | 0x1F;
v21 = (const std::string *)(qwordA8 + 4 * v11);
if ( p__ZN6google8protobuf8internal12kEmptyStringE_2 == (std::string *)&google::protobuf::internal::kEmptyString )
{
p__ZN6google8protobuf8internal12kEmptyStringE_2 = (std::string *)operator new(8u);
*(_QWORD *)p__ZN6google8protobuf8internal12kEmptyStringE_2 = (char *)&std::string::_Rep::_S_empty_rep_storage
+ 24;
*(_QWORD *)(v13 + 16) = p__ZN6google8protobuf8internal12kEmptyStringE_2;
}
std::string::assign(p__ZN6google8protobuf8internal12kEmptyStringE_2, v21);
v11 += 2;
}
while ( v11 != v12 );
}
qword1A8 = this->qword1A8;
src_2 = (this->qword1B0 - qword1A8) >> 1;
if ( (_WORD)src_2 )
{
v26 = 0;
v27 = 2LL * ((unsigned int)(unsigned __int16)src_2 - 1) + 2;
while ( 1 )
{
v28 = *(unsigned __int16 *)(qword1A8 + v26);
v29 = v78;
if ( v78 == v79 )
{
v30 = v78 + 1;
src_1 = (__int64 *)src;
if ( 2 * v78 >= v78 + 1 )
v30 = 2 * v78;
v79 = v30;
v32 = 4LL * v30;
if ( (unsigned __int64)v30 > 0x1FC0000000000000LL )
v32 = -1;
src = (void *)operator new[](v32);
memcpy(src, src_1, 4LL * v78);
if ( src_1 != &v80 && src_1 )
operator delete[](src_1);
v29 = v78;
}
v26 += 2;
v78 = v29 + 1;
src_2 = (__int64)src;
*((_DWORD *)src + v29) = v28;
if ( v26 == v27 )
break;
qword1A8 = this->qword1A8;
}
}
HDDMDevice::writeMessage((HDDMDevice *)stream, (std::ostream *)v60, (const google::protobuf::Message *)src_2);
v33 = 0;
v34 = 0;
if ( LOWORD(this->tileType_code7) )
{
do
{
HDDMWire::writeme_pb(this->hddmWireVec + v33, stream);
++v34;
v33 += 88;
}
while ( LOWORD(this->tileType_code7) > v34 );
}
v35 = 0;
v36 = 0;
if ( HIWORD(this->tileType_code) )
{
do
{
HDDMArc::writeme_pb(this->hddmArcVec + v35, stream);
++v36;
v35 += 24;
}
while ( HIWORD(this->tileType_code) > v36 );
}
v37 = v51;
v38 = (google::protobuf::internal::RepeatedPtrFieldBase *)v50;
if ( v51 != v50 )
{
v49 = (google::protobuf::internal::RepeatedPtrFieldBase *)v51;
if ( HDDMDeviceDump::useXngMarks
&& (std::ostream::write(stream, "PORTS", 5),
v38 = (google::protobuf::internal::RepeatedPtrFieldBase *)v50,
v49 = (google::protobuf::internal::RepeatedPtrFieldBase *)v51,
v50 == v51) )
{
v37 = v50;
}
else
{
do
{
v39 = *(unsigned __int16 ****)v38;
v40 = **(unsigned __int16 ****)v38;
v41 = *(_QWORD *)(*(_QWORD *)v38 + 16LL);
v42 = *v40;
HDDMXng::TilePort::TilePort((HDDMXng::TilePort *)v53);
v43 = v59;
v54 = *v42;
v59 |= 1u;
v44 = *((unsigned __int16 *)v40 + 4);
v59 = v43 | 3;
v55 = v44;
v45 = *((_DWORD *)v39 + 2);
v59 = v43 | 7;
v56 = v45;
v46 = (const google::protobuf::Message *)*((unsigned int *)v39 + 3);
v59 = v43 | 0xF;
v57 = (int)v46;
if ( v41 )
{
v46 = (const google::protobuf::Message *)*(unsigned __int16 *)(v41 + 10);
v59 = v43 | 0x1F;
v58 = (int)v46;
}
HDDMDevice::writeMessage((HDDMDevice *)stream, (std::ostream *)v53, v46);
v38 = (google::protobuf::internal::RepeatedPtrFieldBase *)((char *)v38 + 8);
HDDMXng::TilePort::~TilePort((HDDMXng::TilePort *)v53);
}
while ( v49 != v38 );
v37 = v50;
}
}
if ( v37 )
operator delete(v37);
HDDMXng::TileType::~TileType((HDDMXng::TileType *)v60);
}
void __fastcall HDDMTileType::print(HDDMTileType *this, std::ostream *stream, const std::string *fileName)
{
__int64 v5; // rax
__int64 v6; // rax
__int64 v7; // rax
__int64 tileType_code_high; // rbx
__int64 v9; // rax
__int64 v10; // rax
unsigned __int8 v11; // r14
__int64 v12; // r12
__int64 v13; // rbx
__int64 v14; // rax
__int64 v15; // rax
__int64 v16; // rax
__int64 v17; // rax
__int64 v18; // rax
__int64 v19; // rax
__int64 v20; // rax
__int64 tileType_code7_low; // rbx
__int64 v22; // rax
__int64 v23; // rax
__int64 v24; // rax
__int64 v25; // rax
__int64 v26; // rax
__int64 v27; // rax
unsigned int tileType_code4; // r14d
__int64 v29; // rax
__int64 v30; // rax
__int64 v31; // rax
__int64 v32; // rax
__int64 v33; // rax
__int64 v34; // rax
__int64 v35; // rax
__int64 v36; // rax
__int64 v37; // rax
__int64 tileType_code6_low; // rbx
__int64 tileType_code6_high; // r12
__int64 v40; // rax
__int64 v41; // rax
__int64 v42; // rax
__int64 v43; // rax
__int64 v44; // rax
unsigned __int16 word1C_1; // bx
__int64 v46; // r12
int word2_1; // ebx
HDDMArc *v48; // rdi
__int64 v49; // rbx
__int64 v50; // rax
__int64 v51; // rax
__int64 v52; // r14
__int64 v53; // rax
__int64 v54; // rax
__int64 v55; // rax
__int64 v56; // rbx
__int64 v57; // r12
__int64 v58; // rax
__int64 v59; // rax
__int64 v60; // rax
__int64 v61; // rbx
__int64 v62; // rax
__int64 v63; // rbx
_QWORD *v64; // r14
__int64 v65; // rax
__int64 v66; // r12
__int64 v67; // rax
unsigned int tileType_code5; // [rsp+10h] [rbp-68h]
__int64 v69; // [rsp+10h] [rbp-68h]
__int64 v70; // [rsp+18h] [rbp-60h]
char v71; // [rsp+2Fh] [rbp-49h] BYREF
_QWORD v72[9]; // [rsp+30h] [rbp-48h] BYREF
v5 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v6 = std::operator<<<std::char_traits<char>>(v5, "TILETYPE ");
v7 = std::__ostream_insert<char,std::char_traits<char>>(v6, this->gname, *((_QWORD *)this->gname - 3));
std::endl<char,std::char_traits<char>>(v7);
tileType_code_high = HIWORD(this->tileType_code);
v9 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v10 = std::operator<<<std::char_traits<char>>(v9, "m_numarcs : ");
std::ostream::_M_insert<unsigned long>(v10, tileType_code_high);
v11 = this->tileType_code & 0xF;
v12 = LOBYTE(this->tileType_code) >> 5;
v13 = LOWORD(this->tileType_code) >> 6;
v14 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v15 = std::operator<<<std::char_traits<char>>(v14, " m_deviceid : ");
v16 = std::ostream::_M_insert<unsigned long>(v15, v11);
v17 = std::operator<<<std::char_traits<char>>(v16, " m_interconnct : ");
v18 = std::ostream::_M_insert<unsigned long>(v17, v12 & 1);
v19 = std::operator<<<std::char_traits<char>>(v18, " m_gidx : ");
v20 = std::ostream::_M_insert<unsigned long>(v19, (unsigned __int16)v13);
std::endl<char,std::char_traits<char>>(v20);
tileType_code7_low = LOWORD(this->tileType_code7);
v22 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v23 = std::operator<<<std::char_traits<char>>(v22, " m_numwires : ");
v24 = std::ostream::_M_insert<unsigned long>(v23, tileType_code7_low);
std::endl<char,std::char_traits<char>>(v24);
HDDMTileType::getTileTypeName(v72, HIWORD(this->tileType_code1) >> 4);
v25 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v26 = std::operator<<<std::char_traits<char>>(v25, " m_ttypeenum : ");
v27 = std::__ostream_insert<char,std::char_traits<char>>(v26, v72[0], *(_QWORD *)(v72[0] - 24LL));
std::endl<char,std::char_traits<char>>(v27);
std::string::_Rep::_M_dispose(v72[0] - 24LL, &v71);
LODWORD(tileType_code7_low) = this->tileType_code2;
LODWORD(v12) = this->tileType_code3;
tileType_code4 = this->tileType_code4;
tileType_code5 = this->tileType_code5;
v29 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v30 = std::operator<<<std::char_traits<char>>(v29, "m_xmin : ");
v31 = std::ostream::operator<<(v30, (unsigned int)tileType_code7_low);
v32 = std::operator<<<std::char_traits<char>>(v31, " m_xmax : ");
v33 = std::ostream::operator<<(v32, (unsigned int)v12);
v34 = std::operator<<<std::char_traits<char>>(v33, " m_ymin : ");
v35 = std::ostream::operator<<(v34, tileType_code4);
v36 = std::operator<<<std::char_traits<char>>(v35, " m_ymax : ");
v37 = std::ostream::operator<<(v36, tileType_code5);
std::endl<char,std::char_traits<char>>(v37);
tileType_code6_low = LOWORD(this->tileType_code6);
tileType_code6_high = HIWORD(this->tileType_code6);
v40 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v41 = std::operator<<<std::char_traits<char>>(v40, "m_xgridextent : ");
v42 = std::ostream::_M_insert<unsigned long>(v41, tileType_code6_low);
v43 = std::operator<<<std::char_traits<char>>(v42, " m_ygridextent : ");
v44 = std::ostream::_M_insert<unsigned long>(v43, tileType_code6_high);
std::endl<char,std::char_traits<char>>(v44);
word1C_1 = this->tileType_code7;
if ( word1C_1 )
{
v52 = 0;
v53 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v54 = std::operator<<<std::char_traits<char>>(v53, "WIRES :");
std::endl<char,std::char_traits<char>>(v54);
v55 = (unsigned int)word1C_1 - 1;
v56 = 88 * v55;
v57 = 88 * (v55 + 1);
while ( 1 )
{
HDDMWire::print((HDDMWire *)(this->hddmWireVec + v52), stream, fileName);
if ( v52 == v56 )
break;
v52 += 88;
std::__ostream_insert<char,std::char_traits<char>>(stream, ",", 1);
std::endl<char,std::char_traits<char>>(stream);
if ( v52 == v57 )
goto LABEL_2;
}
v58 = std::operator<<<std::char_traits<char>>(stream, ";");
std::endl<char,std::char_traits<char>>(v58);
}
LABEL_2:
v46 = 0;
word2_1 = 0;
if ( HIWORD(this->tileType_code) )
{
do
{
v48 = (HDDMArc *)(this->hddmArcVec + v46);
++word2_1;
v46 += 24;
HDDMArc::print(v48, stream, fileName);
}
while ( HIWORD(this->tileType_code) > word2_1 );
}
v49 = (__int64)(this->qword80 - this->hddmSiteTypeVec) >> 3;
if ( (_DWORD)v49 )
{
v59 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v60 = std::operator<<<std::char_traits<char>>(v59, "CHILDREN :");
std::endl<char,std::char_traits<char>>(v60);
if ( (int)v49 > 0 )
{
v61 = (unsigned int)(v49 - 1);
v70 = 8 * v61 + 8;
v62 = 8 * v61;
v63 = 0;
v69 = v62;
while ( 1 )
{
v64 = (_QWORD *)(this->qwordA8 + v63);
std::string::string((std::string *)v72, (const std::string *)(*(_QWORD *)(this->hddmSiteTypeVec + v63) + 32LL));
v65 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v66 = std::__ostream_insert<char,std::char_traits<char>>(v65, v72[0], *(_QWORD *)(v72[0] - 24LL));
std::__ostream_insert<char,std::char_traits<char>>(v66, " ", 1);
std::__ostream_insert<char,std::char_traits<char>>(v66, *v64, *(_QWORD *)(*v64 - 24LL));
std::string::_Rep::_M_dispose(v72[0] - 24LL, &v71);
if ( v63 == v69 )
break;
v63 += 8;
std::__ostream_insert<char,std::char_traits<char>>(stream, ",", 1);
std::endl<char,std::char_traits<char>>(stream);
if ( v63 == v70 )
goto LABEL_5;
}
v67 = std::operator<<<std::char_traits<char>>(stream, ";");
std::endl<char,std::char_traits<char>>(v67);
}
}
LABEL_5:
v50 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
v51 = std::operator<<<std::char_traits<char>>(v50, "end BLOCK;");
std::endl<char,std::char_traits<char>>(v51);
}
最新发布