// File: /workspace/github_c_makefile_star2_O0/Tarsnap[P]kivaloo/liball/../lib/proto_kvlds/proto_kvlds_server.c
// Function: proto_kvlds_request_parse
static int
proto_kvlds_request_parse(const struct wire_packet * P,
    struct proto_kvlds_request * R)
{
	size_t bufpos;

	/* Store request ID. */
	R->ID = P->ID;

	/* Initialize keys to NULL. */
	R->key = R->oval = R->value = NULL;

	/* Sanity-check packet length. */
	if (P->len < 4)
		goto err0;
	if (P->len > sizeof(R->blob))
		goto err0;

	/* Copy the packet data into the request structure. */
	memcpy(R->blob, P->buf, P->len);

	/* Figure out request type. */
	R->type = be32dec(&R->blob[0]);
	bufpos = 4;

/* Macro for extracting a key and advancing the buffer position. */
#define GRABKEY(dest, buf, buflen, bufpos, invalid) do {	\
	if (bufpos == buflen)					\
		goto invalid;					\
	dest = (struct kvldskey *)&buf[bufpos];			\
	bufpos += kvldskey_serial_size(dest);			\
	if (bufpos > buflen)					\
		goto invalid;					\
} while (0)

	/* Parse packet. */
	switch (R->type) {
	case PROTO_KVLDS_PARAMS:
		/* Nothing to parse. */
		break;
	case PROTO_KVLDS_DELETE:
	case PROTO_KVLDS_GET:
		/* Parse key. */
		GRABKEY(R->key, R->blob, P->len, bufpos, err1);
		break;
	case PROTO_KVLDS_SET:
	case PROTO_KVLDS_ADD:
	case PROTO_KVLDS_MODIFY:
		/* Parse key. */
		GRABKEY(R->key, R->blob, P->len, bufpos, err1);

		/* Parse value. */
		GRABKEY(R->value, R->blob, P->len, bufpos, err1);
		break;
	case PROTO_KVLDS_CAD:
		/* Parse key. */
		GRABKEY(R->key, R->blob, P->len, bufpos, err1);

		/* Parse oval. */
		GRABKEY(R->oval, R->blob, P->len, bufpos, err1);
		break;
	case PROTO_KVLDS_CAS:
		/* Parse key. */
		GRABKEY(R->key, R->blob, P->len, bufpos, err1);

		/* Parse oval. */
		GRABKEY(R->oval, R->blob, P->len, bufpos, err1);

		/* Parse value. */
		GRABKEY(R->value, R->blob, P->len, bufpos, err1);
		break;
	case PROTO_KVLDS_RANGE:
		/* Parse maximum key-value pairs length. */
		if (P->len - bufpos < 4) {
			errno = 0;
			goto err1;
		}
		R->range_max = be32dec(&R->blob[bufpos]);
		bufpos += 4;

		/* Parse start key. */
		GRABKEY(R->range_start, R->blob, P->len, bufpos, err1);

		/* Parse end key. */
		GRABKEY(R->range_end, R->blob, P->len, bufpos, err1);
		break;
	default:
		warn0("Unrecognized request type received: 0x%08" PRIx32,
		    R->type);
		goto err1;
	}

	/* Did we reach the end of the packet? */
	if (bufpos != P->len)
		goto err1;

	/* Success! */
	return (0);

err1:
	warnp("Error parsing request packet of type 0x%08" PRIx32, R->type);
err0:
	/* Failure! */
	return (-1);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x18(%rbp), %rax
movq $0x0, 0x18(%rax)
movq -0x18(%rbp), %rax
movq $0x0, 0x20(%rax)
movq -0x18(%rbp), %rax
movq $0x0, 0x10(%rax)
movq -0x10(%rbp), %rax
cmpq $0x4, 0x8(%rax)
jae 0x19352
jmp 0x197fc
movq -0x10(%rbp), %rax
cmpq $0x304, 0x8(%rax)       # imm = 0x304
jbe 0x19365
jmp 0x197fc
movq -0x18(%rbp), %rdi
addq $0x28, %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdx
movq 0x10(%rax), %rsi
callq 0x2280
movq -0x18(%rbp), %rdi
addq $0x28, %rdi
callq 0x19e30
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x8(%rax)
movq $0x4, -0x20(%rbp)
movq -0x18(%rbp), %rax
movl 0x8(%rax), %eax
addl $0xffffff00, %eax       # imm = 0xFFFFFF00
movl %eax, %ecx
movq %rcx, -0x28(%rbp)
subl $0x31, %eax
ja 0x19778
movq -0x28(%rbp), %rax
leaq 0x79de(%rip), %rcx      # 0x20da0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0x1979c
jmp 0x193d2
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x193e5
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x19423
jmp 0x197b5
jmp 0x19425
jmp 0x1979c
jmp 0x1942c
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x1943f
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x1947d
jmp 0x197b5
jmp 0x1947f
jmp 0x19481
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x19494
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x194d2
jmp 0x197b5
jmp 0x194d4
jmp 0x1979c
jmp 0x194db
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x194ee
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x1952c
jmp 0x197b5
jmp 0x1952e
jmp 0x19530
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x19543
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x19581
jmp 0x197b5
jmp 0x19583
jmp 0x1979c
jmp 0x1958a
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x1959d
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x195db
jmp 0x197b5
jmp 0x195dd
jmp 0x195df
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x195f2
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x19630
jmp 0x197b5
jmp 0x19632
jmp 0x19634
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x19647
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x19685
jmp 0x197b5
jmp 0x19687
jmp 0x1979c
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
subq -0x20(%rbp), %rax
cmpq $0x4, %rax
jae 0x196ae
callq 0x20a0
movl $0x0, (%rax)
jmp 0x197b5
movq -0x18(%rbp), %rdi
addq $0x28, %rdi
addq -0x20(%rbp), %rdi
callq 0x19e30
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x20(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x196e7
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x19725
jmp 0x197b5
jmp 0x19727
jmp 0x19729
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jne 0x19739
jmp 0x197b5
movq -0x18(%rbp), %rcx
addq $0x28, %rcx
addq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movzbl (%rax), %eax
addq $0x1, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x19774
jmp 0x197b5
jmp 0x19776
jmp 0x1979c
jmp 0x1977a
movq -0x18(%rbp), %rax
movl 0x8(%rax), %esi
leaq 0x7866(%rip), %rdi      # 0x20fee
movb $0x0, %al
callq 0x182f0
callq 0x20a0
movl $0x0, (%rax)
jmp 0x197b5
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
je 0x197ac
jmp 0x197b5
movl $0x0, -0x4(%rbp)
jmp 0x19803
jmp 0x197b7
callq 0x20a0
cmpl $0x0, (%rax)
je 0x197e3
movq -0x18(%rbp), %rax
movl 0x8(%rax), %esi
leaq 0x784a(%rip), %rdi      # 0x21019
movb $0x0, %al
callq 0x180a0
callq 0x20a0
movl $0x0, (%rax)
jmp 0x197f8
movq -0x18(%rbp), %rax
movl 0x8(%rax), %esi
leaq 0x7828(%rip), %rdi      # 0x21019
movb $0x0, %al
callq 0x182f0
jmp 0x197fa
jmp 0x197fc
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
movl -0x4(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax)