; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/none @ 0x4129c0 */ | #include | ; (fcn) method.BloombergLP::bdls::PathUtil.getRoot_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____BloombergLP::bslstl::StringRefImp_char__const__int_ () | uint64_t method_BloombergLP::bdls::PathUtil_getRoot_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_BloombergLP::bslstl::StringRefImp_char_const_int_ (int64_t arg3, int64_t arg2, int64_t arg1) { | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdls::PathUtil::getRoot(bsl::basic_string, bsl::allocator >*, BloombergLP::bslstl::StringRefImp const&, int) */ 0x004129c0 push rbp | 0x004129c1 push r15 | 0x004129c3 push r14 | 0x004129c5 push r13 | 0x004129c7 push r12 | 0x004129c9 push rbx | 0x004129ca push rax | 0x004129cb mov ebx, edx | ebx = edx; 0x004129cd mov r15, rsi | r15 = rsi; 0x004129d0 mov r14, rdi | r14 = rdi; 0x004129d3 mov eax, edx | eax = edx; 0x004129d5 test edx, edx | | if (edx >= 0) { 0x004129d7 js 0x4129fe | | label_0: 0x004129d9 test eax, eax | | if (eax == 0) { 0x004129db je 0x412a46 | goto label_3; | } 0x004129dd xor ebp, ebp | ebp = 0; 0x004129df mov rdi, r14 | 0x004129e2 xor esi, esi | esi = 0; 0x004129e4 call 0x41a800 | bsl::basic_string,bsl::allocator>::privateClear(bool) (r14); 0x004129e9 mov rsi, qword [r15] | 0x004129ec movsxd rdx, ebx | rdx = (int64_t) ebx; 0x004129ef mov ecx, 0x43d40d | 0x004129f4 mov rdi, r14 | 0x004129f7 call 0x41a440 | bsl::basic_string,bsl::allocator>::privateAppend(char const*,unsigned long,char const*) (r14, *(r15), rdx, "string<...>::append(i,j): string too long"); 0x004129fc jmp 0x412a4b | goto label_4; | } 0x004129fe mov r12, qword [r15] | r12 = *(r15); 0x00412a01 mov r13d, dword [r15 + 8] | r13d = *((r15 + 8)); 0x00412a05 mov eax, r13d | eax = *((r15 + 8)); 0x00412a08 test r13d, r13d | | if (r13d < 0) { 0x00412a0b js 0x412a3a | goto label_5; | } 0x00412a0d test eax, eax | | if (eax <= 0) { 0x00412a0f jle 0x412a46 | goto label_3; | } | label_1: 0x00412a11 mov eax, eax | 0x00412a13 xor ebx, ebx | ebx = 0; 0x00412a15 nop word cs:[rax + rax] | 0x00412a1f nop | | do { 0x00412a20 cmp byte [r12 + rbx], 0x2f | | if (*((r12 + rbx)) != 0x2f) { 0x00412a25 jne 0x412a32 | goto label_6; | } 0x00412a27 inc rbx | rbx++; 0x00412a2a cmp rax, rbx | 0x00412a2d jne 0x412a20 | | } while (rax != rbx); 0x00412a2f mov rbx, rax | rbx = rax; | label_6: 0x00412a32 test ebx, ebx | | if (ebx < 0) { 0x00412a34 js 0x412a5c | goto label_7; | } 0x00412a36 mov eax, ebx | eax = ebx; 0x00412a38 jmp 0x4129d9 | goto label_0; | label_5: 0x00412a3a mov rdi, r12 | 0x00412a3d call 0x404a70 | eax = strlen (r12); 0x00412a42 test eax, eax | | if (eax > 0) { 0x00412a44 jg 0x412a11 | goto label_1; | } | label_3: 0x00412a46 mov ebp, 0xffffffff | | label_4: 0x00412a4b mov eax, ebp | eax = 0xffffffff; 0x00412a4d add rsp, 8 | 0x00412a51 pop rbx | 0x00412a52 pop r12 | 0x00412a54 pop r13 | 0x00412a56 pop r14 | 0x00412a58 pop r15 | 0x00412a5a pop rbp | 0x00412a5b ret | return eax; | label_7: 0x00412a5c test r13d, r13d | | if (r13d < 0) { 0x00412a5f jns 0x412a6c | 0x00412a61 mov rdi, r12 | 0x00412a64 call 0x404a70 | rax = strlen (r12); 0x00412a69 mov r13, rax | r13 = rax; | } 0x00412a6c test r13d, r13d | | if (r13d <= 0) { 0x00412a6f jle 0x412a9b | goto label_8; | } 0x00412a71 mov ecx, r13d | ecx = r13d; 0x00412a74 xor eax, eax | eax = 0; 0x00412a76 nop word cs:[rax + rax] | | label_2: 0x00412a80 cmp byte [r12 + rax], 0x2f | | if (*((r12 + rax)) != 0x2f) { 0x00412a85 jne 0x4129d9 | goto label_0; | } 0x00412a8b inc rax | rax++; 0x00412a8e cmp rcx, rax | | if (rcx != rax) { 0x00412a91 jne 0x412a80 | goto label_2; | } 0x00412a93 mov rax, rcx | rax = rcx; 0x00412a96 jmp 0x4129d9 | goto label_0; | label_8: 0x00412a9b xor eax, eax | eax = 0; 0x00412a9d jmp 0x4129d9 | goto label_0; | }