double FUN_0048a9e0(char *param_1,undefined4 *param_2,char *param_3)
{
bool bVar1;
undefined4 *puVar2;
int iVar3;
char *pcVar4;
int iVar5;
int iVar6;
uint uVar7;
uint uVar8;
char *pcVar9;
ushort uVar10;
uint uVar11;
undefined4 uVar12;
char *pcVar13;
double dVar14;
double dVar15;
pcVar13 = param_1;
while (iVar3 = (int)*pcVar13, (*(ushort *)(PTR_DAT_004b7614 + iVar3 * 2) & 0x20) != 0) {
pcVar13 = pcVar13 + 1;
}
if (iVar3 == 0x2b) {
bVar1 = false;
}
else {
bVar1 = false;
if (iVar3 != 0x2d) goto LAB_0048aa60;
bVar1 = true;
}
pcVar13 = pcVar13 + 1;
iVar3 = (int)*pcVar13;
LAB_0048aa60:
if ((iVar3 == 0x30) && (pcVar9 = pcVar13 + 1, (byte)(pcVar13[1] | 0x20U) == 0x78)) {
pcVar13 = pcVar13 + 2;
dVar15 = 16.0;
uVar11 = 0x70;
uVar10 = 0x10;
}
else {
uVar11 = 0x65;
dVar15 = 10.0;
pcVar9 = (char *)0x0;
uVar10 = 8;
}
iVar3 = -1;
dVar14 = 0.0;
pcVar4 = (char *)0x0;
do {
while( true ) {
uVar7 = (uint)((ulonglong)dVar14 >> 0x20);
uVar12 = SUB84(dVar14,0);
uVar8 = (uint)*pcVar13;
if ((*(ushort *)(PTR_DAT_004b7614 + uVar8 * 2) & uVar10) == 0) break;
if (iVar3 == -1) {
iVar3 = 0;
LAB_0048aae4:
if (uVar8 != 0x30) goto LAB_0048aaf0;
pcVar13 = pcVar13 + 1;
}
else {
if (iVar3 == 0) goto LAB_0048aae4;
LAB_0048aaf0:
iVar3 = iVar3 + 1;
if (iVar3 < 0x12) {
if ((*(ushort *)(PTR_DAT_004b7614 + uVar8 * 2) & 8) == 0) {
iVar6 = (uVar8 | 0x20) - 0x57;
}
else {
iVar6 = uVar8 - 0x30;
}
dVar14 = dVar14 * dVar15 + (double)iVar6;
pcVar13 = pcVar13 + 1;
}
else {
pcVar13 = pcVar13 + 1;
}
}
}
if ((uVar8 != 0x2e) || (pcVar4 != (char *)0x0)) break;
pcVar4 = pcVar13 + 1;
pcVar13 = pcVar4;
} while( true );
if (iVar3 == -1) {
if ((pcVar9 == (char *)0x0) && (pcVar9 = param_1, pcVar4 == (char *)0x0)) {
iVar3 = 0;
do {
iVar6 = 0;
pcVar4 = pcVar13;
while( true ) {
iVar5 = iVar6 + iVar3 + 1;
iVar6 = iVar6 + 1;
if (*(short *)(PTR_DAT_004b7844 + *pcVar4 * 2) != (short)(char)(&DAT_00499ad0)[iVar5])
break;
pcVar4 = pcVar13 + iVar6;
if ((&DAT_00499ad0)[iVar6 + iVar3 + 1] == '\0') {
uVar11 = (uint)((ulonglong)((double)iVar3 / 0.0) >> 0x20);
if (bVar1) {
uVar11 = uVar11 ^ 0x80000000;
}
dVar14 = (double)CONCAT44(uVar11,SUB84((double)iVar3 / 0.0,0));
pcVar9 = pcVar13 + (char)(&DAT_00499ad0)[iVar3] + -2;
goto LAB_0048add8;
}
}
iVar3 = iVar3 + (char)(&DAT_00499ad0)[iVar3];
} while ((&DAT_00499ad0)[iVar3] != '\0');
}
goto LAB_0048add8;
}
if (0x11 < iVar3) {
param_3 = param_3 + iVar3 + -0x11;
}
if (pcVar4 != (char *)0x0) {
param_3 = pcVar4 + ((int)param_3 - (int)pcVar13) //possible issue identified - semgrep
}
if (pcVar9 != (char *)0x0) {
param_3 = (char *)((int)param_3 << 2);
dVar15 = 2.0;
}
if (bVar1) {
uVar7 = uVar7 ^ 0x80000000;
}
dVar14 = (double)CONCAT44(uVar7,uVar12);
pcVar9 = pcVar13;
if ((uVar8 | 0x20) == uVar11) {
pcVar4 = pcVar13 + 1;
if (pcVar13[1] == '+') {
iVar3 = 1;
LAB_0048acd4:
pcVar4 = pcVar13 + 2;
}
else {
iVar3 = 1;
if (pcVar13[1] == '-') {
iVar3 = -1;
goto LAB_0048acd4;
}
}
iVar6 = 0;
pcVar13 = pcVar4;
while( true ) {
if ((*(ushort *)(PTR_DAT_004b7614 + *pcVar13 * 2) & 8) == 0) break;
if (iVar6 < 0x155) {
iVar6 = iVar6 * 10 + -0x30 + (int)*pcVar13;
}
pcVar13 = pcVar13 + 1;
}
param_3 = param_3 + iVar6 * iVar3;
if (pcVar13 != pcVar4) {
pcVar9 = pcVar13;
}
}
if ((double)CONCAT44(uVar7,uVar12) != 0.0) {
dVar14 = (double)CONCAT44(uVar7,uVar12);
for (uVar11 = ((int)param_3 >> 0x1f ^ (uint)param_3) - ((int)param_3 >> 0x1f); uVar11 != 0;
uVar11 = (int)uVar11 >> 1) {
if ((uVar11 & 1) != 0) {
if ((int)param_3 < 0) {
dVar14 = dVar14 / dVar15;
}
else {
dVar14 = dVar14 * dVar15;
}
}
dVar15 = dVar15 * dVar15;
}
if (dVar14 == dVar14 * 0.25) {
puVar2 = (undefined4 *)FUN_0047f6f0();
*puVar2 = 0x22;
}
}
LAB_0048add8:
if (param_2 != (undefined4 *)0x0) {
*param_2 = pcVar9;
}
return dVar14;
}