server-re/decomp/Agent_Release_x64/full/functions/0x14000a630.c
2026-10-14 16:45:19 -04:00

113 lines
3.9 KiB
C

/* Agent_Release_x64.exe sha256 6f2be7b8eb799ba51b359d1958720aac5baee5b7ee0d1d36684d3cbd72d45469
* Ghidra 12.1.2 decompiler output for 0x14000a630 FUN_14000a630
* Pseudocode, not original source. */
wchar_t FUN_14000a630(basic_streambuf<wchar_t,std::char_traits<wchar_t>_> *param_1,wchar_t param_2)
{
void *pvVar1;
basic_streambuf<wchar_t,std::char_traits<wchar_t>_> bVar2;
int iVar3;
void *_Src;
longlong lVar4;
longlong lVar5;
wchar_t *pwVar6;
ulonglong uVar7;
void *pvVar8;
undefined4 uVar9;
ulonglong uVar10;
if (((byte)param_1[0x78] & 8) != 0) {
uVar7 = **(ulonglong **)(param_1 + 0x48);
if ((uVar7 != 0) && (uVar10 = *(ulonglong *)(param_1 + 0x70), uVar7 < uVar10)) {
iVar3 = **(int **)(param_1 + 0x60);
**(ulonglong **)(param_1 + 0x48) = uVar10;
**(undefined4 **)(param_1 + 0x60) =
(int)((longlong)((uVar7 + (longlong)iVar3 * 2) - uVar10) >> 1);
}
}
if (param_2 == L'\xffff') {
return L'\0';
}
uVar7 = **(ulonglong **)(param_1 + 0x48);
if ((uVar7 != 0) && (uVar7 < uVar7 + (longlong)**(int **)(param_1 + 0x60) * 2)) {
pwVar6 = std::basic_streambuf<wchar_t,std::char_traits<wchar_t>_>::_Pninc(param_1);
*pwVar6 = param_2;
return param_2;
}
if (((byte)param_1[0x78] & 2) != 0) {
return L'\xffff';
}
uVar10 = 0;
if (uVar7 != 0) {
uVar10 = (longlong)
(((longlong)**(int **)(param_1 + 0x60) * 2 - **(longlong **)(param_1 + 0x20)) + uVar7)
>> 1;
}
uVar7 = uVar10 >> 1;
if (uVar7 < 0x20) {
uVar7 = 0x20;
}
else if (uVar7 == 0) {
return L'\xffff';
}
do {
if (uVar10 <= 0x7fffffff - uVar7) break;
uVar7 = uVar7 >> 1;
} while (uVar7 != 0);
if (uVar7 == 0) {
return L'\xffff';
}
uVar7 = uVar7 + uVar10;
pvVar8 = FUN_140001a50(uVar7);
_Src = (void *)**(undefined8 **)(param_1 + 0x20);
uVar9 = (undefined4)((longlong)pvVar8 >> 1);
if ((uVar10 == 0) || (memcpy(pvVar8,_Src,uVar10 * 2), uVar10 == 0)) {
*(void **)(param_1 + 0x70) = pvVar8;
**(undefined8 **)(param_1 + 0x28) = pvVar8;
**(undefined8 **)(param_1 + 0x48) = pvVar8;
**(undefined4 **)(param_1 + 0x60) = (int)((longlong)(uVar7 * 2) >> 1);
bVar2 = param_1[0x78];
**(undefined8 **)(param_1 + 0x20) = pvVar8;
if (((byte)bVar2 & 4) == 0) {
**(undefined8 **)(param_1 + 0x40) = pvVar8;
**(undefined4 **)(param_1 + 0x58) = 1;
}
else {
**(undefined8 **)(param_1 + 0x40) = 0;
**(undefined4 **)(param_1 + 0x58) = uVar9;
}
}
else {
*(void **)(param_1 + 0x70) =
(void *)((longlong)pvVar8 + (*(longlong *)(param_1 + 0x70) - (longlong)_Src >> 1) * 2);
pvVar1 = (void *)((longlong)pvVar8 + (**(longlong **)(param_1 + 0x48) - (longlong)_Src >> 1) * 2
);
**(longlong **)(param_1 + 0x28) =
(longlong)((longlong)pvVar8 + (**(longlong **)(param_1 + 0x28) - (longlong)_Src >> 1) * 2);
**(longlong **)(param_1 + 0x48) = (longlong)pvVar1;
**(undefined4 **)(param_1 + 0x60) =
(int)((longlong)((uVar7 * 2 - (longlong)pvVar1) + (longlong)pvVar8) >> 1);
if (((byte)param_1[0x78] & 4) == 0) {
lVar4 = **(longlong **)(param_1 + 0x48);
lVar5 = **(longlong **)(param_1 + 0x40);
**(undefined8 **)(param_1 + 0x20) = pvVar8;
pvVar8 = (void *)((longlong)pvVar8 + (lVar5 - (longlong)_Src >> 1) * 2);
**(longlong **)(param_1 + 0x40) = (longlong)pvVar8;
**(undefined4 **)(param_1 + 0x58) = (int)((lVar4 - (longlong)pvVar8) + 2 >> 1);
}
else {
**(undefined8 **)(param_1 + 0x20) = pvVar8;
**(undefined8 **)(param_1 + 0x40) = 0;
**(undefined4 **)(param_1 + 0x58) = uVar9;
}
}
if (((byte)param_1[0x78] & 1) != 0) {
operator_delete(_Src);
}
*(uint *)(param_1 + 0x78) = *(uint *)(param_1 + 0x78) | 1;
pwVar6 = std::basic_streambuf<wchar_t,std::char_traits<wchar_t>_>::_Pninc(param_1);
*pwVar6 = param_2;
return param_2;
}