// File: cybozu[P]yrmcds/src/memcache/memcache.cpp
// Function: yrmcds::memcache::text_request::parse_storage(char const*, char const*, bool)
inline void
text_request::parse_storage(const char* b, const char* e, bool is_cas) noexcept {
    while( *b == SP ) ++b;
    if( b == e ) return;
    const char* key_end = cfind(b, SP, e-b);
    if( key_end == nullptr ) return;
    m_key = item(b, key_end-b);
    b = key_end;

    while( *b == SP ) ++b;
    if( b == e ) return;
    const char* flags_end = cfind(b, SP, e-b);
    if( flags_end == nullptr ) return;
    bool result;
    m_flags = to_uint<std::uint32_t>(b, result);
    if( ! result ) return;
    b = flags_end;

    while( *b == SP ) ++b;
    if( b == e ) return;
    const char* exptime_end = cfind(b, SP, e-b);
    if( exptime_end == nullptr ) return;
    std::time_t t = to_uint<std::time_t>(b, result);
    if( ! result ) return;
    if( t != 0 )
        m_exptime = (t > EXPTIME_THRESHOLD) ? t :
            (g_current_time.load(relaxed) + t);
    b = exptime_end;

    while( *b == SP ) ++b;
    if( b == e ) return;
    std::uint32_t nbytes = to_uint<std::uint32_t>(b, result);
    if( ! result ) return;
    const char* bytes_end = cfind(b, SP, e-b);
    b = (bytes_end == nullptr) ? e : bytes_end;

    if( is_cas ) {
        while( *b == SP ) ++b;
        if( b == e ) return;
        m_cas_unique = to_uint<std::uint64_t>(b, result);
        if( ! result ) return;
        const char* cas_end = cfind(b, SP, e-b);
        b = (cas_end == nullptr) ? e : cas_end;
    }

    while( *b == SP ) ++b;
    if( b != e ) {
        // noreply ?
        const char* we = cfind(b, SP, e-b);
        std::size_t noreply_len = (we != nullptr) ? (we - b) : (e - b);
        if( noreply_len != 7 ) return;
        if( std::memcmp(b, "noreply", 7) != 0 ) return;
        m_no_reply = true;
        b = (we != nullptr) ? we : e;
    }

    while( *b == SP ) ++b;
    if( b != e ) return; // garbage left

    // here, parsing was successful.  check data length.
    b += 2; // CRLF
    m_request_len = (b - m_p) + nbytes + 2;
    if( m_len < m_request_len ) {
        m_request_len = 0;
        return;
    }

    // check CRLF following the data
    if( *(b+nbytes) != CR || *(b+nbytes+1) != LF )
        return;

    // passed all checks.
    m_data = item(b, nbytes);
    m_valid = true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x110, %rsp            # imm = 0x110
movb %cl, %al
movq %rdi, -0x20(%rbp)
movq %rsi, -0x28(%rbp)
movq %rdx, -0x30(%rbp)
andb $0x1, %al
movb %al, -0x31(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x757e3
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x757c9
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x757f2
jmp 0x75d2f
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x7581b
jmp 0x75d2f
movq -0x40(%rbp), %rax
movq -0x28(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x58(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0x28(%rbp), %rsi
leaq -0x58(%rbp), %rdx
callq 0x524d0
movq -0xb8(%rbp), %rdi
addq $0x20, %rdi
leaq -0x50(%rbp), %rsi
callq 0x51450
movq -0x40(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x75871
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x75857
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x75880
jmp 0x75d2f
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x60(%rbp)
cmpq $0x0, -0x60(%rbp)
jne 0x758a9
jmp 0x75d2f
movq -0x28(%rbp), %rdi
leaq -0x61(%rbp), %rsi
callq 0x74e30
movl %eax, -0xbc(%rbp)
jmp 0x758be
movq -0xb8(%rbp), %rax
movl -0xbc(%rbp), %ecx
movl %ecx, 0x30(%rax)
testb $0x1, -0x61(%rbp)
jne 0x758d9
jmp 0x75d2f
movq -0x60(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x758fb
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x758e1
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x7590a
jmp 0x75d2f
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x70(%rbp)
cmpq $0x0, -0x70(%rbp)
jne 0x75933
jmp 0x75d2f
movq -0x28(%rbp), %rdi
leaq -0x61(%rbp), %rsi
callq 0x74d40
movq %rax, -0x78(%rbp)
testb $0x1, -0x61(%rbp)
jne 0x7594f
jmp 0x75d2f
cmpq $0x0, -0x78(%rbp)
je 0x75a0f
cmpq $0x278d00, -0x78(%rbp)  # imm = 0x278D00
jle 0x75974
movq -0x78(%rbp), %rax
movq %rax, -0xc8(%rbp)
jmp 0x759fd
leaq 0x3a645(%rip), %rax     # 0xaffc0
movq %rax, -0x8(%rbp)
movl $0x0, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xd8(%rbp)
movl -0xc(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0x104e0
movl %eax, -0x10(%rbp)
movl -0xc(%rbp), %eax
movl %eax, -0xcc(%rbp)
decl %eax
subl $0x2, %eax
jb 0x759d0
jmp 0x759b3
movl -0xcc(%rbp), %eax
subl $0x5, %eax
je 0x759e0
jmp 0x759c0
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x759ee
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x759ee
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
addq -0x78(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xb8(%rbp), %rax
movq -0xc8(%rbp), %rcx
movq %rcx, 0x38(%rax)
movq -0x70(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x75a31
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x75a17
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x75a40
jmp 0x75d2f
movq -0x28(%rbp), %rdi
leaq -0x61(%rbp), %rsi
callq 0x74e30
movl %eax, -0xdc(%rbp)
jmp 0x75a55
movl -0xdc(%rbp), %eax
movl %eax, -0x7c(%rbp)
testb $0x1, -0x61(%rbp)
jne 0x75a69
jmp 0x75d2f
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x88(%rbp)
cmpq $0x0, -0x88(%rbp)
jne 0x75aa0
movq -0x30(%rbp), %rax
movq %rax, -0xe8(%rbp)
jmp 0x75aae
movq -0x88(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0x28(%rbp)
testb $0x1, -0x31(%rbp)
je 0x75b71
jmp 0x75ac5
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x75adf
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x75ac5
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x75aee
jmp 0x75d2f
movq -0x28(%rbp), %rdi
leaq -0x61(%rbp), %rsi
callq 0x74f10
movq %rax, -0xf0(%rbp)
jmp 0x75b04
movq -0xb8(%rbp), %rax
movq -0xf0(%rbp), %rcx
movq %rcx, 0x40(%rax)
testb $0x1, -0x61(%rbp)
jne 0x75b21
jmp 0x75d2f
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x90(%rbp)
cmpq $0x0, -0x90(%rbp)
jne 0x75b58
movq -0x30(%rbp), %rax
movq %rax, -0xf8(%rbp)
jmp 0x75b66
movq -0x90(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x75b73
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x75b8d
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x75b73
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
je 0x75c65
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x98(%rbp)
cmpq $0x0, -0x98(%rbp)
je 0x75bdc
movq -0x98(%rbp), %rax
movq -0x28(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x100(%rbp)
jmp 0x75bee
movq -0x30(%rbp), %rax
movq -0x28(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
movq %rax, -0xa0(%rbp)
cmpq $0x7, -0xa0(%rbp)
je 0x75c0b
jmp 0x75d2f
movq -0x28(%rbp), %rdi
leaq 0x8493(%rip), %rsi      # 0x7e0a9
movl $0x7, %edx
callq 0x8280
cmpl $0x0, %eax
je 0x75c2a
jmp 0x75d2f
movq -0xb8(%rbp), %rax
movb $0x1, 0x1d(%rax)
cmpq $0x0, -0x98(%rbp)
je 0x75c4f
movq -0x98(%rbp), %rax
movq %rax, -0x108(%rbp)
jmp 0x75c5a
movq -0x30(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x75c67
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x75c81
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x75c67
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
je 0x75c90
jmp 0x75d2f
movq -0xb8(%rbp), %rcx
movq -0x28(%rbp), %rax
addq $0x2, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq (%rcx), %rdx
subq %rdx, %rax
movl -0x7c(%rbp), %edx
addq %rdx, %rax
addq $0x2, %rax
movq %rax, 0x10(%rcx)
movq 0x8(%rcx), %rax
cmpq 0x10(%rcx), %rax
jae 0x75cd6
movq -0xb8(%rbp), %rax
movq $0x0, 0x10(%rax)
jmp 0x75d2f
movq -0x28(%rbp), %rax
movl -0x7c(%rbp), %ecx
movsbl (%rax,%rcx), %eax
cmpl $0xd, %eax
jne 0x75cf7
movq -0x28(%rbp), %rax
movl -0x7c(%rbp), %ecx
movsbl 0x1(%rax,%rcx), %eax
cmpl $0xa, %eax
je 0x75cf9
jmp 0x75d2f
leaq -0xb0(%rbp), %rdi
leaq -0x28(%rbp), %rsi
leaq -0x7c(%rbp), %rdx
callq 0x76d90
movq -0xb8(%rbp), %rdi
addq $0x48, %rdi
leaq -0xb0(%rbp), %rsi
callq 0x51450
movq -0xb8(%rbp), %rax
movb $0x1, 0x1c(%rax)
addq $0x110, %rsp            # imm = 0x110
popq %rbp
retq
movq %rax, %rdi
callq 0xa7e0