请仔细阅读和分析下面函数,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码
要求如下:
1.保持所有原始功能不变,不要遗漏逻辑细节
2.提高执行效率,降低计算复杂度
3.已经给定的结构体名字和元素不要更改,详细的中文注释
4.自动添加中文注释说明功能逻辑
5.不使用 auto,使用显式 for 循环
6.结构体采用32位定义
7.不要使用小函数,保持原始的函数定义
8.严格保持protobuf字段映射关系
特别注意:
1.函数中有关位操作不变,函数间的位操作一致
2.函数中的 HDDMXng::BelUsageAttrib::BelUsageAttrib 映射为
message BelUsageAttrib
{
optional uint32 flags = 1;
optional uint32 type = 2;
optional uint32 bitwidth = 3;
optional string attribname = 4;
optional sint32 defint = 5;
optional double defdouble = 6;
optional bool defbool = 7;
optional string defstring = 8;
repeated sint32 listofints = 9 [packed = true];
repeated double listofdoubles = 10 [packed = true];
repeated bool listofbools = 11 [packed = true];
repeated string listofstrings = 12;
optional uint32 precision = 13;
}
3.采用 google::protobuf::Descriptor 和 google::protobuf::Reflection 进行编程
将函数中的 _BYTE attrib_msg[24] 映射为 HDDMXng::BelUsageAttrib attrib_msg
void __fastcall HDDMBelUsageAttrib::readme_pb(HDDMBelUsageAttrib *this, std::istream *a2, HDDMDevice *a3)
{
google::protobuf::Message *v4; // rdx
unsigned int v5; // ecx
bool v6; // zf
_QWORD *v7; // r12
_QWORD *v8; // rbp
unsigned __int64 v9; // r15
_QWORD *v10; // r13
__int64 v11; // rbp
__int64 v12; // rax
__int64 v13; // rcx
__int64 v14; // rdi
unsigned __int64 v15; // rdx
int v16; // esi
__int64 v17; // rsi
void *v18; // r14
char *v19; // rbp
__int64 v20; // r13
char *v21; // r15
int v22; // eax
unsigned __int64 v23; // r12
size_t v24; // rdx
__int64 v25; // r12
unsigned __int64 v26; // rcx
size_t v27; // rdx
int v28; // eax
__int64 v29; // rax
int v30; // eax
__int64 *v31; // rax
unsigned __int64 v32; // rdx
unsigned __int64 v33; // rsi
__int64 v34; // r12
__int64 v35; // rax
__int64 v36; // r13
unsigned __int64 v37; // r14
char *v38; // rbp
__int64 v39; // rax
char *v40; // r15
__int64 v41; // r12
int v42; // edi
char v43; // si
__int64 *v44; // rdi
__int64 v45; // rax
__int64 v46; // rax
void *v47; // r13
__int64 *v48; // rbp
__int64 v49; // r14
char *v50; // r15
int v51; // eax
unsigned __int64 v52; // r12
size_t v53; // rdx
__int64 v54; // r12
unsigned __int64 v55; // rcx
size_t v56; // rdx
int v57; // eax
__int64 v58; // rax
int v59; // r13d
char **v60; // rax
unsigned __int64 v61; // rdx
unsigned __int64 v62; // rsi
unsigned __int64 v63; // r13
_QWORD *v64; // rax
_QWORD *v65; // r12
unsigned __int64 v66; // r13
char *v67; // rax
char *v68; // r14
char *v69; // rbp
int v70; // r8d
void *v71; // r14
__int64 *v72; // rbp
__int64 v73; // r13
char *v74; // r15
int v75; // eax
unsigned __int64 v76; // r12
size_t v77; // rdx
__int64 v78; // r12
unsigned __int64 v79; // rcx
size_t v80; // rdx
int v81; // eax
__int64 v82; // rax
char **v83; // rax
unsigned __int64 v84; // rdx
__int64 v85; // rsi
unsigned __int64 v86; // r13
_QWORD *v87; // rax
_QWORD *v88; // r12
unsigned __int64 v89; // r13
char *v90; // rax
char *v91; // r14
char *v92; // rbp
int v93; // r9d
__int64 v94; // rcx
void *v95; // r14
__int64 *v96; // rbp
__int64 qword48; // r13
char *v98; // r15
int v99; // eax
unsigned __int64 v100; // r12
size_t v101; // rdx
__int64 v102; // r12
unsigned __int64 v103; // rcx
size_t v104; // rdx
int v105; // eax
__int64 v106; // rax
char **qword28; // rax
unsigned __int64 v108; // rdx
__int64 v109; // rsi
signed __int64 v110; // r9
signed __int64 v111; // r9
signed __int64 v112; // r9
signed __int64 v113; // r9
int v114; // eax
int v115; // ecx
int v116; // edx
unsigned __int64 v117; // [rsp+0h] [rbp-1E8h]
unsigned __int64 v118; // [rsp+0h] [rbp-1E8h]
int v119; // [rsp+0h] [rbp-1E8h]
int v120; // [rsp+0h] [rbp-1E8h]
int v121[2]; // [rsp+8h] [rbp-1E0h]
int v122[2]; // [rsp+8h] [rbp-1E0h]
unsigned __int64 v123; // [rsp+20h] [rbp-1C8h]
unsigned __int64 v124; // [rsp+20h] [rbp-1C8h]
unsigned __int64 v125; // [rsp+20h] [rbp-1C8h]
unsigned __int64 v126; // [rsp+20h] [rbp-1C8h]
void **v127; // [rsp+40h] [rbp-1A8h] BYREF
void **v128; // [rsp+50h] [rbp-198h] BYREF
void **v129; // [rsp+60h] [rbp-188h] BYREF
void **v130; // [rsp+70h] [rbp-178h] BYREF
void *v131[2]; // [rsp+80h] [rbp-168h] BYREF
__int64 v132; // [rsp+90h] [rbp-158h] BYREF
void *v133[2]; // [rsp+A0h] [rbp-148h] BYREF
__int64 v134; // [rsp+B0h] [rbp-138h] BYREF
void *s1[2]; // [rsp+C0h] [rbp-128h] BYREF
__int64 v136; // [rsp+D0h] [rbp-118h] BYREF
void *s2[2]; // [rsp+E0h] [rbp-108h] BYREF
char v138; // [rsp+F0h] [rbp-F8h] BYREF
_BYTE attrib_msg[24]; // [rsp+100h] [rbp-E8h] BYREF
int v140; // [rsp+118h] [rbp-D0h]
__int64 v141; // [rsp+120h] [rbp-C8h]
int v142; // [rsp+130h] [rbp-B8h]
__int64 v143; // [rsp+138h] [rbp-B0h]
int v144; // [rsp+148h] [rbp-A0h]
__int64 v145; // [rsp+150h] [rbp-98h]
int v146; // [rsp+168h] [rbp-80h]
__int64 v147; // [rsp+170h] [rbp-78h]
__int64 v148; // [rsp+178h] [rbp-70h]
_QWORD *v149; // [rsp+180h] [rbp-68h]
unsigned int v150; // [rsp+188h] [rbp-60h]
char v151; // [rsp+18Ch] [rbp-5Ch]
__int16 v152; // [rsp+190h] [rbp-58h]
int v153; // [rsp+194h] [rbp-54h]
__int64 v154; // [rsp+198h] [rbp-50h]
char v155; // [rsp+1A0h] [rbp-48h]
char v156; // [rsp+1A4h] [rbp-44h]
if ( HDDMDeviceDump::useXngMarks )
std::istream::read(a2, HDDMDeviceDump::markBuffer, 14);
HDDMXng::BelUsageAttrib::BelUsageAttrib((HDDMXng::BelUsageAttrib *)attrib_msg);
HDDMDevice::readMessage((HDDMDevice *)a2, (std::istream *)attrib_msg, v4);
v5 = (4 * ((v150 >> 3) & 1))
| (2 * ((v150 >> 2) & 1)) & 0xFFFFFFBB
| ((v150 & 2) != 0)
| HIBYTE(this->attrib_flags) & 0xB8
| (((v150 >> 4) & 1) << 6);
BYTE1(this->attrib_type) = ((unsigned __int8)(v150 >> 7) << 7)
| (((v150 & 0x40) != 0) << 6) & 0x7F
| (32 * ((v150 & 0x20) != 0)) & 0x7F
| BYTE1(this->attrib_type) & 0x1F;
v6 = (attrib_msg[16] & 0x10) == 0;
HIBYTE(this->attrib_flags) = (8 * (v151 & 7)) | v5 & 0xC7;
if ( !v6 )
LOWORD(this->attrib_flags) = v152 & 0xFFF | this->attrib_flags & 0xF000;
std::string::_M_assign(&this->qword8, v148);
switch ( (HIBYTE(this->attrib_flags) >> 3) & 7 )
{
case 1:
v86 = v140;
v87 = (_QWORD *)operator new(0x18u);
v88 = v87;
*v87 = 0;
v87[1] = 0;
v87[2] = 0;
if ( !v86 )
{
v115 = v140;
v87[2] = 0;
v87[1] = 0;
this->qword28 = v87;
if ( v115 <= 0 )
goto LABEL_158;
goto LABEL_163;
}
if ( v86 > 0x3FFFFFFFFFFFFFFFLL )
std::__throw_bad_alloc();
v89 = 4 * v86;
v90 = (char *)operator new(v89);
v91 = &v90[v89];
*v88 = v90;
v92 = v90;
v88[2] = &v90[v89];
memset(v90, 0, v89);
v93 = v140;
v88[1] = v91;
this->qword28 = v88;
if ( v93 <= 0 )
goto LABEL_158;
if ( !v89 )
{
LABEL_163:
v109 = 0;
v108 = 0;
LABEL_164:
std::__throw_out_of_range_fmt(
"vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v109,
v108);
}
*(_QWORD *)v122 = 0;
v94 = 0;
v120 = 0;
while ( 2 )
{
*(_DWORD *)&v92[4 * v94] = *(_DWORD *)(v141 + 4LL * v120 + 8);
HDDMBelUsageAttrib::getValueAsString[abi:cxx11]((int)v131);
if ( !this->qword48 )
{
v98 = &this->char40;
goto LABEL_149;
}
v95 = v131[1];
v96 = (__int64 *)v131[0];
qword48 = this->qword48;
v98 = &this->char40;
do
{
while ( 1 )
{
v100 = *(_QWORD *)(qword48 + 40);
v101 = (size_t)v95;
if ( v100 <= (unsigned __int64)v95 )
v101 = *(_QWORD *)(qword48 + 40);
if ( !v101 )
break;
v99 = memcmp(*(const void **)(qword48 + 32), v96, v101);
if ( !v99 )
break;
if ( v99 < 0 )
goto LABEL_122;
LABEL_115:
v98 = (char *)qword48;
qword48 = *(_QWORD *)(qword48 + 16);
if ( !qword48 )
goto LABEL_123;
}
v102 = v100 - (_QWORD)v95;
if ( v102 > 0x7FFFFFFF || v102 >= (__int64)0xFFFFFFFF80000000LL && (int)v102 >= 0 )
goto LABEL_115;
LABEL_122:
qword48 = *(_QWORD *)(qword48 + 24);
}
while ( qword48 );
LABEL_123:
if ( v98 == &this->char40 )
goto LABEL_149;
v103 = *((_QWORD *)v98 + 5);
v104 = (size_t)v95;
if ( v103 <= (unsigned __int64)v95 )
v104 = *((_QWORD *)v98 + 5);
if ( v104
&& (v126 = *((_QWORD *)v98 + 5), v105 = memcmp(v96, *((const void **)v98 + 4), v104), v103 = v126, v105) )
{
if ( v105 >= 0 )
goto LABEL_129;
LABEL_149:
v127 = v131;
v106 = sub_12701E0(this->gap38, v98, &v127);
v96 = (__int64 *)v131[0];
}
else
{
v106 = (__int64)v98;
v112 = (signed __int64)v95 - v103;
if ( (__int64)((__int64)v95 - v103) <= 0x7FFFFFFF )
{
if ( v112 < (__int64)0xFFFFFFFF80000000LL || (int)v112 < 0 )
goto LABEL_149;
LABEL_129:
v106 = (__int64)v98;
}
}
*(_WORD *)(v106 + 64) = v120;
if ( v96 != &v132 )
operator delete(v96);
if ( ++v120 < v140 )
{
qword28 = (char **)this->qword28;
v94 = ++*(_QWORD *)v122;
v92 = *qword28;
v108 = (qword28[1] - *qword28) >> 2;
if ( v108 <= *(_QWORD *)v122 )
{
v109 = *(_QWORD *)v122;
goto LABEL_164;
}
continue;
}
break;
}
LABEL_158:
LODWORD(this->qword30) = v153;
LABEL_7:
if ( (attrib_msg[17] & 1) != 0 )
BYTE1(this->attrib_type) = (4 * (v156 & 7)) | BYTE1(this->attrib_type) & 0xE3 | 2;
HDDMXng::BelUsageAttrib::~BelUsageAttrib((HDDMXng::BelUsageAttrib *)attrib_msg);
return;
case 2:
v63 = v142;
v64 = (_QWORD *)operator new(0x18u);
v65 = v64;
*v64 = 0;
v64[1] = 0;
v64[2] = 0;
if ( v63 )
{
if ( v63 > 0x1FFFFFFFFFFFFFFFLL )
std::__throw_bad_alloc();
v66 = 8 * v63;
v67 = (char *)operator new(v66);
v68 = &v67[v66];
*v65 = v67;
v69 = v67;
v65[2] = &v67[v66];
memset(v67, 0, v66);
v70 = v142;
v65[1] = v68;
this->qword28 = v65;
if ( v70 > 0 )
{
*(_QWORD *)v121 = 0;
if ( v66 )
{
v119 = 0;
while ( 1 )
{
*(_QWORD *)&v69[8 * *(_QWORD *)v121] = *(_QWORD *)(v143 + 8LL * v119 + 8);
HDDMBelUsageAttrib::getValueAsString[abi:cxx11]((int)v133);
if ( !this->qword48 )
{
v74 = &this->char40;
goto LABEL_153;
}
v71 = v133[1];
v72 = (__int64 *)v133[0];
v73 = this->qword48;
v74 = &this->char40;
do
{
while ( 1 )
{
v76 = *(_QWORD *)(v73 + 40);
v77 = (size_t)v71;
if ( v76 <= (unsigned __int64)v71 )
v77 = *(_QWORD *)(v73 + 40);
if ( !v77 )
break;
v75 = memcmp(*(const void **)(v73 + 32), v72, v77);
if ( !v75 )
break;
if ( v75 < 0 )
goto LABEL_93;
LABEL_86:
v74 = (char *)v73;
v73 = *(_QWORD *)(v73 + 16);
if ( !v73 )
goto LABEL_94;
}
v78 = v76 - (_QWORD)v71;
if ( v78 > 0x7FFFFFFF || v78 >= (__int64)0xFFFFFFFF80000000LL && (int)v78 >= 0 )
goto LABEL_86;
LABEL_93:
v73 = *(_QWORD *)(v73 + 24);
}
while ( v73 );
LABEL_94:
if ( v74 == &this->char40 )
goto LABEL_153;
v79 = *((_QWORD *)v74 + 5);
v80 = (size_t)v71;
if ( v79 <= (unsigned __int64)v71 )
v80 = *((_QWORD *)v74 + 5);
if ( v80
&& (v125 = *((_QWORD *)v74 + 5), v81 = memcmp(v72, *((const void **)v74 + 4), v80), v79 = v125, v81) )
{
if ( v81 >= 0 )
goto LABEL_100;
LABEL_153:
v128 = v133;
v82 = sub_12701E0(this->gap38, v74, &v128);
v72 = (__int64 *)v133[0];
}
else
{
v82 = (__int64)v74;
v113 = (signed __int64)v71 - v79;
if ( (__int64)((__int64)v71 - v79) <= 0x7FFFFFFF )
{
if ( v113 < (__int64)0xFFFFFFFF80000000LL || (int)v113 < 0 )
goto LABEL_153;
LABEL_100:
v82 = (__int64)v74;
}
}
*(_WORD *)(v82 + 64) = v119;
if ( v72 != &v134 )
operator delete(v72);
if ( v142 <= ++v119 )
goto LABEL_157;
v83 = (char **)this->qword28;
++*(_QWORD *)v121;
v69 = *v83;
v84 = (v83[1] - *v83) >> 3;
if ( v84 <= *(_QWORD *)v121 )
{
v85 = *(_QWORD *)v121;
goto LABEL_167;
}
}
}
LABEL_166:
v85 = 0;
v84 = 0;
LABEL_167:
std::__throw_out_of_range_fmt(
"vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v85,
v84);
}
}
else
{
v116 = v142;
v64[2] = 0;
v64[1] = 0;
this->qword28 = v64;
if ( v116 > 0 )
goto LABEL_166;
}
LABEL_157:
this->qword30 = v154;
goto LABEL_7;
case 3:
v34 = v144;
v35 = operator new(0x28u);
*(_QWORD *)v35 = 0;
*(_DWORD *)(v35 + 8) = 0;
*(_QWORD *)(v35 + 16) = 0;
*(_DWORD *)(v35 + 24) = 0;
v36 = v35;
*(_QWORD *)(v35 + 32) = 0;
v37 = 8 * ((unsigned __int64)(v34 + 63) >> 6);
v38 = (char *)operator new(v37);
*(_QWORD *)v36 = v38;
v39 = v34 + 63;
*(_DWORD *)(v36 + 8) = 0;
*(_QWORD *)(v36 + 32) = &v38[v37];
if ( v34 >= 0 )
v39 = v34;
v40 = &v38[8 * (v39 >> 6)];
v41 = v34 % 64;
if ( v41 < 0 )
{
v41 += 64;
v40 -= 8;
}
*(_QWORD *)(v36 + 16) = v40;
*(_DWORD *)(v36 + 24) = v41;
if ( v38 != &v38[v37] )
memset(v38, 0, v37);
v42 = v144;
this->qword28 = v36;
if ( v42 <= 0 )
goto LABEL_141;
v43 = *(_BYTE *)(v145 + 8);
if ( !(v41 + 8 * (v40 - v38)) )
{
v62 = 0;
v61 = 0;
LABEL_172:
std::__throw_out_of_range_fmt(
"vector<bool>::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v62,
v61);
}
v118 = 0;
LABEL_51:
v44 = (__int64 *)&v38[8 * (v118 >> 6)];
v45 = 1LL << v118;
if ( v43 )
v46 = *v44 | v45;
else
v46 = *v44 & ~v45;
*v44 = v46;
HDDMBelUsageAttrib::getValueAsString[abi:cxx11]((int)s1);
if ( !this->qword48 )
{
v50 = &this->char40;
goto LABEL_138;
}
v47 = s1[1];
v48 = (__int64 *)s1[0];
v49 = this->qword48;
v50 = &this->char40;
while ( 1 )
{
while ( 1 )
{
v52 = *(_QWORD *)(v49 + 40);
v53 = (size_t)v47;
if ( v52 <= (unsigned __int64)v47 )
v53 = *(_QWORD *)(v49 + 40);
if ( v53 )
{
v51 = memcmp(*(const void **)(v49 + 32), v48, v53);
if ( v51 )
break;
}
v54 = v52 - (_QWORD)v47;
if ( v54 > 0x7FFFFFFF || v54 >= (__int64)0xFFFFFFFF80000000LL && (int)v54 >= 0 )
goto LABEL_57;
LABEL_64:
v49 = *(_QWORD *)(v49 + 24);
if ( !v49 )
{
LABEL_65:
if ( &this->char40 == v50 )
goto LABEL_138;
v55 = *((_QWORD *)v50 + 5);
v56 = (size_t)v47;
if ( v55 <= (unsigned __int64)v47 )
v56 = *((_QWORD *)v50 + 5);
if ( v56
&& (v124 = *((_QWORD *)v50 + 5), v57 = memcmp(v48, *((const void **)v50 + 4), v56), v55 = v124, v57) )
{
if ( v57 >= 0 )
goto LABEL_71;
LABEL_138:
v129 = s1;
v58 = sub_12701E0(this->gap38, v50, &v129);
v48 = (__int64 *)s1[0];
}
else
{
v58 = (__int64)v50;
v110 = (signed __int64)v47 - v55;
if ( (__int64)((__int64)v47 - v55) <= 0x7FFFFFFF )
{
if ( v110 < (__int64)0xFFFFFFFF80000000LL || (int)v110 < 0 )
goto LABEL_138;
LABEL_71:
v58 = (__int64)v50;
}
}
*(_WORD *)(v58 + 64) = v118;
if ( v48 != &v136 )
operator delete(v48);
v59 = v118 + 1;
if ( v144 <= (int)v118 + 1 )
{
LABEL_141:
LOBYTE(this->qword30) = v155;
goto LABEL_7;
}
++v118;
v43 = *(_BYTE *)(v145 + v59 + 8);
v60 = (char **)this->qword28;
v38 = *v60;
v61 = *((unsigned int *)v60 + 6) + 8 * (v60[2] - *v60) - *((unsigned int *)v60 + 2);
if ( v118 >= v61 )
{
v62 = v118;
goto LABEL_172;
}
goto LABEL_51;
}
}
if ( v51 < 0 )
goto LABEL_64;
LABEL_57:
v50 = (char *)v49;
v49 = *(_QWORD *)(v49 + 16);
if ( !v49 )
goto LABEL_65;
}
case 4:
case 5:
case 6:
v9 = v146;
v117 = v146;
v10 = (_QWORD *)operator new(0x18u);
*v10 = 0;
v10[1] = 0;
v10[2] = 0;
if ( v9 )
{
if ( v9 > 0x7FFFFFFFFFFFFFFLL )
std::__throw_bad_alloc();
v11 = 32 * v117;
v12 = operator new(32 * v117);
v13 = v12 + 32 * v117;
v14 = v12;
*v10 = v12;
v10[1] = v12;
v15 = v117;
v10[2] = v13;
do
{
if ( v12 )
{
*(_QWORD *)(v12 + 8) = 0;
*(_BYTE *)(v12 + 16) = 0;
*(_QWORD *)v12 = v12 + 16;
}
v12 += 32;
--v15;
}
while ( v15 );
v16 = v146;
v117 = 0;
v10[1] = v13;
this->qword28 = v10;
if ( v16 > 0 )
{
v17 = *(_QWORD *)(v147 + 8);
if ( v11 )
{
while ( 1 )
{
std::string::_M_assign(32 * v117 + v14, v17);
HDDMBelUsageAttrib::getValueAsString[abi:cxx11]((int)s2);
if ( !this->qword48 )
{
v21 = &this->char40;
goto LABEL_145;
}
v18 = s2[1];
v19 = (char *)s2[0];
v20 = this->qword48;
v21 = &this->char40;
do
{
while ( 1 )
{
v23 = *(_QWORD *)(v20 + 40);
v24 = (size_t)v18;
if ( v23 <= (unsigned __int64)v18 )
v24 = *(_QWORD *)(v20 + 40);
if ( !v24 )
break;
v22 = memcmp(*(const void **)(v20 + 32), v19, v24);
if ( !v22 )
break;
if ( v22 < 0 )
goto LABEL_29;
LABEL_22:
v21 = (char *)v20;
v20 = *(_QWORD *)(v20 + 16);
if ( !v20 )
goto LABEL_30;
}
v25 = v23 - (_QWORD)v18;
if ( v25 > 0x7FFFFFFF || v25 >= (__int64)0xFFFFFFFF80000000LL && (int)v25 >= 0 )
goto LABEL_22;
LABEL_29:
v20 = *(_QWORD *)(v20 + 24);
}
while ( v20 );
LABEL_30:
if ( v21 == &this->char40 )
goto LABEL_145;
v26 = *((_QWORD *)v21 + 5);
v27 = (size_t)v18;
if ( v26 <= (unsigned __int64)v18 )
v27 = *((_QWORD *)v21 + 5);
if ( v27
&& (v123 = *((_QWORD *)v21 + 5), v28 = memcmp(v19, *((const void **)v21 + 4), v27), v26 = v123, v28) )
{
if ( v28 >= 0 )
goto LABEL_36;
LABEL_145:
v130 = s2;
v29 = sub_12701E0(this->gap38, v21, &v130);
v19 = (char *)s2[0];
}
else
{
v29 = (__int64)v21;
v111 = (signed __int64)v18 - v26;
if ( (__int64)((__int64)v18 - v26) <= 0x7FFFFFFF )
{
if ( v111 < (__int64)0xFFFFFFFF80000000LL || (int)v111 < 0 )
goto LABEL_145;
LABEL_36:
v29 = (__int64)v21;
}
}
*(_WORD *)(v29 + 64) = v117;
if ( v19 != &v138 )
operator delete(v19);
v30 = v117 + 1;
if ( v146 <= (int)v117 + 1 )
goto LABEL_6;
++v117;
v17 = *(_QWORD *)(v147 + 8LL * v30 + 8);
v31 = (__int64 *)this->qword28;
v14 = *v31;
v32 = (v31[1] - *v31) >> 5;
if ( v32 <= v117 )
{
v33 = v117;
goto LABEL_161;
}
}
}
LABEL_160:
v33 = v117;
v32 = 0;
LABEL_161:
std::__throw_out_of_range_fmt(
"vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v33,
v32);
}
}
else
{
v114 = v146;
v10[2] = 0;
v10[1] = 0;
this->qword28 = v10;
if ( v114 > 0 )
goto LABEL_160;
}
LABEL_6:
v7 = v149;
v8 = (_QWORD *)operator new(0x20u);
*v8 = v8 + 2;
sub_1269E90(v8, *v7, v7[1] + *v7);
this->qword30 = v8;
goto LABEL_7;
default:
goto LABEL_7;
}
}
void __fastcall HDDMBelUsageAttrib::writeme_pb(HDDMBelUsageAttrib *this, std::ostream *stream)
{
unsigned __int8 attrib_flags_high; // dl
int v4; // eax
int v5; // ecx
int v6; // eax
char v7; // cl
int v8; // esi
__int16 attrib_flags; // ax
int v10; // ecx
unsigned __int16 v11; // ax
_QWORD *p_qword8; // rsi
const google::protobuf::Message *v13; // rdx
__int64 qword30_2; // xmm0_8
unsigned __int8 v15; // al
__int64 *qword28_6; // rax
__int64 v17; // r12
__int64 v18; // rax
__int64 v19; // r15
unsigned __int64 v20; // r13
int v21; // esi
google::protobuf::Arena *v22; // r14
_QWORD *v23; // rax
_QWORD *v24; // rbx
_QWORD *v25; // rdi
__int64 v26; // rax
__int64 *qword28_7; // rax
unsigned __int64 v28; // rdx
_DWORD *v29; // rdx
__int64 v30; // r12
__int64 v31; // rcx
int v32; // eax
__int64 *qword28_4; // rax
__int64 v34; // rsi
__int64 v35; // rcx
__int64 v36; // r13
unsigned __int64 v37; // rbx
__int64 *qword28_5; // rax
unsigned __int64 v39; // rdx
__int64 n4_21; // rax
bool v41; // r12
_QWORD *v42; // r15
int n4_8; // edx
google::protobuf::Arena *v44; // rdi
int n4_7; // eax
unsigned __int64 v46; // rdx
size_t n; // rdx
__int64 n4_12; // rcx
__int64 *qword28_2; // rcx
__int64 v50; // rax
__int64 v51; // rcx
__int64 v52; // r13
unsigned __int64 v53; // rbx
__int64 *qword28_3; // rdx
unsigned __int64 v55; // rdx
__int64 v56; // xmm1_8
__int64 n4_19; // rax
_QWORD *v58; // r14
int n4_4; // r12d
google::protobuf::Arena *v60; // r15
unsigned __int64 v61; // rdx
__int64 n4_18; // rax
__int64 n4_6; // r15
__int64 *qword28; // rcx
__int64 v65; // rax
__int64 v66; // rcx
__int64 v67; // r14
unsigned __int64 v68; // rbx
__int64 *qword28_1; // rdx
unsigned __int64 v70; // rdx
int v71; // r12d
__int64 n4_16; // rax
_QWORD *Aligned_1; // r15
int n4; // r13d
google::protobuf::Arena *v75; // rdi
unsigned __int64 v76; // rdx
__int64 n4_15; // rax
__int64 n4_2; // rcx
char qword30_4; // al
int qword30; // eax
__int64 qword30_6; // rsi
__int64 v82; // rax
int n4_11; // eax
_QWORD *v84; // rax
google::protobuf::internal::RepeatedPtrFieldBase *v85; // [rsp+0h] [rbp-108h]
int n4_13; // [rsp+0h] [rbp-108h]
google::protobuf::internal::RepeatedPtrFieldBase *v87; // [rsp+0h] [rbp-108h]
int n4_3; // [rsp+0h] [rbp-108h]
int n4_9; // [rsp+1Ch] [rbp-ECh]
_BYTE v91[16]; // [rsp+20h] [rbp-E8h] BYREF
int v92; // [rsp+30h] [rbp-D8h]
int n4_14; // [rsp+38h] [rbp-D0h]
int n4_1; // [rsp+3Ch] [rbp-CCh]
void *Aligned; // [rsp+40h] [rbp-C8h]
int n4_17; // [rsp+50h] [rbp-B8h]
int n4_5; // [rsp+54h] [rbp-B4h]
void *v98; // [rsp+58h] [rbp-B0h]
int n4_20; // [rsp+68h] [rbp-A0h]
int n4_10; // [rsp+6Ch] [rbp-9Ch]
void *v101; // [rsp+70h] [rbp-98h]
google::protobuf::Arena *v102; // [rsp+80h] [rbp-88h] BYREF
int v103; // [rsp+88h] [rbp-80h]
int v104; // [rsp+8Ch] [rbp-7Ch]
_DWORD *v105; // [rsp+90h] [rbp-78h]
void *p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx; // [rsp+98h] [rbp-70h] BYREF
void *p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx_1; // [rsp+A0h] [rbp-68h] BYREF
int v108; // [rsp+A8h] [rbp-60h]
int v109; // [rsp+ACh] [rbp-5Ch]
int v110; // [rsp+B0h] [rbp-58h]
int qword30_1; // [rsp+B4h] [rbp-54h]
__int64 qword30_3; // [rsp+B8h] [rbp-50h]
char qword30_5; // [rsp+C0h] [rbp-48h]
int v114; // [rsp+C4h] [rbp-44h]
if ( HDDMDeviceDump::useXngMarks )
std::ostream::write(stream, "BELUSAGEATTRIB", 14);
HDDMXng::BelUsageAttrib::BelUsageAttrib((HDDMXng::BelUsageAttrib *)v91);
attrib_flags_high = HIBYTE(this->attrib_flags);
v4 = attrib_flags_high & 1;
v5 = (_BYTE)v4 == 0 ? 4 : 6;
v6 = (v4 << 31 >> 31) & 2;
if ( (attrib_flags_high & 2) != 0 )
v6 = v5;
if ( (attrib_flags_high & 4) != 0 )
v6 |= 8u;
if ( (attrib_flags_high & 0x40) != 0 )
v6 |= 0x10u;
v7 = BYTE1(this->attrib_type);
if ( (v7 & 0x20) != 0 )
v6 |= 0x20u;
if ( (v7 & 0x40) != 0 )
v6 |= 0x40u;
v8 = v6;
if ( v7 < 0 )
{
LOBYTE(v8) = v6 | 0x80;
v6 = v8;
}
v108 = v6;
attrib_flags = this->attrib_flags;
v109 = (attrib_flags_high >> 3) & 7;
v10 = v92 | 0xC;
v11 = attrib_flags & 0xFFF;
if ( v11 )
{
v10 = v92 | 0x1C;
v110 = v11;
}
p_qword8 = &this->qword8;
v92 = v10 | 1;
if ( p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx == &google::protobuf::internal::fixed_address_empty_string[abi:cxx11] )
sub_11C39D0(&p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx, p_qword8);
else
std::string::_M_assign(p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx, p_qword8);
v13 = (const google::protobuf::Message *)HIBYTE(this->attrib_flags);
switch ( (HIBYTE(this->attrib_flags) >> 3) & 7 )
{
case 1:
qword28 = (__int64 *)this->qword28;
if ( !qword28 )
goto LABEL_102;
v65 = *qword28;
v66 = (qword28[1] - *qword28) >> 2;
if ( (int)v66 <= 0 )
goto LABEL_102;
if ( !v66 )
{
v70 = 0;
v68 = 0;
LABEL_140:
std::__throw_out_of_range_fmt(
"vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v68,
v70);
}
v67 = (unsigned int)(v66 - 1);
v68 = 0;
while ( 2 )
{
v71 = *(_DWORD *)(v65 + 4 * v68);
n4_16 = n4_14;
if ( n4_14 != n4_1 )
goto LABEL_83;
Aligned_1 = Aligned;
n4 = n4_14 + 1;
if ( Aligned )
{
v75 = *(google::protobuf::Arena **)Aligned;
if ( 2 * n4_14 >= n4 )
n4 = 2 * n4_14;
v87 = *(google::protobuf::internal::RepeatedPtrFieldBase **)Aligned;
if ( n4 < 4 )
n4 = 4;
v76 = 4LL * n4 + 8;
if ( v75 )
{
Aligned = (void *)google::protobuf::Arena::AllocateAligned(v75, (const type_info *)&`typeinfo for'char, v76);
*(_QWORD *)Aligned = v87;
n4_15 = n4_14;
n4_2 = n4_1;
n4_1 = n4;
if ( n4_14 <= 0 )
goto LABEL_95;
goto LABEL_93;
}
}
else
{
if ( 2 * n4_14 >= n4 )
n4 = 2 * n4_14;
if ( n4 < 4 )
n4 = 4;
v76 = 4LL * n4 + 8;
}
Aligned = (void *)operator new(v76);
*(_QWORD *)Aligned = 0;
n4_15 = n4_14;
n4_2 = n4_1;
n4_1 = n4;
if ( n4_14 > 0 )
{
LABEL_93:
n4_3 = n4_2;
memcpy((char *)Aligned + 8, Aligned_1 + 1, 4 * n4_15);
n4_2 = n4_3;
}
if ( !Aligned_1 )
goto LABEL_97;
LABEL_95:
if ( !*Aligned_1 )
operator delete(Aligned_1, 4 * n4_2 + 8);
LABEL_97:
n4_16 = n4_14;
LABEL_83:
n4_14 = n4_16 + 1;
*((_DWORD *)Aligned + n4_16 + 2) = v71;
if ( v68 != v67 )
{
qword28_1 = (__int64 *)this->qword28;
++v68;
v65 = *qword28_1;
v70 = (qword28_1[1] - *qword28_1) >> 2;
if ( v70 <= v68 )
goto LABEL_140;
continue;
}
break;
}
LOBYTE(v13) = HIBYTE(this->attrib_flags);
LABEL_102:
v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1);
if ( (_DWORD)v13 )
{
qword30 = this->qword30;
v92 |= 0x20u;
qword30_1 = qword30;
}
goto LABEL_25;
case 2:
qword28_2 = (__int64 *)this->qword28;
if ( !qword28_2 )
goto LABEL_21;
v50 = *qword28_2;
v51 = (qword28_2[1] - *qword28_2) >> 3;
if ( (int)v51 <= 0 )
goto LABEL_21;
if ( !v51 )
{
v55 = 0;
v53 = 0;
LABEL_138:
std::__throw_out_of_range_fmt(
"vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v53,
v55);
}
v52 = (unsigned int)(v51 - 1);
v53 = 0;
while ( 2 )
{
v56 = *(_QWORD *)(v50 + 8 * v53);
n4_19 = n4_17;
if ( n4_17 != n4_5 )
goto LABEL_64;
v58 = v98;
n4_4 = n4_17 + 1;
if ( v98 )
{
v60 = *(google::protobuf::Arena **)v98;
if ( 2 * n4_17 >= n4_4 )
n4_4 = 2 * n4_17;
if ( n4_4 < 4 )
n4_4 = 4;
v61 = 8LL * n4_4 + 8;
if ( v60 )
{
v98 = (void *)google::protobuf::Arena::AllocateAligned(
*(google::protobuf::Arena **)v98,
(const type_info *)&`typeinfo for'char,
v61);
*(_QWORD *)v98 = v60;
n4_18 = n4_17;
n4_6 = n4_5;
n4_5 = n4_4;
if ( n4_17 <= 0 )
goto LABEL_76;
goto LABEL_74;
}
}
else
{
if ( 2 * n4_17 >= n4_4 )
n4_4 = 2 * n4_17;
if ( n4_4 < 4 )
n4_4 = 4;
v61 = 8LL * n4_4 + 8;
}
v98 = (void *)operator new(v61);
*(_QWORD *)v98 = 0;
n4_18 = n4_17;
n4_6 = n4_5;
n4_5 = n4_4;
if ( n4_17 > 0 )
LABEL_74:
memcpy((char *)v98 + 8, v58 + 1, 8 * n4_18);
if ( !v58 )
goto LABEL_78;
LABEL_76:
if ( !*v58 )
operator delete(v58, 8 * n4_6 + 8);
LABEL_78:
n4_19 = n4_17;
LABEL_64:
n4_17 = n4_19 + 1;
*((_QWORD *)v98 + n4_19 + 1) = v56;
if ( v53 != v52 )
{
qword28_3 = (__int64 *)this->qword28;
++v53;
v50 = *qword28_3;
v55 = (qword28_3[1] - *qword28_3) >> 3;
if ( v53 >= v55 )
goto LABEL_138;
continue;
}
break;
}
LOBYTE(v13) = HIBYTE(this->attrib_flags);
LABEL_21:
v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1);
if ( (_DWORD)v13 )
{
qword30_2 = this->qword30;
v92 |= 0x40u;
qword30_3 = qword30_2;
}
v15 = BYTE1(this->attrib_type);
if ( (v15 & 2) != 0 )
{
v92 |= 0x100u;
v114 = (v15 >> 2) & 7;
}
goto LABEL_25;
case 3:
qword28_4 = (__int64 *)this->qword28;
if ( !qword28_4 )
goto LABEL_99;
v34 = *qword28_4;
v35 = *((unsigned int *)qword28_4 + 6) + 8 * (qword28_4[2] - *qword28_4) - *((unsigned int *)qword28_4 + 2);
if ( (int)v35 <= 0 )
goto LABEL_99;
if ( !v35 )
{
v39 = 0;
v37 = 0;
LABEL_136:
std::__throw_out_of_range_fmt(
"vector<bool>::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v37,
v39);
}
v36 = (unsigned int)(v35 - 1);
v37 = 0;
while ( 2 )
{
n4_21 = n4_20;
v41 = ((1LL << v37) & *(_QWORD *)(v34 + 8 * (v37 >> 6))) != 0;
if ( n4_20 != n4_10 )
goto LABEL_45;
v42 = v101;
n4_8 = n4_20 + 1;
if ( v101 )
{
v44 = *(google::protobuf::Arena **)v101;
if ( 2 * n4_20 >= n4_8 )
n4_8 = 2 * n4_20;
n4_7 = 4;
v85 = *(google::protobuf::internal::RepeatedPtrFieldBase **)v101;
if ( n4_8 >= 4 )
n4_7 = n4_8;
n4_9 = n4_7;
v46 = n4_7 + 8LL;
if ( v44 )
{
v101 = (void *)google::protobuf::Arena::AllocateAligned(v44, (const type_info *)&`typeinfo for'char, v46);
*(_QWORD *)v101 = v85;
n = n4_20;
n4_12 = n4_10;
n4_10 = n4_9;
if ( n4_20 <= 0 )
goto LABEL_57;
goto LABEL_55;
}
}
else
{
if ( 2 * n4_20 >= n4_8 )
n4_8 = 2 * n4_20;
n4_11 = 4;
if ( n4_8 >= 4 )
n4_11 = n4_8;
n4_9 = n4_11;
v46 = n4_11 + 8LL;
}
v84 = (_QWORD *)operator new(v46);
n = n4_20;
v101 = v84;
*v84 = 0;
n4_12 = n4_10;
n4_10 = n4_9;
if ( (int)n > 0 )
{
LABEL_55:
n4_13 = n4_12;
memcpy((char *)v101 + 8, v42 + 1, n);
n4_12 = n4_13;
}
if ( !v42 )
goto LABEL_59;
LABEL_57:
if ( !*v42 )
operator delete(v42, n4_12 + 8);
LABEL_59:
n4_21 = n4_20;
LABEL_45:
n4_20 = n4_21 + 1;
*((_BYTE *)v101 + n4_21 + 8) = v41;
if ( v36 != v37 )
{
qword28_5 = (__int64 *)this->qword28;
++v37;
v34 = *qword28_5;
v39 = *((unsigned int *)qword28_5 + 6) + 8 * (qword28_5[2] - *qword28_5) - *((unsigned int *)qword28_5 + 2);
if ( v39 <= v37 )
goto LABEL_136;
continue;
}
break;
}
LOBYTE(v13) = HIBYTE(this->attrib_flags);
LABEL_99:
v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1);
if ( (_DWORD)v13 )
{
qword30_4 = this->qword30;
v92 |= 0x80u;
qword30_5 = qword30_4;
}
LABEL_25:
HDDMDevice::writeMessage((HDDMDevice *)stream, (std::ostream *)v91, v13);
HDDMXng::BelUsageAttrib::~BelUsageAttrib((HDDMXng::BelUsageAttrib *)v91);
return;
case 4:
case 5:
case 6:
qword28_6 = (__int64 *)this->qword28;
if ( !qword28_6 )
goto LABEL_105;
v17 = *qword28_6;
v18 = (qword28_6[1] - *qword28_6) >> 5;
if ( (int)v18 <= 0 )
goto LABEL_105;
if ( !v18 )
{
v28 = 0;
v20 = 0;
LABEL_134:
std::__throw_out_of_range_fmt(
"vector::_M_range_check: __n (which is %zu) >= this->size() (which is %zu)",
v20,
v28);
}
v19 = (unsigned int)(v18 - 1);
v20 = 0;
while ( 2 )
{
v29 = v105;
v21 = v104;
v30 = 32 * v20 + v17;
if ( !v105 )
goto LABEL_108;
v31 = v103;
v32 = *v105;
if ( v103 >= *v105 )
{
v21 = v104;
if ( v32 == v104 )
{
LABEL_108:
google::protobuf::internal::RepeatedPtrFieldBase::Reserve(
(google::protobuf::internal::RepeatedPtrFieldBase *)&v102,
v21 + 1);
v29 = v105;
v32 = *v105;
}
*v29 = v32 + 1;
v22 = v102;
if ( v102 )
{
v23 = (_QWORD *)google::protobuf::Arena::AllocateAligned(
v102,
(const type_info *)&`typeinfo for'std::string,
0x20u);
v24 = v23;
if ( v23 )
{
v23[1] = 0;
*((_BYTE *)v23 + 16) = 0;
*v23 = v23 + 2;
}
google::protobuf::Arena::AddListNode(
v22,
v23,
(void (*)(void *))google::protobuf::internal::arena_destruct_object<std::string>);
v25 = v24;
}
else
{
v82 = operator new(0x20u);
*(_QWORD *)(v82 + 8) = 0;
*(_BYTE *)(v82 + 16) = 0;
v25 = (_QWORD *)v82;
*(_QWORD *)v82 = v82 + 16;
}
v26 = v103++;
*(_QWORD *)&v105[2 * v26 + 2] = v25;
}
else
{
++v103;
v25 = *(_QWORD **)&v105[2 * v31 + 2];
}
std::string::_M_assign(v25, v30);
if ( v20 != v19 )
{
qword28_7 = (__int64 *)this->qword28;
++v20;
v17 = *qword28_7;
v28 = (qword28_7[1] - *qword28_7) >> 5;
if ( v28 <= v20 )
goto LABEL_134;
continue;
}
break;
}
LOBYTE(v13) = HIBYTE(this->attrib_flags);
LABEL_105:
v13 = (const google::protobuf::Message *)((unsigned __int8)v13 & 1);
if ( (_DWORD)v13 )
{
v92 |= 2u;
qword30_6 = this->qword30;
if ( p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx_1 == &google::protobuf::internal::fixed_address_empty_string[abi:cxx11] )
sub_11C39D0(&p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx_1, qword30_6);
else
std::string::_M_assign(p__ZN6google8protobuf8internal26fixed_address_empty_stringB5cxx_1, qword30_6);
}
goto LABEL_25;
default:
goto LABEL_25;
}
}
void __fastcall HDDMBelUsageAttrib::print(HDDMBelUsageAttrib *this, std::ostream *stream, std::string *filename)
{
char attrib_flags_high; // al
char v6; // al
char n7; // al
const char *unknown; // r15
__int64 v9; // r14
size_t v10; // rax
__int64 v11; // r14
__int64 v12; // r14
size_t v13; // rax
__int64 v14; // rax
char v15; // al
unsigned __int16 v16; // r14
unsigned __int8 v17; // si
char n2; // al
_QWORD *qword28_4; // rdx
_QWORD *v20; // rax
_QWORD *v21; // r13
_QWORD *qword30_1; // rbx
char *_[MISMATCH]_2; // rax
char *_[MISMATCH]_1; // rax
char *_[MISMATCH]; // rax
__int64 v26; // rax
__int64 v27; // rax
__int64 v28; // rax
__int64 v29; // rax
double **qword28_5; // rdx
double *v31; // rax
double *v32; // r13
unsigned int **qword28_3; // rdx
unsigned int *v34; // rax
unsigned int *v35; // r13
unsigned int qword30; // ebx
__int64 qword28; // rax
_QWORD *v38; // r14
unsigned int n63; // r13d
_QWORD *v40; // rcx
int n63_1; // edx
__int64 qword28_1; // rax
__int64 qword28_2; // rax
unsigned int qword30_low; // ebx
char *s; // [rsp+8h] [rbp-60h]
char *sa; // [rsp+8h] [rbp-60h]
void *v47[2]; // [rsp+10h] [rbp-58h] BYREF
_BYTE v48[72]; // [rsp+20h] [rbp-48h] BYREF
v47[0] = v48;
sub_1269E90(v47, "", (__int64)"");
if ( (this->attrib_flags & 0xFFF) != 0 )
std::string::append(v47, "W");
attrib_flags_high = HIBYTE(this->attrib_flags);
if ( (attrib_flags_high & 4) != 0 )
{
std::string::append(v47, "G");
attrib_flags_high = HIBYTE(this->attrib_flags);
}
if ( (attrib_flags_high & 0x40) != 0 )
std::string::append(v47, "E");
v6 = BYTE1(this->attrib_type);
if ( (v6 & 2) != 0 )
{
std::string::append(v47, "P");
v6 = BYTE1(this->attrib_type);
}
if ( (v6 & 0x40) != 0 )
{
std::string::append(v47, "H");
if ( (this->attrib_type & 0x8000) == 0 )
goto LABEL_11;
}
else if ( v6 >= 0 )
{
LABEL_11:
n7 = (HIBYTE(this->attrib_flags) >> 3) & 7;
goto LABEL_12;
}
std::string::append(v47, "B");
n7 = (HIBYTE(this->attrib_flags) >> 3) & 7;
if ( n7 == 7 )
{
LABEL_15:
unknown = "unknown";
s = "";
goto LABEL_17;
}
LABEL_12:
switch ( n7 )
{
case 0:
unknown = "unsigned";
s = "";
break;
case 1:
unknown = "int";
s = "";
break;
case 2:
_[MISMATCH] = "";
unknown = "double";
if ( (*(_QWORD *)&this->attrib_flags & 0xC00000000FFFLL) != 0 )
_[MISMATCH] = " [MISMATCH]";
s = _[MISMATCH];
break;
case 3:
unknown = "bool";
s = "";
break;
case 4:
unknown = "string";
s = "";
break;
case 5:
_[MISMATCH]_1 = "";
unknown = "bithex";
if ( (this->attrib_type & 0x8200) != 0 )
_[MISMATCH]_1 = " [MISMATCH]";
s = _[MISMATCH]_1;
break;
case 6:
_[MISMATCH]_2 = "";
unknown = "bitbinary";
if ( (this->attrib_type & 0x4200) != 0 )
_[MISMATCH]_2 = " [MISMATCH]";
s = _[MISMATCH]_2;
break;
default:
goto LABEL_15;
}
LABEL_17:
v9 = std::__ostream_insert<char,std::char_traits<char>>(stream, *(_QWORD *)filename, *((_QWORD *)filename + 1));
v10 = strlen(unknown);
std::__ostream_insert<char,std::char_traits<char>>(v9, unknown, v10);
std::__ostream_insert<char,std::char_traits<char>>(v9, "[", 1);
v11 = std::__ostream_insert<char,std::char_traits<char>>(v9, v47[0], v47[1]);
std::__ostream_insert<char,std::char_traits<char>>(v11, "] ", 2);
v12 = std::__ostream_insert<char,std::char_traits<char>>(v11, this->qword8, this->qword10);
v13 = strlen(s);
std::__ostream_insert<char,std::char_traits<char>>(v12, s, v13);
std::endl<char,std::char_traits<char>>(v12);
v14 = std::__ostream_insert<char,std::char_traits<char>>(stream, *(_QWORD *)filename, *((_QWORD *)filename + 1));
std::__ostream_insert<char,std::char_traits<char>>(v14, " ", 3);
v15 = 0;
if ( (this->attrib_flags & 0x2000000) != 0 )
{
std::__ostream_insert<char,std::char_traits<char>>(stream, " (HIDDEN=true)", 14);
v15 = 1;
}
v16 = this->attrib_flags & 0xFFF;
if ( v16 )
{
std::__ostream_insert<char,std::char_traits<char>>(stream, " (Width=", 8);
v26 = std::ostream::_M_insert<unsigned long>(stream, v16);
std::__ostream_insert<char,std::char_traits<char>>(v26, ")", 1);
v17 = BYTE1(this->attrib_type);
if ( (v17 & 2) == 0 )
goto LABEL_49;
goto LABEL_48;
}
v17 = BYTE1(this->attrib_type);
if ( (v17 & 2) != 0 )
{
LABEL_48:
std::__ostream_insert<char,std::char_traits<char>>(stream, " (percision=", 12);
v27 = std::ostream::_M_insert<unsigned long>(stream, (v17 >> 2) & 7);
std::operator<<<std::char_traits<char>>(v27, ")");
goto LABEL_49;
}
if ( !v15 )
{
n2 = (HIBYTE(this->attrib_flags) >> 3) & 7;
if ( n2 != 2 )
goto LABEL_23;
goto LABEL_50;
}
LABEL_49:
v28 = std::endl<char,std::char_traits<char>>(stream);
v29 = std::__ostream_insert<char,std::char_traits<char>>(v28, *(_QWORD *)filename, *((_QWORD *)filename + 1));
std::operator<<<std::char_traits<char>>(v29, " ");
n2 = (HIBYTE(this->attrib_flags) >> 3) & 7;
if ( n2 != 2 )
{
LABEL_23:
if ( n2 == 3 )
{
std::operator<<<std::char_traits<char>>(stream, " ( ");
qword28 = this->qword28;
if ( qword28 )
{
v38 = *(_QWORD **)qword28;
n63 = *(_DWORD *)(qword28 + 8);
v40 = *(_QWORD **)(qword28 + 16);
n63_1 = *(_DWORD *)(qword28 + 24);
while ( n63 != n63_1 || v38 != v40 )
{
while ( 1 )
{
std::ostream::_M_insert<bool>(stream, ((1LL << n63) & *v38) != 0);
qword28_1 = this->qword28;
v40 = *(_QWORD **)(qword28_1 + 16);
n63_1 = *(_DWORD *)(qword28_1 + 24);
if ( v40 != &v38[(n63 + 1LL) >> 6] || n63_1 != (((_BYTE)n63 + 1) & 0x3F) )
{
std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2);
qword28_2 = this->qword28;
n63_1 = *(_DWORD *)(qword28_2 + 24);
v40 = *(_QWORD **)(qword28_2 + 16);
}
if ( n63 == 63 )
break;
if ( ++n63 == n63_1 && v38 == v40 )
goto LABEL_74;
}
++v38;
n63 = 0;
}
}
LABEL_74:
if ( (this->attrib_flags & 0x1000000) != 0 )
{
qword30_low = LOBYTE(this->qword30);
std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9);
std::ostream::_M_insert<bool>(stream, qword30_low);
}
}
else if ( n2 == 1 )
{
std::operator<<<std::char_traits<char>>(stream, " ( ");
qword28_3 = (unsigned int **)this->qword28;
if ( qword28_3 )
{
v34 = qword28_3[1];
v35 = *qword28_3;
while ( v35 != v34 )
{
while ( 1 )
{
std::ostream::operator<<(stream, *v35++);
v34 = *(unsigned int **)(this->qword28 + 8LL);
if ( v35 == v34 )
break;
std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2);
if ( v35 == *(unsigned int **)(this->qword28 + 8LL) )
goto LABEL_62;
}
}
}
LABEL_62:
if ( (this->attrib_flags & 0x1000000) != 0 )
{
qword30 = this->qword30;
std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9);
std::ostream::operator<<(stream, qword30);
}
}
else
{
std::operator<<<std::char_traits<char>>(stream, " ( ");
qword28_4 = (_QWORD *)this->qword28;
if ( qword28_4 )
{
v20 = (_QWORD *)qword28_4[1];
v21 = (_QWORD *)*qword28_4;
while ( v21 != v20 )
{
while ( 1 )
{
std::__ostream_insert<char,std::char_traits<char>>(stream, *v21, v21[1]);
v21 += 4;
v20 = *(_QWORD **)(this->qword28 + 8LL);
if ( v21 == v20 )
break;
std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2);
if ( v21 == *(_QWORD **)(this->qword28 + 8LL) )
goto LABEL_30;
}
}
}
LABEL_30:
if ( (this->attrib_flags & 0x1000000) != 0 )
{
qword30_1 = (_QWORD *)this->qword30;
std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9);
std::__ostream_insert<char,std::char_traits<char>>(stream, *qword30_1, qword30_1[1]);
}
}
goto LABEL_32;
}
LABEL_50:
std::operator<<<std::char_traits<char>>(stream, " ( ");
qword28_5 = (double **)this->qword28;
if ( qword28_5 )
{
v31 = qword28_5[1];
v32 = *qword28_5;
while ( v32 != v31 )
{
while ( 1 )
{
std::ostream::_M_insert<double>(stream, *v32++);
v31 = *(double **)(this->qword28 + 8LL);
if ( v32 == v31 )
break;
std::__ostream_insert<char,std::char_traits<char>>(stream, ", ", 2);
if ( v32 == *(double **)(this->qword28 + 8LL) )
goto LABEL_55;
}
}
}
LABEL_55:
if ( (this->attrib_flags & 0x1000000) != 0 )
{
sa = (char *)this->qword30;
std::__ostream_insert<char,std::char_traits<char>>(stream, " default=", 9);
std::ostream::_M_insert<double>(stream, *(double *)&sa);
}
LABEL_32:
std::operator<<<std::char_traits<char>>(stream, " ) ");
if ( v47[0] != v48 )
operator delete(v47[0]);
}
void __fastcall HDDMBelUsageAttrib::HDDMBelUsageAttrib(HDDMBelUsageAttrib *this)
{
__int16 word4; // ax
word4 = this->attrib_type;
this->attrib_flags &= 0xF000u;
this->? &= 0xF0u;
this->qword10 = 0;
*(_DWORD *)&this->attrib_flags |= 0xFFF000u;
this->char18 = 0;
this->? = 0;
this->attrib_type = word4 & 0xFE00;
HIBYTE(this->attrib_type) = 0;
*(_WORD *)&this->? |= 0xFFF0u;
this->qword8 = &this->char18;
*(_DWORD *)&this->char40 = 0;
this->qword48 = 0;
this->qword60 = 0;
this->qword50 = &this->char40;
this->qword58 = &this->char40;
this->qword30 = 0;
this->qword28 = 0;
}
void __fastcall HDDMBelUsageAttrib::~HDDMBelUsageAttrib(HDDMBelUsageAttrib *this)
{
char v2; // al
void ***qword28_2; // r12
void **v4; // rbp
void **v5; // rbx
void **qword30; // rbx
void **qword28_1; // rbx
__int64 qword48; // rsi
_BYTE *v9; // rdi
char *p_char18; // r14
char *p_char18_1; // rdi
__int64 v12; // rax
_QWORD *v13; // rdx
_QWORD *v14; // r13
_QWORD *v15; // rbp
unsigned __int64 v16; // r10
const char *v17; // rsi
_QWORD *v18; // r8
_QWORD *v19; // rbx
unsigned __int64 v20; // rcx
_QWORD *_ZZN3hdi8tcltasks12native_cacheIP18HDDMBelUsageAttribE12t2n_ins; // r15
unsigned __int64 v22; // rsi
__int64 v23; // r10
unsigned __int64 v24; // rtt
__int64 v25; // r11
unsigned __int64 v26; // r9
__int64 **v27; // rdx
__int64 *i; // rcx
__int64 *v29; // rdi
__int64 v30; // r8
unsigned __int64 v31; // rdx
unsigned __int64 v32; // rdx
void **qword28; // rbx
__int64 v34; // [rsp+8h] [rbp-50h]
HDDMBelUsageAttrib *p_this; // [rsp+18h] [rbp-40h] BYREF
v2 = (HIBYTE(this->attrib_flags) >> 3) & 7;
switch ( v2 )
{
case 2:
goto LABEL_17;
case 3:
qword28 = (void **)this->qword28;
if ( qword28 )
{
if ( *qword28 )
operator delete(*qword28);
operator delete(qword28, 0x28u);
}
goto LABEL_21;
case 1:
LABEL_17:
qword28_1 = (void **)this->qword28;
if ( qword28_1 )
{
if ( *qword28_1 )
operator delete(*qword28_1);
operator delete(qword28_1, 0x18u);
}
LABEL_21:
this->qword28 = 0;
goto LABEL_22;
}
qword28_2 = (void ***)this->qword28;
if ( qword28_2 )
{
v4 = qword28_2[1];
v5 = *qword28_2;
if ( v4 != *qword28_2 )
{
do
{
if ( *v5 != v5 + 2 )
operator delete(*v5);
v5 += 4;
}
while ( v4 != v5 );
v5 = *qword28_2;
}
if ( v5 )
operator delete(v5);
operator delete(qword28_2, 0x18u);
this->qword28 = 0;
}
qword30 = (void **)this->qword30;
if ( qword30 )
{
if ( *qword30 != qword30 + 2 )
operator delete(*qword30);
operator delete(qword30, 0x20u);
this->qword30 = 0;
}
LABEL_22:
p_this = this;
if ( *(_BYTE *)hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::observers() )
{
if ( !(_BYTE)`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache
&& __cxa_guard_acquire(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache) )
{
hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache = hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::get_n2t_cache();
__cxa_guard_release(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache);
}
v12 = std::_Hashtable<HDDMBelUsageAttrib const*,std::pair<HDDMBelUsageAttrib const* const,Tcl_Obj *>,std::allocator<std::pair<HDDMBelUsageAttrib const* const,Tcl_Obj *>>,std::__detail::_Select1st,std::equal_to<HDDMBelUsageAttrib const*>,boost::hash<HDDMBelUsageAttrib const*>,std::__detail::_Mod_range_hashing,std::__detail::_Default_ranged_hash,std::__detail::_Prime_rehash_policy,std::__detail::_Hashtable_traits<true,false,false>>::equal_range(
hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache,
&p_this);
v34 = v12;
v14 = v13;
if ( (_QWORD *)v12 != v13 )
{
v15 = (_QWORD *)v12;
while ( 1 )
{
if ( !(_BYTE)`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache
&& __cxa_guard_acquire(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache) )
{
hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache = (_QWORD *)hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::get_t2n_cache();
__cxa_guard_release(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache);
}
v16 = v15[2];
v17 = (const char *)hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache[1];
v18 = *(_QWORD **)(*hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache
+ 8 * ((v16 + (v16 >> 3)) % (unsigned __int64)v17));
if ( !v18 )
break;
v19 = (_QWORD *)*v18;
v20 = *(_QWORD *)(*v18 + 24LL);
while ( v16 + (v15[2] >> 3) != v20 || v16 != v19[1] )
{
if ( *v19 )
{
v20 = *(_QWORD *)(*v19 + 24LL);
v18 = v19;
v19 = (_QWORD *)*v19;
if ( (v16 + (v15[2] >> 3)) % (unsigned __int64)v17 == v20 % (unsigned __int64)v17 )
continue;
}
goto LABEL_35;
}
if ( !v18 || !v19 )
break;
if ( (_BYTE)`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache )
goto LABEL_39;
if ( __cxa_guard_acquire(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache) )
goto LABEL_37;
if ( (_BYTE)`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache )
goto LABEL_40;
LABEL_56:
if ( __cxa_guard_acquire(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache) )
{
hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache = (_QWORD *)hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::get_t2n_cache();
__cxa_guard_release(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache);
}
LABEL_40:
_ZZN3hdi8tcltasks12native_cacheIP18HDDMBelUsageAttribE12t2n_ins = hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache;
v22 = hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache[1];
v23 = *hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache;
v24 = v19[3];
v25 = 8 * (v24 % v22);
v26 = v24 % v22;
v27 = (__int64 **)(*hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache + v25);
for ( i = *v27; ; i = (__int64 *)*i )
{
v29 = (__int64 *)*i;
if ( (_QWORD *)*i == v19 )
break;
}
v30 = *v19;
if ( *v27 != i )
{
if ( v30 )
{
v31 = *(_QWORD *)(v30 + 24) % v22;
if ( v26 != v31 )
{
*(_QWORD *)(v23 + 8 * v31) = i;
v30 = *v19;
}
}
goto LABEL_47;
}
if ( !v30 )
{
if ( i == hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache + 2 )
LABEL_65:
_ZZN3hdi8tcltasks12native_cacheIP18HDDMBelUsageAttribE12t2n_ins[2] = v30;
LABEL_63:
*v27 = 0;
v30 = *v29;
goto LABEL_47;
}
v32 = *(_QWORD *)(v30 + 24) % v22;
if ( v26 != v32 )
{
*(_QWORD *)(v23 + 8 * v32) = i;
v27 = (__int64 **)(*_ZZN3hdi8tcltasks12native_cacheIP18HDDMBelUsageAttribE12t2n_ins + v25);
if ( *v27 == _ZZN3hdi8tcltasks12native_cacheIP18HDDMBelUsageAttribE12t2n_ins + 2 )
goto LABEL_65;
goto LABEL_63;
}
LABEL_47:
*i = v30;
operator delete(v29);
--_ZZN3hdi8tcltasks12native_cacheIP18HDDMBelUsageAttribE12t2n_ins[3];
hdi::tcltasks::native_cache_base::mark_invalid(v15[2]);
hdi::tcltasks::native_cache_base::decr_refcount(v15[2]);
v15 = (_QWORD *)*v15;
if ( v14 == v15 )
{
if ( !(_BYTE)`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache
&& __cxa_guard_acquire(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache) )
{
hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache = hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::get_n2t_cache();
__cxa_guard_release(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache);
}
std::_Hashtable<HDDMBelUsageAttrib const*,std::pair<HDDMBelUsageAttrib const* const,Tcl_Obj *>,std::allocator<std::pair<HDDMBelUsageAttrib const* const,Tcl_Obj *>>,std::__detail::_Select1st,std::equal_to<HDDMBelUsageAttrib const*>,boost::hash<HDDMBelUsageAttrib const*>,std::__detail::_Mod_range_hashing,std::__detail::_Default_ranged_hash,std::__detail::_Prime_rehash_policy,std::__detail::_Hashtable_traits<true,false,false>>::erase(
hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::n2t_instance(void)::cache,
v34,
v14);
goto LABEL_23;
}
}
LABEL_35:
if ( !(_BYTE)`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache )
{
v19 = 0;
if ( __cxa_guard_acquire(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache) )
{
LABEL_37:
hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache = (_QWORD *)hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::get_t2n_cache();
__cxa_guard_release(&`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache);
if ( v19 )
goto LABEL_39;
}
}
hdi::tcltasks::native_cache_base::error((hdi::tcltasks::native_cache_base *)"native_cache<> corrupt", v17);
v19 = 0;
LABEL_39:
if ( (_BYTE)`guard variable for'hdi::tcltasks::native_cache<HDDMBelUsageAttrib *>::t2n_instance(void)::cache )
goto LABEL_40;
goto LABEL_56;
}
}
LABEL_23:
qword48 = this->qword48;
v9 = this->gap38;
p_char18 = &this->char18;
std::_Rb_tree<std::string,std::pair<std::string const,unsigned short>,std::_Select1st<std::pair<std::string const,unsigned short>>,std::less<std::string>,std::allocator<std::pair<std::string const,unsigned short>>>::_M_erase(
v9,
qword48);
p_char18_1 = (char *)*((_QWORD *)p_char18 - 2);
if ( p_char18_1 != p_char18 )
operator delete(p_char18_1);
}