// File: /workspace/github_cpp_makefile_star2_O1/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movl %ecx, %ebp
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %rbx
decq %r15
movq %r15, %r13
incq %r15
cmpb $0x20, 0x1(%r13)
leaq 0x1(%r13), %r13
je 0x326f5
cmpq %r14, %r13
je 0x32a7a
movq %r14, %rdx
subq %r15, %rdx
movq %r13, %rdi
movl $0x20, %esi
callq 0x7550
testq %rax, %rax
je 0x32a7a
movq %rax, %r12
subq %r15, %rax
movq %r13, 0x28(%rbx)
movq %rax, 0x20(%rbx)
movq %r14, %rdx
subq %r12, %rdx
decq %r12
incq %rdx
decq %rdx
cmpb $0x20, 0x1(%r12)
leaq 0x1(%r12), %r12
je 0x32742
cmpq %r14, %r12
je 0x32a7a
movq %r12, %rdi
movl $0x20, %esi
callq 0x7550
testq %rax, %rax
je 0x32a7a
movq %rax, %r15
movl %ebp, 0x1c(%rsp)
movq %rbx, 0x10(%rsp)
movb $0x0, 0xf(%rsp)
leaq 0x20(%rsp), %rbp
movq %r12, %rdi
movq %rbp, %rsi
movl $0xa, %edx
callq 0x76f0
movq (%rbp), %rbx
xorq %rbx, %r12
xorl %ebp, %ebp
orq %rax, %r12
jne 0x3282a
movq 0x10(%rsp), %rcx
movl %ebp, 0x30(%rcx)
cmpb $0x1, 0xf(%rsp)
jne 0x32a7a
movq %r14, %rdx
subq %r15, %rdx
decq %r15
incq %rdx
decq %rdx
cmpb $0x20, 0x1(%r15)
leaq 0x1(%r15), %r15
je 0x327c8
cmpq %r14, %r15
je 0x32a7a
movq %r15, %rdi
movl $0x20, %esi
callq 0x7550
testq %rax, %rax
je 0x32a7a
movq %rax, %r12
movb $0x0, 0xf(%rsp)
leaq 0x20(%rsp), %rbp
movq %r15, %rdi
movq %rbp, %rsi
movl $0xa, %edx
callq 0x76f0
movq (%rbp), %rbx
xorq %rbx, %r15
orq %rax, %r15
jne 0x32881
xorl %eax, %eax
movq 0x10(%rsp), %rbx
jmp 0x328c5
movq %rax, %r13
cmpq $-0x1, %rax
jne 0x32841
callq 0x7040
cmpl $0x22, (%rax)
je 0x327a9
movzbl (%rbx), %eax
cmpq $0x20, %rax
ja 0x327a9
movabsq $0x100002400, %rcx      # imm = 0x100002400
btq %rax, %rcx
movq 0x10(%rsp), %rcx
jae 0x327ae
movq %r13, %rax
shrq $0x20, %rax
jne 0x327ae
movb $0x1, 0xf(%rsp)
movl %r13d, %ebp
jmp 0x327ae
movq %rax, %r13
cmpq $-0x1, %rax
jne 0x32894
callq 0x7040
cmpl $0x22, (%rax)
je 0x3281e
movzbl (%rbx), %ecx
xorl %eax, %eax
cmpq $0x20, %rcx
ja 0x32820
movabsq $0x100002400, %rdx      # imm = 0x100002400
btq %rcx, %rdx
movq 0x10(%rsp), %rbx
jae 0x328c5
testq %r13, %r13
js 0x328c3
movb $0x1, 0xf(%rsp)
movq %r13, %rax
jmp 0x328c5
xorl %eax, %eax
cmpb $0x1, 0xf(%rsp)
jne 0x32a7a
testq %rax, %rax
je 0x328ee
cmpq $0x278d00, %rax         # imm = 0x278D00
jg 0x328ea
leaq 0x1459c(%rip), %rcx     # 0x46e80
movq (%rcx), %rcx
addq %rcx, %rax
movq %rax, 0x38(%rbx)
movq %r14, %r13
subq %r12, %r13
decq %r12
incq %r13
decq %r13
cmpb $0x20, 0x1(%r12)
leaq 0x1(%r12), %r12
je 0x328fa
cmpq %r14, %r12
je 0x32a7a
leaq 0xf(%rsp), %rbp
movq %r12, %rdi
movq %rbp, %rsi
callq 0x322d3
cmpb $0x1, (%rbp)
movl 0x1c(%rsp), %ebp
jne 0x32a7a
movl %eax, %r15d
movq %r12, %rdi
movl $0x20, %esi
movq %r13, %rdx
callq 0x7550
movq %rax, %r12
testq %rax, %rax
cmoveq %r14, %r12
testb %bpl, %bpl
je 0x329b0
movq %r14, %r13
subq %r12, %r13
decq %r12
incq %r13
decq %r13
cmpb $0x20, 0x1(%r12)
leaq 0x1(%r12), %r12
je 0x3295f
cmpq %r14, %r12
je 0x32a7a
leaq 0xf(%rsp), %rbp
movq %r12, %rdi
movq %rbp, %rsi
callq 0x32354
movq %rax, 0x40(%rbx)
cmpb $0x1, (%rbp)
jne 0x32a7a
movq %r12, %rdi
movl $0x20, %esi
movq %r13, %rdx
callq 0x7550
movq %rax, %r12
testq %rax, %rax
cmoveq %r14, %r12
decq %r12
movq %r12, %r13
incq %r12
cmpb $0x20, 0x1(%r13)
leaq 0x1(%r13), %r13
je 0x329b6
cmpq %r14, %r13
je 0x32a1a
movq %r14, %rbp
subq %r12, %rbp
movq %r13, %rdi
movl $0x20, %esi
movq %rbp, %rdx
callq 0x7550
movq %rax, %rcx
subq %r12, %rcx
testq %rax, %rax
cmoveq %rbp, %rcx
cmpq $0x7, %rcx
jne 0x32a7a
movl $0x65726f6e, %ecx       # imm = 0x65726F6E
xorl (%r13), %ecx
movl $0x796c7065, %edx       # imm = 0x796C7065
xorl 0x3(%r13), %edx
orl %ecx, %edx
jne 0x32a7a
testq %rax, %rax
movb $0x1, 0x1d(%rbx)
cmoveq %r14, %rax
movq %rax, %r13
movq $-0x3, %rax
subq %r13, %rax
decq %r13
decq %rax
cmpb $0x20, 0x1(%r13)
leaq 0x1(%r13), %r13
je 0x32a27
cmpq %r14, %r13
jne 0x32a7a
movl %r15d, %ecx
movq %rcx, %rdx
subq (%rbx), %rdx
subq %rax, %rdx
movq %rdx, 0x10(%rbx)
cmpq %rdx, 0x8(%rbx)
jae 0x32a5a
movq $0x0, 0x10(%rbx)
jmp 0x32a7a
cmpb $0xd, 0x2(%r13,%rcx)
jne 0x32a7a
cmpb $0xa, 0x3(%r13,%rcx)
jne 0x32a7a
addq $0x2, %r13
movq %r13, 0x50(%rbx)
movq %rcx, 0x48(%rbx)
movb $0x1, 0x1c(%rbx)
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop