; assembly | /* r2dec pseudo code output */ | /* balb_testmessages.t/none @ 0x41daf0 */ | #include | ; (fcn) method.BloombergLP::bdlde::Utf8Util.advanceIfValid_int__char_const__char_const__unsigned_long__long_ () | int64_t method_BloombergLP::bdlde::Utf8Util_advanceIfValid_int_char_const_char_const_unsigned_long_long_ (int64_t arg_4eh, int64_t arg_66h, int64_t arg_ch, int64_t arg_10h, int64_t arg_18h, int64_t arg_20h, int64_t arg_ch_2, int64_t arg_dh, int64_t arg_eh, int64_t arg_fh, int64_t arg_10h_2, int64_t arg_18h_2, int64_t arg_20h_2, int64_t arg5, uint32_t arg4, int64_t arg3, int64_t arg2, int64_t arg1) { | int64_t var_1eh; | r8 = arg5; | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* BloombergLP::bdlde::Utf8Util::advanceIfValid(int*, char const**, char const*, unsigned long, long) */ 0x0041daf0 push rbp | 0x0041daf1 push r14 | 0x0041daf3 push rbx | 0x0041daf4 test rcx, rcx | | if (rcx <= 0) { 0x0041daf7 jle 0x41dcec | goto label_3; | } 0x0041dafd add rcx, rdx | rcx += rdx; 0x0041db00 xor eax, eax | eax = 0; 0x0041db02 test r8, r8 | 0x0041db05 cmovs r8, rax | __asm ("cmovs r8, rax"); 0x0041db09 mov r9, rdx | r9 = rdx; 0x0041db0c jmp 0x41db1f | | while ((r10b & 0x1e) != 0) { | label_0: 0x0041db10 inc rax | rax++; 0x0041db13 mov r9, rdx | r9 = rdx; 0x0041db16 cmp rdx, rcx | | if (rdx >= rcx) { 0x0041db19 jae 0x41dcee | goto label_4; | } 0x0041db1f cmp r8, rax | | if (r8 == rax) { 0x0041db22 je 0x41dc75 | goto label_5; | } 0x0041db28 lea rdx, [r9 + 1] | rdx = r9 + 1; 0x0041db2c movzx r10d, byte [r9] | r10d = *(r9); 0x0041db30 mov rbx, r10 | rbx = r10; 0x0041db33 shr rbx, 4 | rbx >>= 4; | /* switch table (141 cases) at 0x448158 */ 0x0041db37 jmp qword [rbx*8 + 0x448158] | 0x0041db3e lea rbx, [r9 + 2] | rbx = r9 + 2; 0x0041db42 cmp rbx, rcx | | if (rbx > rcx) { 0x0041db45 ja 0x41dc88 | goto label_6; | } 0x0041db4b movzx edx, byte [rdx] | edx = *(rdx); 0x0041db4e and dl, 0xc0 | dl &= 0xc0; 0x0041db51 cmp dl, 0x80 | | if (dl != 0x80) { 0x0041db54 jne 0x41dce4 | goto label_7; | } 0x0041db5a mov rdx, rbx | rdx = rbx; 0x0041db5d test r10b, 0x1e | 0x0041db61 jne 0x41db10 | | } 0x0041db63 jmp 0x41dc80 | goto label_8; 0x0041db68 lea r11, [r9 + 3] | r11 = r9 + 3; 0x0041db6c cmp r11, rcx | | if (r11 > rcx) { 0x0041db6f ja 0x41dc90 | goto label_9; | } 0x0041db75 movzx ebx, byte [rdx] | ebx = *(rdx); 0x0041db78 mov edx, ebx | edx = ebx; 0x0041db7a and dl, 0xc0 | dl &= 0xc0; 0x0041db7d cmp dl, 0x80 | | if (dl != 0x80) { 0x0041db80 jne 0x41dce4 | goto label_7; | } 0x0041db86 movzx edx, byte [r9 + 2] | edx = *((r9 + 2)); 0x0041db8b and dl, 0xc0 | dl &= 0xc0; 0x0041db8e cmp dl, 0x80 | | if (dl != 0x80) { 0x0041db91 jne 0x41dce4 | goto label_7; | } 0x0041db97 and r10d, 0xf | r10d &= 0xf; 0x0041db9b shl r10d, 0xc | r10d <<= 0xc; 0x0041db9f and ebx, 0x3f | ebx &= 0x3f; 0x0041dba2 shl ebx, 6 | ebx <<= 6; 0x0041dba5 or ebx, r10d | ebx |= r10d; 0x0041dba8 cmp ebx, 0x7ff | | if (ebx <= 0x7ff) { 0x0041dbae jbe 0x41dc80 | goto label_8; | } 0x0041dbb4 and ebx, 0xf800 | ebx &= 0xf800; 0x0041dbba mov rdx, r11 | rdx = r11; 0x0041dbbd cmp ebx, 0xd800 | | if (ebx != 0xd800) { 0x0041dbc3 jne 0x41db10 | goto label_0; | } 0x0041dbc9 jmp 0x41dcb4 | goto label_10; 0x0041dbce test r10b, 8 | | if ((r10b & 8) != 0) { 0x0041dbd2 jne 0x41dcbc | goto label_11; | } 0x0041dbd8 lea r11, [r9 + 4] | r11 = r9 + 4; 0x0041dbdc cmp r11, rcx | | if (r11 > rcx) { 0x0041dbdf ja 0x41dcc4 | goto label_12; | } 0x0041dbe5 movzx ebp, byte [rdx] | ebp = *(rdx); 0x0041dbe8 mov ebx, ebp | ebx = ebp; 0x0041dbea and bl, 0xc0 | bl &= 0xc0; 0x0041dbed cmp bl, 0x80 | | if (bl != 0x80) { 0x0041dbf0 jne 0x41dce4 | goto label_7; | } 0x0041dbf6 movzx ebx, byte [r9 + 2] | ebx = *((r9 + 2)); 0x0041dbfb mov edx, ebx | edx = ebx; 0x0041dbfd and dl, 0xc0 | dl &= 0xc0; 0x0041dc00 cmp dl, 0x80 | | if (dl != 0x80) { 0x0041dc03 jne 0x41dce4 | goto label_7; | } 0x0041dc09 movzx r14d, byte [r9 + 3] | r14d = *((r9 + 3)); 0x0041dc0e mov edx, r14d | edx = r14d; 0x0041dc11 and dl, 0xc0 | dl &= 0xc0; 0x0041dc14 cmp dl, 0x80 | | if (dl != 0x80) { 0x0041dc17 jne 0x41dce4 | goto label_7; | } 0x0041dc1d and r10d, 7 | r10d &= 7; 0x0041dc21 shl r10d, 0x12 | r10d <<= 0x12; 0x0041dc25 and ebp, 0x3f | ebp &= 0x3f; 0x0041dc28 shl ebp, 0xc | ebp <<= 0xc; 0x0041dc2b or ebp, r10d | ebp |= r10d; 0x0041dc2e and ebx, 0x3f | ebx &= 0x3f; 0x0041dc31 shl ebx, 6 | ebx <<= 6; 0x0041dc34 or ebx, ebp | ebx |= ebp; 0x0041dc36 and r14d, 0x3f | r14d &= 0x3f; 0x0041dc3a lea ebp, [r14 + rbx - 0x10000] | ebp = r14 + rbx - 0x10000; 0x0041dc42 mov rdx, r11 | rdx = r11; 0x0041dc45 cmp ebp, 0x100000 | | if (ebp < 0x100000) { 0x0041dc4b jb 0x41db10 | goto label_0; | } 0x0041dc51 or ebx, r14d | ebx |= r14d; 0x0041dc54 xor ecx, ecx | ecx = 0; 0x0041dc56 cmp ebx, 0x110000 | 0x0041dc5c setb cl | cl = (ebx < 0x110000) ? 1 : 0; 0x0041dc5f lea ecx, [rcx + rcx - 6] | ecx = rcx + rcx - 6; 0x0041dc63 mov dword [rdi], ecx | *(rdi) = ecx; 0x0041dc65 jmp 0x41dc6d | goto label_1; 0x0041dc67 mov dword [rdi], 0xfffffffe | *(rdi) = 0xfffffffe; | do { | label_1: 0x0041dc6d mov qword [rsi], r9 | *(rsi) = r9; 0x0041dc70 pop rbx | 0x0041dc71 pop r14 | r14 = rbx; 0x0041dc73 pop rbp | 0x0041dc74 ret | return rax; | label_5: 0x0041dc75 mov dword [rdi], 0 | *(rdi) = 0; 0x0041dc7b mov rax, r8 | rax = r8; 0x0041dc7e jmp 0x41dc6d | | } while (1); | label_8: 0x0041dc80 mov dword [rdi], 0xfffffffc | *(rdi) = 0xfffffffc; 0x0041dc86 jmp 0x41dc6d | goto label_1; | label_6: 0x0041dc88 mov dword [rdi], 0xffffffff | *(rdi) = 0xffffffff; 0x0041dc8e jmp 0x41dc6d | goto label_1; | label_9: 0x0041dc90 lea r8, [r9 + 2] | r8 = r9 + 2; 0x0041dc94 mov ebx, 0xffffffff | ebx = 0xffffffff; 0x0041dc99 cmp r8, rcx | | if (r8 == rcx) { 0x0041dc9c jne 0x41dcb0 | 0x0041dc9e mov cl, byte [rdx] | cl = *(rdx); 0x0041dca0 and cl, 0xc0 | cl &= 0xc0; 0x0041dca3 xor ebx, ebx | ebx = 0; 0x0041dca5 cmp cl, 0x80 | 0x0041dca8 sete bl | bl = (cl == 0x80) ? 1 : 0; 0x0041dcab add ebx, ebx | ebx += ebx; 0x0041dcad or ebx, 0xfffffffd | ebx |= 0xfffffffd; | } 0x0041dcb0 mov dword [rdi], ebx | *(rdi) = ebx; 0x0041dcb2 jmp 0x41dc6d | goto label_1; | label_10: 0x0041dcb4 mov dword [rdi], 0xfffffff9 | *(rdi) = 0xfffffff9; 0x0041dcba jmp 0x41dc6d | goto label_1; | label_11: 0x0041dcbc mov dword [rdi], 0xfffffffb | *(rdi) = 0xfffffffb; 0x0041dcc2 jmp 0x41dc6d | goto label_1; | label_12: 0x0041dcc4 mov dword [rdi], 0xffffffff | *(rdi) = 0xffffffff; 0x0041dcca cmp rdx, rcx | | if (rdx >= rcx) { 0x0041dccd jae 0x41dc6d | goto label_1; | } | do { 0x0041dccf movzx ebx, byte [rdx] | ebx = *(rdx); 0x0041dcd2 and bl, 0xc0 | bl &= 0xc0; 0x0041dcd5 cmp bl, 0x80 | | if (bl != 0x80) { 0x0041dcd8 jne 0x41dce4 | goto label_7; | } 0x0041dcda inc rdx | rdx++; 0x0041dcdd cmp rcx, rdx | 0x0041dce0 jne 0x41dccf | | } while (rcx != rdx); 0x0041dce2 jmp 0x41dc6d | goto label_1; | label_7: 0x0041dce4 mov dword [rdi], 0xfffffffd | *(rdi) = 0xfffffffd; 0x0041dcea jmp 0x41dc6d | goto label_1; | label_3: 0x0041dcec xor eax, eax | eax = 0; | label_4: 0x0041dcee mov dword [rdi], 0 | *(rdi) = 0; 0x0041dcf4 mov r9, rdx | r9 = rdx; 0x0041dcf7 jmp 0x41dc6d | goto label_1; 0x0041dd0b mov r8d, 4 | r8d = 4; 0x0041dd11 nop word cs:[rax + rax] | 0x0041dd1b nop dword [rax + rax] | | do { | label_2: 0x0041dd20 add rsi, r8 | rsi += r8; 0x0041dd23 inc rax | rax++; 0x0041dd26 cmp rdx, rax | | if (rdx == rax) { 0x0041dd29 je 0x41dd5a | goto label_13; | } 0x0041dd2b movzx r9d, byte [rsi] | r9d = *(rsi); 0x0041dd2f mov r8d, 1 | r8d = 1; 0x0041dd35 mov rcx, r9 | rcx = r9; 0x0041dd38 shr rcx, 4 | rcx >>= 4; | /* switch table (125 cases) at 0x4481d8 */ 0x0041dd3c jmp qword [rcx*8 + 0x4481d8] | 0x0041dd43 mov r8d, 2 | r8d = 2; 0x0041dd49 jmp 0x41dd20 | | } while (1); 0x0041dd4b test r9b, r9b | | if (r9b != 0) { 0x0041dd4e jne 0x41dd20 | goto label_2; | } 0x0041dd50 jmp 0x41dd07 | void (*0x41dd07)() (); 0x0041dd52 mov r8d, 3 | r8d = 3; 0x0041dd58 jmp 0x41dd20 | goto label_2; | label_13: 0x0041dd5a mov rax, rdx | rax = rdx; 0x0041dd5d mov qword [rdi], rsi | *(rdi) = rsi; 0x0041dd60 ret | return rax; | }