// // fp_format_a from 0x1801375d4 to 0x180137954 (896 bytes) // // 3 xrefs: // > sub_180137FE0 @ 0x1801382e6 // > @ 0x1802035e4 // > @ 0x1802035f0 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // __int64 __fastcall fp_format_a( __int64 *a1, char *a2, unsigned __int64 a3, __int64 a4, __int64 a5, int Size, char a7, int a8, struct __crt_locale_pointers *a9, unsigned int a10) { char *v10; // rbx int v12; // edi unsigned int v15; // edi __int64 v16; // rcx unsigned __int64 v17; // rdx char *v18; // rax char *v19; // rbp __int64 v20; // r12 _BYTE *v21; // r14 char v22; // al __int64 v23; // r8 unsigned __int16 v24; // ax char *i; // rcx char v26; // dl char v27; // si _BYTE *v28; // r9 __int64 v29; // rcx __int64 v30; // rdx char v31; // al _BYTE *v32; // r8 _QWORD v34[3]; // [rsp+50h] [rbp-48h] BYREF char v35; // [rsp+68h] [rbp-30h] *a2 = 0; v10 = a2; v12 = 0; if ( Size >= 0 ) v12 = Size; _LocaleUpdate::_LocaleUpdate((_LocaleUpdate *)v34, a9); if ( a3 <= v12 + 11 ) { v15 = 34; *errno() = 34; invalid_parameter_noinfo(); goto LABEL_53; } v16 = *a1; LODWORD(v17) = 2047; if ( (((unsigned __int64)*a1 >> 52) & 0x7FF) == 0x7FF ) { v15 = sub_180137954(a1, v10, a3, a4, a5, v12, 0, a8, 0, a10); if ( v15 ) { *v10 = 0; goto LABEL_53; } v18 = strrchr(v10, 101); if ( v18 ) { *v18 = 32 * (a7 ^ 1) + 80; v18[3] = 0; } } else { if ( v16 < 0 ) { *v10++ = 45; v16 = *a1; } v19 = v10 + 1; v20 = 1023; if ( (v16 & 0x7FF0000000000000LL) != 0 ) { *v10 = 49; } else { *v10 = 48; v20 = (*a1 & 0xFFFFFFFFFFFFFLL) != 0 ? 0x3FE : 0; } v21 = v10 + 2; if ( v12 ) v22 = ***(_BYTE ***)(v34[1] + 248LL); else v22 = 0; *v19 = v22; if ( (*a1 & 0xFFFFFFFFFFFFFLL) != 0 ) { v23 = 48; v17 = 0xF000000000000LL; do { if ( v12 <= 0 ) break; v24 = ((v17 & *a1 & 0xFFFFFFFFFFFFFLL) >> v23) + 48; if ( v24 > 0x39u ) LOBYTE(v24) = 32 * (a7 ^ 1) + 7 + v24; *v21 = v24; --v12; ++v21; v17 >>= 4; LOWORD(v23) = v23 - 4; } while ( (v23 & 0x8000u) == 0LL ); if ( (v23 & 0x8000u) == 0LL && (unsigned __int8)should_round_up(a1, v17, v23, a10) ) { for ( i = v21 - 1; ; --i ) { v26 = *i; if ( ((*i - 70) & 0xDF) != 0 ) break; *i = 48; } if ( i == v19 ) { ++*(i - 1); } else { if ( v26 == 57 ) v27 = 32 * (a7 ^ 1) + 65; else v27 = v26 + 1; *i = v27; } } } if ( v12 > 0 ) { LOBYTE(v17) = 48; memset(v21, v17, (unsigned int)v12); v21 += (unsigned int)v12; } if ( *v19 ) v19 = v21; *v19 = 32 * (a7 ^ 1) + 80; v28 = v19 + 2; v29 = (((unsigned __int64)*a1 >> 52) & 0x7FF) - v20; v30 = v29; if ( v29 < 0 ) v29 = v20 - (((unsigned __int64)*a1 >> 52) & 0x7FF); v31 = 43; v32 = v19 + 2; if ( v30 < 0 ) v31 = 45; v19[1] = v31; *v28 = 48; if ( v29 >= 1000 ) { v32 = v19 + 3; *v28 = v29 / 1000 + 48; v29 %= 1000; } if ( v32 != v28 || v29 >= 100 ) { *v32++ = v29 / 100 + 48; v29 %= 100; } if ( v32 != v28 || v29 >= 10 ) { *v32++ = v29 / 10 + 48; v29 %= 10; } *v32 = v29 + 48; v32[1] = 0; } v15 = 0; LABEL_53: if ( v35 ) *(_DWORD *)(v34[0] + 936LL) &= ~2u; return v15; }