; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/none @ 0x412310 */ | #include | ; (fcn) method.BloombergLP::bdls::PathUtil.popLeaf_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____int_ () | uint64_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) */ 0x00412310 push r15 | 0x00412312 push r14 | 0x00412314 push r13 | 0x00412316 push r12 | 0x00412318 push rbx | 0x00412319 mov r15d, esi | r15d = esi; 0x0041231c mov r14, rdi | r14 = rdi; 0x0041231f mov r13, qword [rdi + 0x20] | r13 = *((rdi + 0x20)); 0x00412323 test esi, esi | | if (esi < 0) { 0x00412325 js 0x412410 | goto label_6; | } | label_2: 0x0041232b cmp r13, 0x17 | | if (r13 == 0x17) { 0x0041232f jne 0x412336 | 0x00412331 mov rbx, r14 | rbx = r14; 0x00412334 jmp 0x412339 | | } else { 0x00412336 mov rbx, qword [r14] | rbx = *(r14); | } 0x00412339 mov rdi, rbx | 0x0041233c call 0x404a70 | rax = strlen (*(r14)); 0x00412341 mov r12, rax | r12 = rax; 0x00412344 mov ecx, r15d | ecx = r15d; 0x00412347 test r15d, r15d | | if (r15d < 0) { 0x0041234a js 0x41241b | goto label_7; | } | label_0: 0x00412350 mov eax, r12d | eax = r12d; 0x00412353 mov edx, r12d | edx = r12d; 0x00412356 sar edx, 0x1f | edx >>= 0x1f; 0x00412359 and edx, r12d | edx &= r12d; 0x0041235c nop dword [rax] | | do { 0x00412360 test eax, eax | | if (eax <= 0) { 0x00412362 jle 0x412376 | goto label_8; | } 0x00412364 lea rsi, [rax - 1] | rsi = rax - 1; 0x00412368 cmp byte [rbx + rax - 1], 0x2f | 0x0041236d mov rax, rsi | rax = rsi; 0x00412370 je 0x412360 | | } while (*((rbx + rax - 1)) == 0x2f); 0x00412372 inc esi | esi++; 0x00412374 mov edx, esi | edx = esi; | label_8: 0x00412376 mov eax, 0xffffffff | eax = 0xffffffff; 0x0041237b cmp ecx, edx | | if (ecx >= edx) { 0x0041237d jge 0x412406 | goto label_9; | } 0x00412383 mov rbx, r14 | rbx = r14; 0x00412386 cmp r13, 0x17 | | if (r13 != 0x17) { 0x0041238a je 0x41238f | 0x0041238c mov rbx, qword [r14] | rbx = *(r14); | } 0x0041238f mov eax, dword [r14 + 0x18] | eax = *((r14 + 0x18)); 0x00412393 test eax, eax | | if (eax < 0) { 0x00412395 jns 0x41239f | 0x00412397 mov rdi, rbx | 0x0041239a call 0x404a70 | eax = strlen (rbx); | } 0x0041239f mov edx, eax | edx = eax; 0x004123a1 mov ecx, eax | ecx = eax; 0x004123a3 sar ecx, 0x1f | ecx >>= 0x1f; 0x004123a6 and ecx, eax | ecx &= eax; 0x004123a8 nop dword [rax + rax] | | do { 0x004123b0 test edx, edx | | if (edx <= 0) { 0x004123b2 jle 0x4123c6 | goto label_10; | } 0x004123b4 lea rax, [rdx - 1] | rax = rdx - 1; 0x004123b8 cmp byte [rbx + rdx - 1], 0x2f | 0x004123bd mov rdx, rax | rdx = rax; 0x004123c0 je 0x4123b0 | | } while (*((rbx + rdx - 1)) == 0x2f); 0x004123c2 inc eax | eax++; 0x004123c4 mov ecx, eax | ecx = eax; | label_10: 0x004123c6 movsxd rcx, ecx | rcx = (int64_t) ecx; 0x004123c9 movsxd rax, r15d | rax = (int64_t) r15d; 0x004123cc add rax, rbx | rax += rbx; 0x004123cf dec rcx | rcx--; 0x004123d2 nop word cs:[rax + rax] | 0x004123dc nop dword [rax] | | do { 0x004123e0 mov rsi, rcx | rsi = rcx; 0x004123e3 lea rdx, [rbx + rcx] | rdx = rbx + rcx; 0x004123e7 cmp rdx, rax | | if (rdx <= rax) { 0x004123ea jbe 0x4123f5 | goto label_11; | } 0x004123ec lea rcx, [rsi - 1] | rcx = rsi - 1; 0x004123f0 cmp byte [rdx], 0x2f | 0x004123f3 jne 0x4123e0 | | } while (*(rdx) != 0x2f); | label_11: 0x004123f5 mov rdi, r14 | 0x004123f8 mov rdx, 0xffffffffffffffff | 0x004123ff call 0x41c4e0 | eax = bsl::basic_string,bsl::allocator>::erase(unsigned long,unsigned long) (r14, rsi, 0xffffffffffffffff); 0x00412404 xor eax, eax | eax = 0; | label_9: 0x00412406 pop rbx | 0x00412407 pop r12 | 0x00412409 pop r13 | 0x0041240b pop r14 | 0x0041240d pop r15 | 0x0041240f ret | return rax; | label_6: 0x00412410 cmp r13, 0x17 | | if (r13 != 0x17) { 0x00412414 jne 0x41244a | goto label_12; | } 0x00412416 mov rbx, r14 | rbx = r14; 0x00412419 jmp 0x41244d | goto label_13; | label_7: 0x0041241b mov eax, r12d | eax = r12d; 0x0041241e test r12d, r12d | | if (r12d < 0) { 0x00412421 js 0x41247b | goto label_14; | } 0x00412423 test eax, eax | | if (eax <= 0) { 0x00412425 jle 0x412487 | goto label_15; | } | label_4: 0x00412427 mov eax, eax | 0x00412429 xor ecx, ecx | ecx = 0; 0x0041242b nop dword [rax + rax] | | label_1: 0x00412430 cmp byte [rbx + rcx], 0x2f | | if (*((rbx + rcx)) != 0x2f) { 0x00412434 jne 0x412350 | goto label_0; | } 0x0041243a inc rcx | rcx++; 0x0041243d cmp rax, rcx | | if (rax != rcx) { 0x00412440 jne 0x412430 | goto label_1; | } 0x00412442 mov rcx, rax | rcx = rax; 0x00412445 jmp 0x412350 | goto label_0; | label_12: 0x0041244a mov rbx, qword [r14] | rbx = *(r14); | label_13: 0x0041244d mov eax, dword [r14 + 0x18] | eax = *((r14 + 0x18)); 0x00412451 test eax, eax | | if (eax < 0) { 0x00412453 js 0x41248e | goto label_16; | } 0x00412455 test eax, eax | | if (eax <= 0) { 0x00412457 jle 0x41249a | goto label_17; | } | label_5: 0x00412459 mov eax, eax | 0x0041245b xor r15d, r15d | r15d = 0; 0x0041245e nop | | label_3: 0x00412460 cmp byte [rbx + r15], 0x2f | | if (*((rbx + r15)) != 0x2f) { 0x00412465 jne 0x41232b | goto label_2; | } 0x0041246b inc r15 | r15++; 0x0041246e cmp rax, r15 | | if (rax != r15) { 0x00412471 jne 0x412460 | goto label_3; | } 0x00412473 mov r15, rax | r15 = rax; 0x00412476 jmp 0x41232b | goto label_2; | label_14: 0x0041247b mov rdi, rbx | 0x0041247e call 0x404a70 | eax = strlen (rbx); 0x00412483 test eax, eax | | if (eax > 0) { 0x00412485 jg 0x412427 | goto label_4; | } | label_15: 0x00412487 xor ecx, ecx | ecx = 0; 0x00412489 jmp 0x412350 | goto label_0; | label_16: 0x0041248e mov rdi, rbx | 0x00412491 call 0x404a70 | eax = strlen (rbx); 0x00412496 test eax, eax | | if (eax > 0) { 0x00412498 jg 0x412459 | goto label_5; | } | label_17: 0x0041249a xor r15d, r15d | r15d = 0; 0x0041249d jmp 0x41232b | goto label_2; | }