// File: jgeumlek[P]moltengamepadctl/source/oscpkt/oscpkt.hh
// Function: oscpkt::PacketReader::parse(char const*, char const*, oscpkt::TimeTag)
void parse(const char *beg, const char *end, TimeTag time_tag) {
    assert(beg <= end && !err); assert(((end-beg)%4)==0);
    
    if (beg == end) return;
    if (*beg == '#') {
      /* it's a bundle */
      if (end - beg >= 20 
          && memcmp(beg, "#bundle\0", 8) == 0) {
        TimeTag time_tag2(bytes2pod<uint64_t>(beg+8));
        const char *pos = beg + 16;
        do {
          uint32_t sz = bytes2pod<uint32_t>(pos); pos += 4;
          if ((sz&3) != 0 || pos + sz > end || pos+sz < pos) {
            OSCPKT_SET_ERR(INVALID_BUNDLE);
          } else {
            parse(pos, pos+sz, time_tag2);
            pos += sz;
          }
        } while (!err && pos != end);
      } else {
        OSCPKT_SET_ERR(INVALID_BUNDLE);
      }
    } else {
      messages.push_back(Message(beg, end-beg, time_tag));
      if (!messages.back().isOk()) OSCPKT_SET_ERR(messages.back().getErr());
    }
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xf0, %rsp
movq %rcx, -0x8(%rbp)
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0x18(%rbp), %rcx
xorl %eax, %eax
cmpq -0x20(%rbp), %rcx
movb %al, -0xd5(%rbp)
ja 0x8bce
movq -0xe0(%rbp), %rax
cmpl $0x0, 0x20(%rax)
setne %al
xorb $-0x1, %al
movb %al, -0xd5(%rbp)
movb -0xd5(%rbp), %al
testb $0x1, %al
jne 0x8bda
jmp 0x8bdc
jmp 0x8bfb
leaq 0x5801(%rip), %rdi      # 0xe3e4
leaq 0x576b(%rip), %rsi      # 0xe355
movl $0x216, %edx            # imm = 0x216
leaq 0x5801(%rip), %rcx      # 0xe3f7
callq 0x31d0
movq -0x20(%rbp), %rax
movq -0x18(%rbp), %rcx
subq %rcx, %rax
movl $0x4, %ecx
cqto
idivq %rcx
cmpq $0x0, %rdx
jne 0x8c18
jmp 0x8c37
leaq 0x581e(%rip), %rdi      # 0xe43d
leaq 0x572f(%rip), %rsi      # 0xe355
movl $0x216, %edx            # imm = 0x216
leaq 0x57c5(%rip), %rcx      # 0xe3f7
callq 0x31d0
movq -0x18(%rbp), %rax
cmpq -0x20(%rbp), %rax
jne 0x8c46
jmp 0x8e6b
movq -0x18(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x23, %eax
jne 0x8dab
movq -0x20(%rbp), %rax
movq -0x18(%rbp), %rcx
subq %rcx, %rax
cmpq $0x14, %rax
jl 0x8d85
movq -0x18(%rbp), %rax
movq (%rax), %rax
movabsq $0x656c646e756223, %rcx # imm = 0x656C646E756223
subq %rcx, %rax
setne %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x8d85
movq -0x18(%rbp), %rdi
addq $0x8, %rdi
callq 0x90d0
movq %rax, %rsi
leaq -0x28(%rbp), %rdi
callq 0x79d0
movq -0x18(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
callq 0x9150
movl %eax, -0x34(%rbp)
movq -0x30(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x30(%rbp)
movl -0x34(%rbp), %eax
andl $0x3, %eax
cmpl $0x0, %eax
jne 0x8cf6
movq -0x30(%rbp), %rax
movl -0x34(%rbp), %ecx
addq %rcx, %rax
cmpq -0x20(%rbp), %rax
ja 0x8cf6
movq -0x30(%rbp), %rax
movl -0x34(%rbp), %ecx
addq %rcx, %rax
cmpq -0x30(%rbp), %rax
jae 0x8d17
jmp 0x8cf8
movq -0xe0(%rbp), %rax
cmpl $0x0, 0x20(%rax)
jne 0x8d13
movq -0xe0(%rbp), %rax
movl $0x8, 0x20(%rax)
jmp 0x8d15
jmp 0x8d4d
movq -0xe0(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x30(%rbp), %rdx
movl -0x34(%rbp), %eax
addq %rax, %rdx
movq -0x28(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rcx
callq 0x8b80
movl -0x34(%rbp), %ecx
movq -0x30(%rbp), %rax
movl %ecx, %ecx
addq %rcx, %rax
movq %rax, -0x30(%rbp)
jmp 0x8d4f
movq -0xe0(%rbp), %rcx
xorl %eax, %eax
cmpl $0x0, 0x20(%rcx)
movb %al, -0xe1(%rbp)
jne 0x8d75
movq -0x30(%rbp), %rax
cmpq -0x20(%rbp), %rax
setne %al
movb %al, -0xe1(%rbp)
movb -0xe1(%rbp), %al
testb $0x1, %al
jne 0x8cb3
jmp 0x8da6
jmp 0x8d87
movq -0xe0(%rbp), %rax
cmpl $0x0, 0x20(%rax)
jne 0x8da2
movq -0xe0(%rbp), %rax
movl $0x8, 0x20(%rax)
jmp 0x8da4
jmp 0x8da6
jmp 0x8e6b
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
subq %rsi, %rdx
movq -0x8(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rcx
leaq -0xc0(%rbp), %rdi
movq %rdi, -0xf0(%rbp)
callq 0x9200
movq -0xe0(%rbp), %rdi
movq -0xf0(%rbp), %rsi
callq 0x91c0
jmp 0x8df0
leaq -0xc0(%rbp), %rdi
callq 0x5c00
movq -0xe0(%rbp), %rdi
callq 0x92e0
movq %rax, %rdi
callq 0x8750
testb $0x1, %al
jne 0x8e69
jmp 0x8e16
movq -0xe0(%rbp), %rax
cmpl $0x0, 0x20(%rax)
jne 0x8e65
movq -0xe0(%rbp), %rdi
callq 0x92e0
movq %rax, %rdi
callq 0x8770
movl %eax, %ecx
movq -0xe0(%rbp), %rax
movl %ecx, 0x20(%rax)
jmp 0x8e65
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
leaq -0xc0(%rbp), %rdi
callq 0x5c00
jmp 0x8e74
jmp 0x8e67
jmp 0x8e69
jmp 0x8e6b
addq $0xf0, %rsp
popq %rbp
retq
movq -0xd0(%rbp), %rdi
callq 0x3470