; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/assume @ 0x412410 */ | #include | ; (fcn) method.BloombergLP::bdls::PathUtil.getLeaf_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____BloombergLP::bslstl::StringRefImp_char__const__int_ () | uint64_t method_BloombergLP::bdls::PathUtil_getLeaf_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::getLeaf(bsl::basic_string, bsl::allocator >*, BloombergLP::bslstl::StringRefImp const&, int) */ 0x00412410 push rbp | 0x00412411 push r15 | 0x00412413 push r14 | 0x00412415 push r13 | 0x00412417 push r12 | 0x00412419 push rbx | 0x0041241a push rax | 0x0041241b mov r13d, edx | r13d = edx; 0x0041241e mov r15, rsi | r15 = rsi; 0x00412421 mov rdx, rdi | rdx = rdi; 0x00412424 mov r12, qword [rsi] | r12 = *(rsi); 0x00412427 mov rbx, qword [rsi + 8] | rbx = *((rsi + 8)); 0x0041242b mov r14d, ebx | r14d = ebx; 0x0041242e test r13d, r13d | | if (r13d < 0) { 0x00412431 js 0x41251f | goto label_3; | } | label_0: 0x00412437 mov ebp, ebx | 0x00412439 sar ebp, 0x1f | ebp >>= 0x1f; 0x0041243c and ebp, ebx | ebp &= ebx; 0x0041243e lea rax, [r14 + r12 - 1] | rax = r14 + r12 - 1; 0x00412443 mov ecx, ebx | ecx = ebx; 0x00412445 nop word cs:[rax + rax] | 0x0041244f nop | | do { 0x00412450 test ecx, ecx | | if (ecx <= 0) { 0x00412452 jle 0x412463 | goto label_4; | } 0x00412454 dec ecx | ecx--; 0x00412456 cmp byte [rax], 0x2f | 0x00412459 lea rax, [rax - 1] | rax = rax - 1; 0x0041245d je 0x412450 | | } while (*(rax) == 0x2f); 0x0041245f inc ecx | ecx++; 0x00412461 jmp 0x412465 | goto label_5; | label_4: 0x00412463 mov ecx, ebp | ecx = ebp; | label_5: 0x00412465 mov eax, 0xffffffff | eax = 0xffffffff; 0x0041246a cmp r13d, ecx | | if (r13d >= ecx) { 0x0041246d jge 0x412510 | goto label_6; | } 0x00412473 mov r14, rdx | r14 = rdx; 0x00412476 mov rdi, rdx | 0x00412479 xor esi, esi | esi = 0; 0x0041247b call 0x41a610 | bsl::basic_string,bsl::allocator>::privateClear(bool) (rdx); 0x00412480 mov r15, qword [r15] | r15 = *(r15); 0x00412483 mov eax, ebx | eax = ebx; 0x00412485 test ebx, ebx | | if (ebx < 0) { 0x00412487 jns 0x412491 | 0x00412489 mov rdi, r15 | 0x0041248c call 0x404a70 | eax = strlen (r15); | } 0x00412491 mov ecx, eax | ecx = eax; 0x00412493 sar ecx, 0x1f | ecx >>= 0x1f; 0x00412496 and ecx, eax | ecx &= eax; 0x00412498 nop dword [rax + rax] | | do { 0x004124a0 test eax, eax | | if (eax <= 0) { 0x004124a2 jle 0x4124b1 | goto label_7; | } 0x004124a4 dec eax | eax--; 0x004124a6 cmp byte [r15 + rax], 0x2f | 0x004124ab je 0x4124a0 | | } while (*((r15 + rax)) == 0x2f); 0x004124ad inc eax | eax++; 0x004124af mov ecx, eax | ecx = eax; | label_7: 0x004124b1 movsxd rax, ecx | rax = (int64_t) ecx; 0x004124b4 movsxd rcx, r13d | rcx = (int64_t) r13d; 0x004124b7 add rcx, r15 | rcx += r15; 0x004124ba lea rdx, [rax + r15 - 1] | rdx = rax + r15 - 1; 0x004124bf nop | | do { 0x004124c0 mov rax, rdx | rax = rdx; 0x004124c3 cmp rdx, rcx | | if (rdx <= rcx) { 0x004124c6 jbe 0x4124d1 | goto label_8; | } 0x004124c8 lea rdx, [rax - 1] | rdx = rax - 1; 0x004124cc cmp byte [rax], 0x2f | 0x004124cf jne 0x4124c0 | | } while (*(rax) != 0x2f); | label_8: 0x004124d1 lea rsi, [rax + 1] | rsi = rax + 1; 0x004124d5 mov rdi, r14 | rdi = r14; 0x004124d8 nop dword [rax + rax] | | do { 0x004124e0 test ebx, ebx | | if (ebx <= 0) { 0x004124e2 jle 0x4124f1 | goto label_9; | } 0x004124e4 dec ebx | ebx--; 0x004124e6 cmp byte [r15 + rbx], 0x2f | 0x004124eb je 0x4124e0 | | } while (*((r15 + rbx)) == 0x2f); 0x004124ed inc ebx | ebx++; 0x004124ef mov ebp, ebx | | label_9: 0x004124f1 cmp byte [rax], 0x2f | | if (*(rax) != 0x2f) { 0x004124f4 cmovne rsi, rax | rsi = rax; | } 0x004124f8 movsxd rax, ebp | rax = (int64_t) ebp; 0x004124fb add r15, rax | r15 += rax; 0x004124fe sub r15, rsi | r15 -= rsi; 0x00412501 mov ecx, 0x43d1dd | 0x00412506 mov rdx, r15 | 0x00412509 call 0x41a250 | eax = bsl::basic_string,bsl::allocator>::privateAppend(char const*,unsigned long,char const*) (rdi, rsi, r15, "string<...>::append(i,j): string too long"); 0x0041250e xor eax, eax | eax = 0; | label_6: 0x00412510 add rsp, 8 | 0x00412514 pop rbx | 0x00412515 pop r12 | 0x00412517 pop r13 | 0x00412519 pop r14 | 0x0041251b pop r15 | 0x0041251d pop rbp | 0x0041251e ret | return rax; | label_3: 0x0041251f mov eax, ebx | eax = ebx; 0x00412521 test ebx, ebx | | if (ebx < 0) { 0x00412523 js 0x41254b | goto label_10; | } 0x00412525 test eax, eax | | if (eax <= 0) { 0x00412527 jle 0x41255d | goto label_11; | } | label_2: 0x00412529 mov eax, eax | 0x0041252b xor r13d, r13d | r13d = 0; 0x0041252e nop | | label_1: 0x00412530 cmp byte [r12 + r13], 0x2f | | if (*((r12 + r13)) != 0x2f) { 0x00412535 jne 0x412437 | goto label_0; | } 0x0041253b inc r13 | r13++; 0x0041253e cmp rax, r13 | | if (rax != r13) { 0x00412541 jne 0x412530 | goto label_1; | } 0x00412543 mov r13, rax | r13 = rax; 0x00412546 jmp 0x412437 | goto label_0; | label_10: 0x0041254b mov rdi, r12 | 0x0041254e mov rbp, rdx | 0x00412551 call 0x404a70 | eax = strlen (r12); 0x00412556 mov rdx, rbp | rdx = rbp; 0x00412559 test eax, eax | | if (eax > 0) { 0x0041255b jg 0x412529 | goto label_2; | } | label_11: 0x0041255d xor r13d, r13d | r13d = 0; 0x00412560 jmp 0x412437 | goto label_0; | }