// File: cybozu[P]yrmcds/src/memcache/memcache.cpp
// Function: yrmcds::memcache::text_request::parse_touch(char const*, char const*)
inline void
text_request::parse_touch(const char* b, const char* e) 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* exptime_end = cfind(b, SP, e-b);
    if( exptime_end == nullptr ) exptime_end = e;
    bool result;
    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 ) {
        // 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

    m_valid = true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq %rdi, -0x20(%rbp)
movq %rsi, -0x28(%rbp)
movq %rdx, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x75f59
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x75f3f
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x75f68
jmp 0x76204
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x75f91
jmp 0x76204
movq -0x38(%rbp), %rax
movq -0x28(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0x50(%rbp)
leaq -0x48(%rbp), %rdi
leaq -0x28(%rbp), %rsi
leaq -0x50(%rbp), %rdx
callq 0x524d0
movq -0x80(%rbp), %rdi
addq $0x20, %rdi
leaq -0x48(%rbp), %rsi
callq 0x51450
movq -0x38(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x75fe4
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x75fca
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jne 0x75ff3
jmp 0x76204
movq -0x28(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
movl $0x20, %esi
callq 0x63090
movq %rax, -0x58(%rbp)
cmpq $0x0, -0x58(%rbp)
jne 0x7601f
movq -0x30(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x28(%rbp), %rdi
leaq -0x59(%rbp), %rsi
callq 0x74d40
movq %rax, -0x68(%rbp)
testb $0x1, -0x59(%rbp)
jne 0x7603b
jmp 0x76204
cmpq $0x0, -0x68(%rbp)
je 0x760f8
cmpq $0x278d00, -0x68(%rbp)  # imm = 0x278D00
jle 0x76060
movq -0x68(%rbp), %rax
movq %rax, -0x88(%rbp)
jmp 0x760e9
leaq 0x39f59(%rip), %rax     # 0xaffc0
movq %rax, -0x8(%rbp)
movl $0x0, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x98(%rbp)
movl -0xc(%rbp), %edi
movl $0xffff, %esi           # imm = 0xFFFF
callq 0x104e0
movl %eax, -0x10(%rbp)
movl -0xc(%rbp), %eax
movl %eax, -0x8c(%rbp)
decl %eax
subl $0x2, %eax
jb 0x760bc
jmp 0x7609f
movl -0x8c(%rbp), %eax
subl $0x5, %eax
je 0x760cc
jmp 0x760ac
movq -0x98(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x760da
movq -0x98(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x760da
movq -0x98(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
addq -0x68(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x80(%rbp), %rax
movq -0x88(%rbp), %rcx
movq %rcx, 0x38(%rax)
movq -0x58(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x7611a
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x76100
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
je 0x761d4
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)
je 0x76160
movq -0x70(%rbp), %rax
movq -0x28(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0xa0(%rbp)
jmp 0x76172
movq -0x30(%rbp), %rax
movq -0x28(%rbp), %rcx
subq %rcx, %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x78(%rbp)
cmpq $0x7, -0x78(%rbp)
je 0x76186
jmp 0x76204
movq -0x28(%rbp), %rdi
leaq 0x7f18(%rip), %rsi      # 0x7e0a9
movl $0x7, %edx
callq 0x8280
cmpl $0x0, %eax
je 0x761a2
jmp 0x76204
movq -0x80(%rbp), %rax
movb $0x1, 0x1d(%rax)
cmpq $0x0, -0x70(%rbp)
je 0x761be
movq -0x70(%rbp), %rax
movq %rax, -0xa8(%rbp)
jmp 0x761c9
movq -0x30(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x761d6
movq -0x28(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x20, %eax
jne 0x761f0
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x761d6
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
je 0x761fc
jmp 0x76204
movq -0x80(%rbp), %rax
movb $0x1, 0x1c(%rax)
addq $0xb0, %rsp
popq %rbp
retq
nopl (%rax)