; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/none @ 0x412830 */ | #include | ; (fcn) method.BloombergLP::bdls::PathUtil.getDirname_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____BloombergLP::bslstl::StringRefImp_char__const__int_ () | uint64_t method_BloombergLP::bdls::PathUtil_getDirname_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::getDirname(bsl::basic_string, bsl::allocator >*, BloombergLP::bslstl::StringRefImp const&, int) */ 0x00412830 push rbp | 0x00412831 push r15 | 0x00412833 push r14 | 0x00412835 push r13 | 0x00412837 push r12 | 0x00412839 push rbx | 0x0041283a push rax | 0x0041283b mov r15, rsi | r15 = rsi; 0x0041283e mov r14, rdi | r14 = rdi; 0x00412841 test edx, edx | | if (edx < 0) { 0x00412843 js 0x41291d | goto label_3; | } 0x00412849 mov r13d, edx | r13d = edx; 0x0041284c mov r12, qword [r15] | r12 = *(r15); 0x0041284f mov rbp, qword [r15 + 8] | rbp = *((r15 + 8)); 0x00412853 mov ebx, ebp | ebx = ebp; 0x00412855 mov eax, edx | eax = edx; | label_0: 0x00412857 mov ecx, ebp | ecx = ebp; 0x00412859 sar ecx, 0x1f | ecx >>= 0x1f; 0x0041285c and ecx, ebp | ecx &= ebp; 0x0041285e nop | | do { 0x00412860 test ebx, ebx | | if (ebx <= 0) { 0x00412862 jle 0x412877 | goto label_4; | } 0x00412864 lea rdx, [rbx - 1] | rdx = rbx - 1; 0x00412868 cmp byte [r12 + rbx - 1], 0x2f | 0x0041286e mov rbx, rdx | rbx = rdx; 0x00412871 je 0x412860 | | } while (*((r12 + rbx - 1)) == 0x2f); 0x00412873 inc edx | edx++; 0x00412875 mov ecx, edx | ecx = edx; | label_4: 0x00412877 mov ebp, 0xffffffff | 0x0041287c cmp eax, ecx | | if (eax >= ecx) { 0x0041287e jge 0x41290c | goto label_5; | } 0x00412884 mov rdi, r14 | 0x00412887 xor esi, esi | esi = 0; 0x00412889 call 0x41a800 | bsl::basic_string,bsl::allocator>::privateClear(bool) (r14); 0x0041288e mov rbx, qword [r15] | rbx = *(r15); 0x00412891 mov eax, dword [r15 + 8] | eax = *((r15 + 8)); 0x00412895 test eax, eax | | if (eax < 0) { 0x00412897 jns 0x4128a1 | 0x00412899 mov rdi, rbx | 0x0041289c call 0x404a70 | eax = strlen (rbx); | } 0x004128a1 mov edx, eax | edx = eax; 0x004128a3 mov ecx, eax | ecx = eax; 0x004128a5 sar ecx, 0x1f | ecx >>= 0x1f; 0x004128a8 and ecx, eax | ecx &= eax; 0x004128aa nop word [rax + rax] | | do { 0x004128b0 test edx, edx | | if (edx <= 0) { 0x004128b2 jle 0x4128c6 | goto label_6; | } 0x004128b4 lea rax, [rdx - 1] | rax = rdx - 1; 0x004128b8 cmp byte [rbx + rdx - 1], 0x2f | 0x004128bd mov rdx, rax | rdx = rax; 0x004128c0 je 0x4128b0 | | } while (*((rbx + rdx - 1)) == 0x2f); 0x004128c2 inc eax | eax++; 0x004128c4 mov ecx, eax | ecx = eax; | label_6: 0x004128c6 movsxd rcx, ecx | rcx = (int64_t) ecx; 0x004128c9 movsxd rax, r13d | rax = (int64_t) r13d; 0x004128cc add rax, rbx | rax += rbx; 0x004128cf dec rcx | rcx--; 0x004128d2 nop word cs:[rax + rax] | 0x004128dc nop dword [rax] | | do { 0x004128e0 mov rdx, rcx | rdx = rcx; 0x004128e3 lea rsi, [rbx + rcx] | rsi = rbx + rcx; 0x004128e7 cmp rsi, rax | | if (rsi <= rax) { 0x004128ea jbe 0x4128f5 | goto label_7; | } 0x004128ec lea rcx, [rdx - 1] | rcx = rdx - 1; 0x004128f0 cmp byte [rsi], 0x2f | 0x004128f3 jne 0x4128e0 | | } while (*(rsi) != 0x2f); | label_7: 0x004128f5 xor ebp, ebp | ebp = 0; 0x004128f7 test rdx, rdx | | if (rdx != 0) { 0x004128fa je 0x41290c | 0x004128fc mov ecx, 0x43d40d | 0x00412901 mov rdi, r14 | 0x00412904 mov rsi, rbx | 0x00412907 call 0x41a440 | bsl::basic_string,bsl::allocator>::privateAppend(char const*,unsigned long,char const*) (r14, rbx, rdx, "string<...>::append(i,j): string too long"); | } | label_5: 0x0041290c mov eax, ebp | eax = ebp; 0x0041290e add rsp, 8 | 0x00412912 pop rbx | 0x00412913 pop r12 | 0x00412915 pop r13 | 0x00412917 pop r14 | 0x00412919 pop r15 | 0x0041291b pop rbp | 0x0041291c ret | return rax; | label_3: 0x0041291d mov r12, qword [r15] | r12 = *(r15); 0x00412920 mov rbp, qword [r15 + 8] | rbp = *((r15 + 8)); 0x00412924 mov ebx, ebp | ebx = ebp; 0x00412926 mov eax, ebp | eax = ebp; 0x00412928 test ebp, ebp | | if (ebp < 0) { 0x0041292a js 0x41295f | goto label_8; | } 0x0041292c test eax, eax | | if (eax <= 0) { 0x0041292e jle 0x41296b | goto label_9; | } | label_1: 0x00412930 mov eax, eax | 0x00412932 xor r13d, r13d | r13d = 0; 0x00412935 nop word cs:[rax + rax] | 0x0041293f nop | | do { 0x00412940 cmp byte [r12 + r13], 0x2f | | if (*((r12 + r13)) != 0x2f) { 0x00412945 jne 0x412952 | goto label_10; | } 0x00412947 inc r13 | r13++; 0x0041294a cmp rax, r13 | 0x0041294d jne 0x412940 | | } while (rax != r13); 0x0041294f mov r13, rax | r13 = rax; | label_10: 0x00412952 test r13d, r13d | | if (r13d < 0) { 0x00412955 js 0x412975 | goto label_11; | } 0x00412957 mov eax, r13d | eax = r13d; 0x0041295a jmp 0x412857 | goto label_0; | label_8: 0x0041295f mov rdi, r12 | 0x00412962 call 0x404a70 | eax = strlen (r12); 0x00412967 test eax, eax | | if (eax > 0) { 0x00412969 jg 0x412930 | goto label_1; | } | label_9: 0x0041296b xor r13d, r13d | r13d = 0; 0x0041296e xor eax, eax | eax = 0; 0x00412970 jmp 0x412857 | goto label_0; | label_11: 0x00412975 mov eax, ebp | eax = ebp; 0x00412977 test ebp, ebp | | if (ebp < 0) { 0x00412979 jns 0x412983 | 0x0041297b mov rdi, r12 | 0x0041297e call 0x404a70 | eax = strlen (r12); | } 0x00412983 test eax, eax | | if (eax <= 0) { 0x00412985 jle 0x4129ab | goto label_12; | } 0x00412987 mov ecx, eax | ecx = eax; 0x00412989 xor eax, eax | eax = 0; 0x0041298b nop dword [rax + rax] | | label_2: 0x00412990 cmp byte [r12 + rax], 0x2f | | if (*((r12 + rax)) != 0x2f) { 0x00412995 jne 0x412857 | goto label_0; | } 0x0041299b inc rax | rax++; 0x0041299e cmp rcx, rax | | if (rcx != rax) { 0x004129a1 jne 0x412990 | goto label_2; | } 0x004129a3 mov rax, rcx | rax = rcx; 0x004129a6 jmp 0x412857 | goto label_0; | label_12: 0x004129ab xor eax, eax | eax = 0; 0x004129ad jmp 0x412857 | goto label_0; | }