{"type": "func", "start": 6443727424, "end": 6443727890, "name": "fp_format_e_internal", "pseudocode": "// \n// fp_format_e_internal from 0x180137a40 to 0x180137c12 (466 bytes)\n// \n// 4 xrefs:\n// > sub_180137954 @ 0x180137a26\n// > sub_180137D7C @ 0x180137ead\n// > <???> @ 0x1802035fc\n// > <???> @ 0x180203608\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n__int64 __fastcall fp_format_e_internal(\n        char *const a1,\n        unsigned __int64 a2,\n        int a3,\n        char a4,\n        unsigned int a5,\n        struct _strflt *const a6,\n        bool a7,\n        struct __crt_locale_pointers *const a8)\n{\n  int v8; // eax\n  __int64 v9; // rbx\n  char *v14; // rdx\n  __int64 v15; // r8\n  char *v16; // rdx\n  char *v17; // rbx\n  rsize_t v18; // rdx\n  _BYTE *v19; // rcx\n  int v20; // r8d\n  _QWORD v21[3]; // [rsp+30h] [rbp-28h] BYREF\n  char v22; // [rsp+48h] [rbp-10h]\n\n  v8 = 0;\n  v9 = a3;\n  if ( a3 > 0 )\n    v8 = a3;\n  if ( a2 > v8 + 9 )\n  {\n    _LocaleUpdate::_LocaleUpdate((_LocaleUpdate *)v21, a8);\n    if ( a7 )\n    {\n      v14 = &a1[*(_DWORD *)a6 == 45];\n      if ( (int)v9 > 0 )\n      {\n        v15 = -1;\n        do\n          ++v15;\n        while ( v14[v15] );\n        memmove(v14 + 1, v14, v15 + 1);\n      }\n    }\n    v16 = a1;\n    if ( *(_DWORD *)a6 == 45 )\n    {\n      *a1 = 45;\n      v16 = a1 + 1;\n    }\n    if ( (int)v9 > 0 )\n    {\n      *v16 = v16[1];\n      *++v16 = ***(_BYTE ***)(v21[1] + 248LL);\n    }\n    v17 = &v16[v9 + !a7];\n    v18 = a1 - v17 + a2;\n    if ( a2 == -1 )\n      v18 = -1;\n    if ( strcpy_s(v17, v18, \"e+000\") )\n      invoke_watson(nullptr, nullptr, nullptr, 0, 0);\n    v19 = v17 + 2;\n    if ( a4 )\n      *v17 = 69;\n    if ( **((_BYTE **)a6 + 1) != 48 )\n    {\n      v20 = *((_DWORD *)a6 + 1) - 1;\n      if ( v20 < 0 )\n      {\n        v20 = 1 - *((_DWORD *)a6 + 1);\n        v17[1] = 45;\n      }\n      if ( v20 >= 100 )\n      {\n        v17[2] += v20 / 100;\n        v20 %= 100;\n      }\n      if ( v20 >= 10 )\n      {\n        v17[3] += v20 / 10;\n        LOBYTE(v20) = v20 % 10;\n      }\n      v17[4] += v20;\n    }\n    if ( a5 == 2 && *v19 == 48 )\n      memmove(v19, v17 + 3, 3u);\n    if ( v22 )\n      *(_DWORD *)(v21[0] + 936LL) &= ~2u;\n    return 0;\n  }\n  else\n  {\n    *errno() = 34;\n    invalid_parameter_noinfo();\n    return 34;\n  }\n}", "assembly": "; \n; fp_format_e_internal from 0x180137a40 to 0x180137c12 (466 bytes)\n; \n; 4 xrefs:\n; > sub_180137954 @ 0x180137a26\n; > sub_180137D7C @ 0x180137ead\n; > <???> @ 0x1802035fc\n; > <???> @ 0x180203608\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\nmov     rax, rsp                                                       ; +0x0, 0x180137a40\nmov     [rax+8], rbx                                                   ; +0x3, 0x180137a43\nmov     [rax+10h], rbp                                                 ; +0x7, 0x180137a47\nmov     [rax+18h], rsi                                                 ; +0xb, 0x180137a4b\nmov     [rax+20h], rdi                                                 ; +0xf, 0x180137a4f\npush    r15                                                            ; +0x13, 0x180137a53\nsub     rsp, 50h                                                       ; +0x15, 0x180137a55\nxor     eax, eax                                                       ; +0x19, 0x180137a59\nmovsxd  rbx, r8d                                                       ; +0x1b, 0x180137a5b\ntest    r8d, r8d                                                       ; +0x1e, 0x180137a5e\nmov     r15b, r9b                                                      ; +0x21, 0x180137a61\nmov     rbp, rdx                                                       ; +0x24, 0x180137a64\nmov     rdi, rcx                                                       ; +0x27, 0x180137a67\ncmovg   eax, ebx                                                       ; +0x2a, 0x180137a6a\nadd     eax, 9                                                         ; +0x2d, 0x180137a6d\ncdqe                                                                   ; +0x30, 0x180137a70\ncmp     rdx, rax                                                       ; +0x32, 0x180137a72\nja      short loc_180137AA5                                            ; +0x35, 0x180137a75\ncall    _errno                                                         ; +0x37, 0x180137a77\nmov     ebx, 22h ; '\"'                                                 ; +0x3c, 0x180137a7c\nmov     [rax], ebx                                                     ; +0x41, 0x180137a81\ncall    _invalid_parameter_noinfo                                      ; +0x43, 0x180137a83\nmov     eax, ebx                                                       ; +0x48, 0x180137a88\nmov     rbx, [rsp+58h+arg_0]                                           ; +0x4a, 0x180137a8a\nmov     rbp, [rsp+58h+arg_8]                                           ; +0x4f, 0x180137a8f\nmov     rsi, [rsp+58h+arg_10]                                          ; +0x54, 0x180137a94\nmov     rdi, [rsp+58h+arg_18]                                          ; +0x59, 0x180137a99\nadd     rsp, 50h                                                       ; +0x5e, 0x180137a9e\npop     r15                                                            ; +0x62, 0x180137aa2\nretn                                                                   ; +0x64, 0x180137aa4\nmov     rdx, [rsp+58h+arg_38]; struct __crt_locale_pointers *          ; +0x65, 0x180137aa5\nlea     rcx, [rsp+58h+var_28]; this                                    ; +0x6d, 0x180137aad\ncall    ??0_LocaleUpdate@@QEAA@QEAU__crt_locale_pointers@@@Z           ; +0x72, 0x180137ab2\ncmp     [rsp+58h+arg_30], 0                                            ; +0x77, 0x180137ab7\nmov     rsi, [rsp+58h+arg_28]                                          ; +0x7f, 0x180137abf\njz      short loc_180137AF2                                            ; +0x87, 0x180137ac7\nxor     edx, edx                                                       ; +0x89, 0x180137ac9\ncmp     dword ptr [rsi], 2Dh ; '-'                                     ; +0x8b, 0x180137acb\nsetz    dl                                                             ; +0x8e, 0x180137ace\nadd     rdx, rdi; Src                                                  ; +0x91, 0x180137ad1\ntest    ebx, ebx                                                       ; +0x94, 0x180137ad4\njle     short loc_180137AF2                                            ; +0x96, 0x180137ad6\nor      r8, 0FFFFFFFFFFFFFFFFh                                         ; +0x98, 0x180137ad8\ninc     r8                                                             ; +0x9c, 0x180137adc\ncmp     byte ptr [rdx+r8], 0                                           ; +0x9f, 0x180137adf\njnz     short loc_180137ADC                                            ; +0xa4, 0x180137ae4\ninc     r8; Size                                                       ; +0xa6, 0x180137ae6\nlea     rcx, [rdx+1]; void *                                           ; +0xa9, 0x180137ae9\ncall    memmove                                                        ; +0xad, 0x180137aed\ncmp     dword ptr [rsi], 2Dh ; '-'                                     ; +0xb2, 0x180137af2\nmov     rdx, rdi                                                       ; +0xb5, 0x180137af5\njnz     short loc_180137B01                                            ; +0xb8, 0x180137af8\nmov     byte ptr [rdi], 2Dh ; '-'                                      ; +0xba, 0x180137afa\nlea     rdx, [rdi+1]                                                   ; +0xbd, 0x180137afd\ntest    ebx, ebx                                                       ; +0xc1, 0x180137b01\njle     short loc_180137B20                                            ; +0xc3, 0x180137b03\nmov     al, [rdx+1]                                                    ; +0xc5, 0x180137b05\nmov     [rdx], al                                                      ; +0xc8, 0x180137b08\ninc     rdx                                                            ; +0xca, 0x180137b0a\nmov     rax, [rsp+58h+var_20]                                          ; +0xcd, 0x180137b0d\nmov     rcx, [rax+0F8h]                                                ; +0xd2, 0x180137b12\nmov     rax, [rcx]                                                     ; +0xd9, 0x180137b19\nmov     cl, [rax]                                                      ; +0xdc, 0x180137b1c\nmov     [rdx], cl                                                      ; +0xde, 0x180137b1e\nmovzx   ecx, [rsp+58h+arg_30]                                          ; +0xe0, 0x180137b20\nlea     r8, aE000                                                      ; +0xe8, 0x180137b28\nadd     rbx, rdx                                                       ; +0xef, 0x180137b2f\nxor     rcx, 1                                                         ; +0xf2, 0x180137b32\nadd     rbx, rcx                                                       ; +0xf6, 0x180137b36\nsub     rdi, rbx                                                       ; +0xf9, 0x180137b39\nmov     rcx, rbx; Destination                                          ; +0xfc, 0x180137b3c\ncmp     rbp, 0FFFFFFFFFFFFFFFFh                                        ; +0xff, 0x180137b3f\nlea     rdx, [rdi+rbp]                                                 ; +0x103, 0x180137b43\ncmovz   rdx, rbp; SizeInBytes                                          ; +0x107, 0x180137b47\ncall    strcpy_s                                                       ; +0x10b, 0x180137b4b\ntest    eax, eax                                                       ; +0x110, 0x180137b50\njnz     loc_180137BFC                                                  ; +0x112, 0x180137b52\nlea     rcx, [rbx+2]; void *                                           ; +0x118, 0x180137b58\ntest    r15b, r15b                                                     ; +0x11c, 0x180137b5c\njz      short loc_180137B64                                            ; +0x11f, 0x180137b5f\nmov     byte ptr [rbx], 45h ; 'E'                                      ; +0x121, 0x180137b61\nmov     rax, [rsi+8]                                                   ; +0x124, 0x180137b64\ncmp     byte ptr [rax], 30h ; '0'                                      ; +0x128, 0x180137b68\njz      short loc_180137BC4                                            ; +0x12b, 0x180137b6b\nmov     r8d, [rsi+4]                                                   ; +0x12d, 0x180137b6d\nsub     r8d, 1                                                         ; +0x131, 0x180137b71\njns     short loc_180137B7E                                            ; +0x135, 0x180137b75\nneg     r8d                                                            ; +0x137, 0x180137b77\nmov     byte ptr [rbx+1], 2Dh ; '-'                                    ; +0x13a, 0x180137b7a\ncmp     r8d, 64h ; 'd'                                                 ; +0x13e, 0x180137b7e\njl      short loc_180137B9F                                            ; +0x142, 0x180137b82\nmov     eax, 51EB851Fh                                                 ; +0x144, 0x180137b84\nimul    r8d                                                            ; +0x149, 0x180137b89\nsar     edx, 5                                                         ; +0x14c, 0x180137b8c\nmov     eax, edx                                                       ; +0x14f, 0x180137b8f\nshr     eax, 1Fh                                                       ; +0x151, 0x180137b91\nadd     edx, eax                                                       ; +0x154, 0x180137b94\nadd     [rbx+2], dl                                                    ; +0x156, 0x180137b96\nimul    eax, edx, -64h                                                 ; +0x159, 0x180137b99\nadd     r8d, eax                                                       ; +0x15c, 0x180137b9c\ncmp     r8d, 0Ah                                                       ; +0x15f, 0x180137b9f\njl      short loc_180137BC0                                            ; +0x163, 0x180137ba3\nmov     eax, 66666667h                                                 ; +0x165, 0x180137ba5\nimul    r8d                                                            ; +0x16a, 0x180137baa\nsar     edx, 2                                                         ; +0x16d, 0x180137bad\nmov     eax, edx                                                       ; +0x170, 0x180137bb0\nshr     eax, 1Fh                                                       ; +0x172, 0x180137bb2\nadd     edx, eax                                                       ; +0x175, 0x180137bb5\nadd     [rbx+3], dl                                                    ; +0x177, 0x180137bb7\nimul    eax, edx, -0Ah                                                 ; +0x17a, 0x180137bba\nadd     r8d, eax                                                       ; +0x17d, 0x180137bbd\nadd     [rbx+4], r8b                                                   ; +0x180, 0x180137bc0\ncmp     [rsp+58h+arg_20], 2                                            ; +0x184, 0x180137bc4\njnz     short loc_180137BE2                                            ; +0x18c, 0x180137bcc\ncmp     byte ptr [rcx], 30h ; '0'                                      ; +0x18e, 0x180137bce\njnz     short loc_180137BE2                                            ; +0x191, 0x180137bd1\nlea     rdx, [rcx+1]; Src                                              ; +0x193, 0x180137bd3\nmov     r8d, 3; Size                                                   ; +0x197, 0x180137bd7\ncall    memmove                                                        ; +0x19d, 0x180137bdd\ncmp     [rsp+58h+var_10], 0                                            ; +0x1a2, 0x180137be2\njz      short loc_180137BF5                                            ; +0x1a7, 0x180137be7\nmov     rax, [rsp+58h+var_28]                                          ; +0x1a9, 0x180137be9\nand     dword ptr [rax+3A8h], 0FFFFFFFDh                               ; +0x1ae, 0x180137bee\nxor     eax, eax                                                       ; +0x1b5, 0x180137bf5\njmp     loc_180137A8A                                                  ; +0x1b7, 0x180137bf7\nand     [rsp+58h+var_38], 0                                            ; +0x1bc, 0x180137bfc\nxor     r9d, r9d; LineNo                                               ; +0x1c2, 0x180137c02\nxor     r8d, r8d; FileName                                             ; +0x1c5, 0x180137c05\nxor     edx, edx; FunctionName                                         ; +0x1c8, 0x180137c08\nxor     ecx, ecx; Expression                                           ; +0x1ca, 0x180137c0a\ncall    _invoke_watson                                                 ; +0x1cc, 0x180137c0c\ndb 0CCh                                                                ; +0x1d1, 0x180137c11", "xrefs": ["sub_180137954 @ 0x180137a26", "sub_180137D7C @ 0x180137ead", "<???> @ 0x1802035fc", "<???> @ 0x180203608"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}