; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/assume @ 0x412710 */ | #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_ () | int64_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) */ 0x00412710 push rbp | 0x00412711 push r15 | 0x00412713 push r14 | 0x00412715 push r12 | 0x00412717 push rbx | 0x00412718 mov r15, rsi | r15 = rsi; 0x0041271b mov r14, rdi | r14 = rdi; 0x0041271e test edx, edx | | if (edx < 0) { 0x00412720 js 0x4127d7 | goto label_2; | } 0x00412726 mov ebx, edx | ebx = edx; 0x00412728 mov r12, qword [r15] | r12 = *(r15); 0x0041272b mov rbp, qword [r15 + 8] | rbp = *((r15 + 8)); 0x0041272f mov ecx, ebp | ecx = ebp; | label_0: 0x00412731 mov eax, ebp | eax = ebp; 0x00412733 sar eax, 0x1f | eax >>= 0x1f; 0x00412736 and eax, ebp | eax &= ebp; 0x00412738 lea rdx, [rcx + r12 - 1] | rdx = rcx + r12 - 1; 0x0041273d nop dword [rax] | | do { 0x00412740 test ecx, ecx | | if (ecx <= 0) { 0x00412742 jle 0x412753 | goto label_3; | } 0x00412744 dec ecx | ecx--; 0x00412746 cmp byte [rdx], 0x2f | 0x00412749 lea rdx, [rdx - 1] | rdx = rdx - 1; 0x0041274d je 0x412740 | | } while (*(rdx) == 0x2f); 0x0041274f inc ecx | ecx++; 0x00412751 mov eax, ecx | eax = ecx; | label_3: 0x00412753 mov ebp, 0xffffffff | 0x00412758 cmp ebx, eax | | if (ebx >= eax) { 0x0041275a jge 0x4127cc | goto label_4; | } 0x0041275c mov rdi, r14 | 0x0041275f xor esi, esi | esi = 0; 0x00412761 call 0x41a610 | bsl::basic_string,bsl::allocator>::privateClear(bool) (r14); 0x00412766 mov r12, qword [r15] | r12 = *(r15); 0x00412769 mov eax, dword [r15 + 8] | eax = *((r15 + 8)); 0x0041276d test eax, eax | | if (eax < 0) { 0x0041276f jns 0x412779 | 0x00412771 mov rdi, r12 | 0x00412774 call 0x404a70 | eax = strlen (r12); | } 0x00412779 mov ecx, eax | ecx = eax; 0x0041277b sar ecx, 0x1f | ecx >>= 0x1f; 0x0041277e and ecx, eax | ecx &= eax; | do { 0x00412780 test eax, eax | | if (eax <= 0) { 0x00412782 jle 0x412791 | goto label_5; | } 0x00412784 dec eax | eax--; 0x00412786 cmp byte [r12 + rax], 0x2f | 0x0041278b je 0x412780 | | } while (*((r12 + rax)) == 0x2f); 0x0041278d inc eax | eax++; 0x0041278f mov ecx, eax | ecx = eax; | label_5: 0x00412791 movsxd rcx, ecx | rcx = (int64_t) ecx; 0x00412794 movsxd rax, ebx | rax = (int64_t) ebx; 0x00412797 add rax, r12 | rax += r12; 0x0041279a dec rcx | rcx--; 0x0041279d nop dword [rax] | | do { 0x004127a0 mov rdx, rcx | rdx = rcx; 0x004127a3 lea rsi, [r12 + rcx] | rsi = r12 + rcx; 0x004127a7 cmp rsi, rax | | if (rsi <= rax) { 0x004127aa jbe 0x4127b5 | goto label_6; | } 0x004127ac lea rcx, [rdx - 1] | rcx = rdx - 1; 0x004127b0 cmp byte [rsi], 0x2f | 0x004127b3 jne 0x4127a0 | | } while (*(rsi) != 0x2f); | label_6: 0x004127b5 xor ebp, ebp | ebp = 0; 0x004127b7 test rdx, rdx | | if (rdx != 0) { 0x004127ba je 0x4127cc | 0x004127bc mov ecx, 0x43d1dd | 0x004127c1 mov rdi, r14 | 0x004127c4 mov rsi, r12 | 0x004127c7 call 0x41a250 | bsl::basic_string,bsl::allocator>::privateAppend(char const*,unsigned long,char const*) (r14, r12, rdx, "string<...>::append(i,j): string too long"); | } | label_4: 0x004127cc mov eax, ebp | eax = ebp; 0x004127ce pop rbx | 0x004127cf pop r12 | 0x004127d1 pop r14 | 0x004127d3 pop r15 | 0x004127d5 pop rbp | 0x004127d6 ret | return rax; | label_2: 0x004127d7 mov r12, qword [r15] | r12 = *(r15); 0x004127da mov rbp, qword [r15 + 8] | rbp = *((r15 + 8)); 0x004127de mov eax, ebp | eax = ebp; 0x004127e0 test ebp, ebp | | if (ebp < 0) { 0x004127e2 jns 0x4127ec | 0x004127e4 mov rdi, r12 | 0x004127e7 call 0x404a70 | eax = strlen (r12); | } 0x004127ec mov ecx, ebp | ecx = ebp; 0x004127ee test eax, eax | | if (eax <= 0) { 0x004127f0 jle 0x41281b | goto label_7; | } 0x004127f2 mov eax, eax | 0x004127f4 xor ebx, ebx | ebx = 0; 0x004127f6 nop word cs:[rax + rax] | | label_1: 0x00412800 cmp byte [r12 + rbx], 0x2f | | if (*((r12 + rbx)) != 0x2f) { 0x00412805 jne 0x412731 | goto label_0; | } 0x0041280b inc rbx | rbx++; 0x0041280e cmp rax, rbx | | if (rax != rbx) { 0x00412811 jne 0x412800 | goto label_1; | } 0x00412813 mov rbx, rax | rbx = rax; 0x00412816 jmp 0x412731 | goto label_0; | label_7: 0x0041281b xor ebx, ebx | ebx = 0; 0x0041281d jmp 0x412731 | goto label_0; | }