; assembly | /* r2dec pseudo code output */ | /* balb_filecleanerutil.t/none @ 0x4120d0 */ | #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) */ 0x004120d0 push rbp | 0x004120d1 push r15 | 0x004120d3 push r14 | 0x004120d5 push r13 | 0x004120d7 push r12 | 0x004120d9 push rbx | 0x004120da push rax | 0x004120db mov r13d, ecx | r13d = ecx; 0x004120de mov r12d, edx | r12d = edx; 0x004120e1 mov rbp, rsi | 0x004120e4 mov r15, rdi | r15 = rdi; 0x004120e7 test edx, edx | | if (edx < 0) { 0x004120e9 jns 0x4120f6 | 0x004120eb mov rdi, rbp | 0x004120ee call 0x404a70 | rax = strlen (rbp); 0x004120f3 mov r12, rax | r12 = rax; | } 0x004120f6 test r12d, r12d | | if (r12d <= 0) { 0x004120f9 jle 0x412235 | goto label_6; | } 0x004120ff mov rcx, qword [r15 + 0x20] | rcx = *((r15 + 0x20)); 0x00412103 test r13d, r13d | | if (r13d < 0) { 0x00412106 js 0x412188 | goto label_7; | } | label_2: 0x0041210c cmp rcx, 0x17 | 0x00412110 mov qword [rsp], rcx | *(rsp) = rcx; 0x00412114 mov r14, rbp | r14 = rbp; | if (rcx == 0x17) { 0x00412117 jne 0x41211e | 0x00412119 mov rbx, r15 | rbx = r15; 0x0041211c jmp 0x412121 | | } else { 0x0041211e mov rbx, qword [r15] | rbx = *(r15); | } 0x00412121 mov rdi, rbx | 0x00412124 call 0x404a70 | rax = strlen (*(r15)); 0x00412129 mov rbp, rax | 0x0041212c mov eax, r13d | eax = r13d; 0x0041212f test r13d, r13d | | if (r13d < 0) { 0x00412132 js 0x412193 | goto label_8; | } | label_0: 0x00412134 mov edx, ebp | edx = ebp; 0x00412136 mov ecx, ebp | ecx = ebp; 0x00412138 sar ecx, 0x1f | ecx >>= 0x1f; 0x0041213b and ecx, ebp | ecx &= ebp; 0x0041213d nop dword [rax] | | do { 0x00412140 test edx, edx | | if (edx <= 0) { 0x00412142 jle 0x412156 | goto label_9; | } 0x00412144 lea rsi, [rdx - 1] | rsi = rdx - 1; 0x00412148 cmp byte [rbx + rdx - 1], 0x2f | 0x0041214d mov rdx, rsi | rdx = rsi; 0x00412150 je 0x412140 | | } while (*((rbx + rdx - 1)) == 0x2f); 0x00412152 inc esi | esi++; 0x00412154 mov ecx, esi | ecx = esi; | label_9: 0x00412156 cmp eax, ecx | | if (eax < ecx) { 0x00412158 jl 0x412215 | goto label_10; | } 0x0041215e test r13d, r13d | | if (r13d <= 0) { 0x00412161 jle 0x412222 | goto label_11; | } 0x00412167 dec r13d | r13d--; 0x0041216a cmp qword [rsp], 0x17 | | if (*(rsp) != 0x17) { 0x0041216f jne 0x41220b | goto label_12; | } 0x00412175 mov rax, r15 | rax = r15; 0x00412178 cmp byte [rax + r13], 0x2f | | if (*((rax + r13)) != 0x2f) { 0x0041217d jne 0x412215 | goto label_10; | } 0x00412183 jmp 0x412222 | goto label_11; | label_7: 0x00412188 cmp rcx, 0x17 | | if (rcx != 0x17) { 0x0041218c jne 0x4121ca | goto label_13; | } 0x0041218e mov rbx, r15 | rbx = r15; 0x00412191 jmp 0x4121cd | goto label_14; | label_8: 0x00412193 mov eax, ebp | eax = ebp; 0x00412195 test ebp, ebp | | if (ebp < 0) { 0x00412197 js 0x412244 | goto label_15; | } 0x0041219d test eax, eax | | if (eax <= 0) { 0x0041219f jle 0x412254 | goto label_16; | } | label_4: 0x004121a5 mov ecx, eax | ecx = eax; 0x004121a7 xor eax, eax | eax = 0; 0x004121a9 nop dword [rax] | | label_1: 0x004121b0 cmp byte [rbx + rax], 0x2f | | if (*((rbx + rax)) != 0x2f) { 0x004121b4 jne 0x412134 | goto label_0; | } 0x004121ba inc rax | rax++; 0x004121bd cmp rcx, rax | | if (rcx != rax) { 0x004121c0 jne 0x4121b0 | goto label_1; | } 0x004121c2 mov rax, rcx | rax = rcx; 0x004121c5 jmp 0x412134 | goto label_0; | label_13: 0x004121ca mov rbx, qword [r15] | rbx = *(r15); | label_14: 0x004121cd mov eax, dword [r15 + 0x18] | eax = *((r15 + 0x18)); 0x004121d1 test eax, eax | | if (eax < 0) { 0x004121d3 js 0x41225b | goto label_17; | } 0x004121d9 test eax, eax | | if (eax <= 0) { 0x004121db jle 0x412271 | goto label_18; | } | label_5: 0x004121e1 mov eax, eax | 0x004121e3 xor r13d, r13d | r13d = 0; 0x004121e6 nop word cs:[rax + rax] | | label_3: 0x004121f0 cmp byte [rbx + r13], 0x2f | | if (*((rbx + r13)) != 0x2f) { 0x004121f5 jne 0x41210c | goto label_2; | } 0x004121fb inc r13 | r13++; 0x004121fe cmp rax, r13 | | if (rax != r13) { 0x00412201 jne 0x4121f0 | goto label_3; | } 0x00412203 mov r13, rax | r13 = rax; 0x00412206 jmp 0x41210c | goto label_2; | label_12: 0x0041220b mov rax, qword [r15] | rax = *(r15); 0x0041220e cmp byte [rax + r13], 0x2f | | if (*((rax + r13)) != 0x2f) { 0x00412213 je 0x412222 | | label_10: 0x00412215 mov rdi, r15 | 0x00412218 mov esi, 0x2f | 0x0041221d call 0x41bea0 | bsl::basic_string,bsl::allocator>::push_back(char) (r15, 0x2f); | } | label_11: 0x00412222 movsxd rdx, r12d | rdx = (int64_t) r12d; 0x00412225 mov ecx, 0x43cb2d | 0x0041222a mov rdi, r15 | 0x0041222d mov rsi, r14 | 0x00412230 call 0x41a440 | bsl::basic_string,bsl::allocator>::privateAppend(char const*,unsigned long,char const*) (r15, r14, rdx, "string<...>::append(char*...): string too long"); | label_6: 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_15: 0x00412244 mov rdi, rbx | 0x00412247 call 0x404a70 | eax = strlen (rbx); 0x0041224c test eax, eax | | if (eax > 0) { 0x0041224e jg 0x4121a5 | goto label_4; | } | label_16: 0x00412254 xor eax, eax | eax = 0; 0x00412256 jmp 0x412134 | goto label_0; | label_17: 0x0041225b mov rdi, rbx | 0x0041225e mov r14, rcx | r14 = rcx; 0x00412261 call 0x404a70 | eax = strlen (rbx); 0x00412266 mov rcx, r14 | rcx = r14; 0x00412269 test eax, eax | | if (eax > 0) { 0x0041226b jg 0x4121e1 | goto label_5; | } | label_18: 0x00412271 xor r13d, r13d | r13d = 0; 0x00412274 jmp 0x41210c | goto label_2; | }