// File: jgeumlek[P]moltengamepadctl/source/oscpkt/oscpkt.hh
// Function: oscpkt::Message::getArgSize(int, char const*)
size_t getArgSize(int type, const char *p) {
    if (err) return 0;
    size_t sz = 0;
    assert(p >= storage.begin() && p <= storage.end());
    switch (type) {
      case TYPE_TAG_TRUE:
      case TYPE_TAG_FALSE: sz = 0; break;
      case TYPE_TAG_INT32: 
      case TYPE_TAG_FLOAT: sz = 4; break;
      case TYPE_TAG_INT64: 
      case TYPE_TAG_DOUBLE: sz = 8; break;
      case TYPE_TAG_STRING: {
        const char *q = (const char*)memchr(p, 0, storage.end()-p);
        if (!q) OSCPKT_SET_ERR(MALFORMED_ARGUMENTS);
        else sz = (q-p)+1;
      } break;
      case TYPE_TAG_BLOB: {
        if (p == storage.end()) { OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); return 0; }
        sz = 4+bytes2pod<uint32_t>(p);
      } break;
      default: {
        OSCPKT_SET_ERR(UNHANDLED_TYPE_TAGS); return 0;
      } break;
    }
    if (p+sz > storage.end() || /* string or blob too large.. */
        p+sz < p /* or even blob so large that it did overflow */) { 
      OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); return 0; 
    }
    if (!isZeroPaddingCorrect(p+sz)) { OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); return 0; }
    return sz;
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
cmpl $0x0, 0x78(%rax)
je 0x9ebe
movq $0x0, -0x8(%rbp)
jmp 0xa106
movq -0x38(%rbp), %rdi
movq $0x0, -0x28(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x48(%rbp)
addq $0x60, %rdi
callq 0x89f0
movq -0x48(%rbp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, -0x39(%rbp)
jb 0x9f11
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rax
movq %rax, -0x50(%rbp)
addq $0x60, %rdi
callq 0x9d60
movq %rax, %rcx
movq -0x50(%rbp), %rax
cmpq %rcx, %rax
setbe %al
movb %al, -0x39(%rbp)
movb -0x39(%rbp), %al
testb $0x1, %al
jne 0x9f1a
jmp 0x9f1c
jmp 0x9f3b
leaq 0x45ae(%rip), %rdi      # 0xe4d1
leaq 0x442b(%rip), %rsi      # 0xe355
movl $0x1bb, %edx            # imm = 0x1BB
leaq 0x45c6(%rip), %rcx      # 0xe4fc
callq 0x31d0
movl -0x14(%rbp), %eax
addl $-0x46, %eax
movl %eax, %ecx
movq %rcx, -0x58(%rbp)
subl $0x2d, %eax
ja 0xa04e
movq -0x58(%rbp), %rax
leaq 0x40a9(%rip), %rcx      # 0xe004
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq $0x0, -0x28(%rbp)
jmp 0xa074
movq $0x4, -0x28(%rbp)
jmp 0xa074
movq $0x8, -0x28(%rbp)
jmp 0xa074
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rax
movq %rax, -0x60(%rbp)
addq $0x60, %rdi
callq 0x9d60
movq -0x60(%rbp), %rdi
movq %rax, %rdx
movq -0x20(%rbp), %rax
subq %rax, %rdx
xorl %esi, %esi
callq 0x3300
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jne 0x9fdb
jmp 0x9fc2
movq -0x38(%rbp), %rax
cmpl $0x0, 0x78(%rax)
jne 0x9fd7
movq -0x38(%rbp), %rax
movl $0x3, 0x78(%rax)
jmp 0x9fd9
jmp 0x9fee
movq -0x30(%rbp), %rax
movq -0x20(%rbp), %rcx
subq %rcx, %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0xa074
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rax
movq %rax, -0x68(%rbp)
addq $0x60, %rdi
callq 0x9d60
movq %rax, %rcx
movq -0x68(%rbp), %rax
cmpq %rcx, %rax
jne 0xa03a
jmp 0xa016
movq -0x38(%rbp), %rax
cmpl $0x0, 0x78(%rax)
jne 0xa02b
movq -0x38(%rbp), %rax
movl $0x3, 0x78(%rax)
jmp 0xa02d
movq $0x0, -0x8(%rbp)
jmp 0xa106
movq -0x20(%rbp), %rdi
callq 0x9150
addl $0x4, %eax
movl %eax, %eax
movq %rax, -0x28(%rbp)
jmp 0xa074
jmp 0xa050
movq -0x38(%rbp), %rax
cmpl $0x0, 0x78(%rax)
jne 0xa065
movq -0x38(%rbp), %rax
movl $0x4, 0x78(%rax)
jmp 0xa067
movq $0x0, -0x8(%rbp)
jmp 0xa106
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rax
addq -0x28(%rbp), %rax
movq %rax, -0x70(%rbp)
addq $0x60, %rdi
callq 0x9d60
movq %rax, %rcx
movq -0x70(%rbp), %rax
cmpq %rcx, %rax
ja 0xa0a7
movq -0x20(%rbp), %rax
addq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0xa0ca
jmp 0xa0a9
movq -0x38(%rbp), %rax
cmpl $0x0, 0x78(%rax)
jne 0xa0be
movq -0x38(%rbp), %rax
movl $0x3, 0x78(%rax)
jmp 0xa0c0
movq $0x0, -0x8(%rbp)
jmp 0xa106
movq -0x20(%rbp), %rdi
addq -0x28(%rbp), %rdi
callq 0x9da0
testb $0x1, %al
jne 0xa0fe
jmp 0xa0dd
movq -0x38(%rbp), %rax
cmpl $0x0, 0x78(%rax)
jne 0xa0f2
movq -0x38(%rbp), %rax
movl $0x3, 0x78(%rax)
jmp 0xa0f4
movq $0x0, -0x8(%rbp)
jmp 0xa106
movq -0x28(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x70, %rsp
popq %rbp
retq