; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/assume @ 0x412140 */ | #include | ; (fcn) method.BloombergLP::bdls::PathUtil.appendRaw_bsl::basic_string_char__std::__1::char_traits_char___bsl::allocator_char_____char_const__int__int_ () | uint64_t method_BloombergLP::bdls::PathUtil_appendRaw_bsl::basic_string_char_std::_1::char_traits_char_bsl::allocator_char_char_const_int_int_ (int64_t arg4, int64_t arg3, uint32_t arg2, int64_t arg1) { | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdls::PathUtil::appendRaw(bsl::basic_string, bsl::allocator >*, char const*, int, int) */ 0x00412140 push rbp | 0x00412141 push r15 | 0x00412143 push r14 | 0x00412145 push r13 | 0x00412147 push r12 | 0x00412149 push rbx | 0x0041214a push rax | 0x0041214b mov ebx, ecx | ebx = ecx; 0x0041214d mov r12d, edx | r12d = edx; 0x00412150 mov r14, rsi | r14 = rsi; 0x00412153 mov r15, rdi | r15 = rdi; 0x00412156 test edx, edx | | if (edx < 0) { 0x00412158 jns 0x412165 | 0x0041215a mov rdi, r14 | 0x0041215d call 0x404a70 | rax = strlen (r14); 0x00412162 mov r12, rax | r12 = rax; | } 0x00412165 test r12d, r12d | | if (r12d <= 0) { 0x00412168 jle 0x412235 | goto label_3; | } 0x0041216e mov rbp, qword [r15 + 0x20] | rbp = *((r15 + 0x20)); 0x00412172 test ebx, ebx | | if (ebx < 0) { 0x00412174 js 0x4121ce | goto label_4; | } | label_0: 0x00412176 cmp rbp, 0x17 | | if (rbp == 0x17) { 0x0041217a jne 0x412181 | 0x0041217c mov r13, r15 | r13 = r15; 0x0041217f jmp 0x412184 | | } else { 0x00412181 mov r13, qword [r15] | r13 = *(r15); | } 0x00412184 mov rdi, r13 | 0x00412187 call 0x404a70 | eax = strlen (*(r15)); 0x0041218c mov edx, eax | edx = eax; 0x0041218e mov ecx, eax | ecx = eax; 0x00412190 sar ecx, 0x1f | ecx >>= 0x1f; 0x00412193 and ecx, eax | ecx &= eax; 0x00412195 lea rdx, [rdx + r13 - 1] | rdx = rdx + r13 - 1; 0x0041219a nop word [rax + rax] | | do { 0x004121a0 test eax, eax | | if (eax <= 0) { 0x004121a2 jle 0x4121b3 | goto label_5; | } 0x004121a4 dec eax | eax--; 0x004121a6 cmp byte [rdx], 0x2f | 0x004121a9 lea rdx, [rdx - 1] | rdx = rdx - 1; 0x004121ad je 0x4121a0 | | } while (*(rdx) == 0x2f); 0x004121af inc eax | eax++; 0x004121b1 mov ecx, eax | ecx = eax; | label_5: 0x004121b3 cmp ebx, ecx | | if (ebx < ecx) { 0x004121b5 jl 0x412215 | goto label_6; | } 0x004121b7 test ebx, ebx | | if (ebx <= 0) { 0x004121b9 jle 0x412222 | goto label_7; | } 0x004121bb dec ebx | ebx--; 0x004121bd cmp rbp, 0x17 | | if (rbp != 0x17) { 0x004121c1 jne 0x41220c | goto label_8; | } 0x004121c3 mov rax, r15 | rax = r15; 0x004121c6 cmp byte [rax + rbx], 0x2f | | if (*((rax + rbx)) != 0x2f) { 0x004121ca jne 0x412215 | goto label_6; | } 0x004121cc jmp 0x412222 | goto label_7; | label_4: 0x004121ce cmp rbp, 0x17 | | if (rbp == 0x17) { 0x004121d2 jne 0x4121d9 | 0x004121d4 mov r13, r15 | r13 = r15; 0x004121d7 jmp 0x4121dc | | } else { 0x004121d9 mov r13, qword [r15] | r13 = *(r15); | } 0x004121dc mov eax, dword [r15 + 0x18] | eax = *((r15 + 0x18)); 0x004121e0 test eax, eax | | if (eax < 0) { 0x004121e2 js 0x412244 | goto label_9; | } 0x004121e4 test eax, eax | | if (eax <= 0) { 0x004121e6 jle 0x412250 | goto label_10; | } | label_2: 0x004121e8 mov eax, eax | 0x004121ea xor ebx, ebx | ebx = 0; 0x004121ec nop dword [rax] | | label_1: 0x004121f0 cmp byte [r13 + rbx], 0x2f | | if (*((r13 + rbx)) != 0x2f) { 0x004121f6 jne 0x412176 | goto label_0; | } 0x004121fc inc rbx | rbx++; 0x004121ff cmp rax, rbx | | if (rax != rbx) { 0x00412202 jne 0x4121f0 | goto label_1; | } 0x00412204 mov rbx, rax | rbx = rax; 0x00412207 jmp 0x412176 | goto label_0; | label_8: 0x0041220c mov rax, qword [r15] | rax = *(r15); 0x0041220f cmp byte [rax + rbx], 0x2f | | if (*((rax + rbx)) != 0x2f) { 0x00412213 je 0x412222 | | label_6: 0x00412215 mov rdi, r15 | 0x00412218 mov esi, 0x2f | 0x0041221d call 0x41bcb0 | bsl::basic_string,bsl::allocator>::push_back(char) (r15, 0x2f); | } | label_7: 0x00412222 movsxd rdx, r12d | rdx = (int64_t) r12d; 0x00412225 mov ecx, 0x43c901 | 0x0041222a mov rdi, r15 | 0x0041222d mov rsi, r14 | 0x00412230 call 0x41a250 | bsl::basic_string,bsl::allocator>::privateAppend(char const*,unsigned long,char const*) (r15, r14, rdx, "string<...>::append(char*...): string too long"); | label_3: 0x00412235 add rsp, 8 | 0x00412239 pop rbx | 0x0041223a pop r12 | 0x0041223c pop r13 | 0x0041223e pop r14 | 0x00412240 pop r15 | 0x00412242 pop rbp | 0x00412243 ret | return rax; | label_9: 0x00412244 mov rdi, r13 | 0x00412247 call 0x404a70 | eax = strlen (r13); 0x0041224c test eax, eax | | if (eax > 0) { 0x0041224e jg 0x4121e8 | goto label_2; | } | label_10: 0x00412250 xor ebx, ebx | ebx = 0; 0x00412252 jmp 0x412176 | goto label_0; | }