; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/assume @ 0x4122f0 */ | #include | ; (fcn) method.BloombergLP::bdls::PathUtil.popLeaf_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____int_ () | int64_t method_BloombergLP::bdls::PathUtil_popLeaf_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_int_ (int64_t arg2, int64_t arg1) { | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdls::PathUtil::popLeaf(bsl::basic_string, bsl::allocator >*, int) */ 0x004122f0 push r15 | 0x004122f2 push r14 | 0x004122f4 push r12 | 0x004122f6 push rbx | 0x004122f7 push rax | 0x004122f8 mov ebx, esi | ebx = esi; 0x004122fa mov r14, rdi | r14 = rdi; 0x004122fd mov r12, qword [rdi + 0x20] | r12 = *((rdi + 0x20)); 0x00412301 test esi, esi | | if (esi < 0) { 0x00412303 js 0x4123c2 | goto label_3; | } | label_0: 0x00412309 cmp r12, 0x17 | | if (r12 == 0x17) { 0x0041230d jne 0x412314 | 0x0041230f mov r15, r14 | r15 = r14; 0x00412312 jmp 0x412317 | | } else { 0x00412314 mov r15, qword [r14] | r15 = *(r14); | } 0x00412317 mov rdi, r15 | 0x0041231a call 0x404a70 | eax = strlen (*(r14)); 0x0041231f mov edx, eax | edx = eax; 0x00412321 mov ecx, eax | ecx = eax; 0x00412323 sar ecx, 0x1f | ecx >>= 0x1f; 0x00412326 and ecx, eax | ecx &= eax; 0x00412328 lea rdx, [rdx + r15 - 1] | rdx = rdx + r15 - 1; 0x0041232d nop dword [rax] | | do { 0x00412330 test eax, eax | | if (eax <= 0) { 0x00412332 jle 0x412343 | goto label_4; | } 0x00412334 dec eax | eax--; 0x00412336 cmp byte [rdx], 0x2f | 0x00412339 lea rdx, [rdx - 1] | rdx = rdx - 1; 0x0041233d je 0x412330 | | } while (*(rdx) == 0x2f); 0x0041233f inc eax | eax++; 0x00412341 mov ecx, eax | ecx = eax; | label_4: 0x00412343 mov eax, 0xffffffff | eax = 0xffffffff; 0x00412348 cmp ebx, ecx | | if (ebx >= ecx) { 0x0041234a jge 0x4123b6 | goto label_5; | } 0x0041234c mov r15, r14 | r15 = r14; 0x0041234f cmp r12, 0x17 | | if (r12 != 0x17) { 0x00412353 je 0x412358 | 0x00412355 mov r15, qword [r14] | r15 = *(r14); | } 0x00412358 mov eax, dword [r14 + 0x18] | eax = *((r14 + 0x18)); 0x0041235c test eax, eax | | if (eax < 0) { 0x0041235e jns 0x412368 | 0x00412360 mov rdi, r15 | 0x00412363 call 0x404a70 | eax = strlen (r15); | } 0x00412368 mov ecx, eax | ecx = eax; 0x0041236a sar ecx, 0x1f | ecx >>= 0x1f; 0x0041236d and ecx, eax | ecx &= eax; 0x0041236f nop | | do { 0x00412370 test eax, eax | | if (eax <= 0) { 0x00412372 jle 0x412381 | goto label_6; | } 0x00412374 dec eax | eax--; 0x00412376 cmp byte [r15 + rax], 0x2f | 0x0041237b je 0x412370 | | } while (*((r15 + rax)) == 0x2f); 0x0041237d inc eax | eax++; 0x0041237f mov ecx, eax | ecx = eax; | label_6: 0x00412381 movsxd rcx, ecx | rcx = (int64_t) ecx; 0x00412384 movsxd rax, ebx | rax = (int64_t) ebx; 0x00412387 add rax, r15 | rax += r15; 0x0041238a dec rcx | rcx--; 0x0041238d nop dword [rax] | | do { 0x00412390 mov rsi, rcx | rsi = rcx; 0x00412393 lea rdx, [r15 + rcx] | rdx = r15 + rcx; 0x00412397 cmp rdx, rax | | if (rdx <= rax) { 0x0041239a jbe 0x4123a5 | goto label_7; | } 0x0041239c lea rcx, [rsi - 1] | rcx = rsi - 1; 0x004123a0 cmp byte [rdx], 0x2f | 0x004123a3 jne 0x412390 | | } while (*(rdx) != 0x2f); | label_7: 0x004123a5 mov rdi, r14 | 0x004123a8 mov rdx, 0xffffffffffffffff | 0x004123af call 0x41c2f0 | eax = bsl::basic_string,bsl::allocator>::erase(unsigned long,unsigned long) (r14, rsi, 0xffffffffffffffff); 0x004123b4 xor eax, eax | eax = 0; | label_5: 0x004123b6 add rsp, 8 | 0x004123ba pop rbx | 0x004123bb pop r12 | 0x004123bd pop r14 | 0x004123bf pop r15 | 0x004123c1 ret | return rax; | label_3: 0x004123c2 cmp r12, 0x17 | | if (r12 == 0x17) { 0x004123c6 jne 0x4123cd | 0x004123c8 mov r15, r14 | r15 = r14; 0x004123cb jmp 0x4123d0 | | } else { 0x004123cd mov r15, qword [r14] | r15 = *(r14); | } 0x004123d0 mov eax, dword [r14 + 0x18] | eax = *((r14 + 0x18)); 0x004123d4 test eax, eax | | if (eax < 0) { 0x004123d6 js 0x4123fb | goto label_8; | } 0x004123d8 test eax, eax | | if (eax <= 0) { 0x004123da jle 0x412407 | goto label_9; | } | label_2: 0x004123dc mov eax, eax | 0x004123de xor ebx, ebx | ebx = 0; | label_1: 0x004123e0 cmp byte [r15 + rbx], 0x2f | | if (*((r15 + rbx)) != 0x2f) { 0x004123e5 jne 0x412309 | goto label_0; | } 0x004123eb inc rbx | rbx++; 0x004123ee cmp rax, rbx | | if (rax != rbx) { 0x004123f1 jne 0x4123e0 | goto label_1; | } 0x004123f3 mov rbx, rax | rbx = rax; 0x004123f6 jmp 0x412309 | goto label_0; | label_8: 0x004123fb mov rdi, r15 | 0x004123fe call 0x404a70 | eax = strlen (r15); 0x00412403 test eax, eax | | if (eax > 0) { 0x00412405 jg 0x4123dc | goto label_2; | } | label_9: 0x00412407 xor ebx, ebx | ebx = 0; 0x00412409 jmp 0x412309 | goto label_0; | }