// File: TTLIUJJ[P]acker_redis/command.cpp
// Function: lindexCommand(redisClient*)
void lindexCommand(redisClient *client)
{
	dict *d = client->db->dict;
	robj *o = client->argv[1];
	dictEntry *de = dictFind(d, o);

	if (de != NULL) {
		robj *val = (robj *)de->val;
		if (val->type != REDIS_LIST) {
			explainNotForThat(client, val->type);
			return;
		}
		list *l = (list *)val->ptr;
		listNode *node;
		int len = parseObjectToDigit(client->argv[2]);
		unsigned long ablen = (len < 0) ? -len : len;
		if (ablen > l->len) {
			memcpy(client->buf + client->bufpos, "(out of range)", 14);
			client->bufpos += 14;
			return;
		}
		if (len < 0) {
			len = -len;
			node = listTail(l);
			while (--len)
				node = node->prev;
		}
		else {
			node = listFirst(l);
			while (--len)
				node = node->next;
		}
		char *p = (char *)((robj *)node->value)->ptr;
		size_t plen = strlen(p);
		memcpy(client->buf + client->bufpos, p, plen);
		client->bufpos += plen;
	}
	else {
		memcpy(client->buf + client->bufpos, "(no such list)", 14);
		client->bufpos += 14;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x3d40
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x24cd
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x2, (%rax)
je 0x238f
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movl (%rax), %esi
callq 0x2d10
jmp 0x2508
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq 0x10(%rax), %rdi
callq 0x2f20
movl %eax, -0x3c(%rbp)
cmpl $0x0, -0x3c(%rbp)
jge 0x23bf
xorl %eax, %eax
subl -0x3c(%rbp), %eax
movl %eax, -0x5c(%rbp)
jmp 0x23c5
movl -0x3c(%rbp), %eax
movl %eax, -0x5c(%rbp)
movl -0x5c(%rbp), %eax
cltq
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq -0x30(%rbp), %rcx
cmpq 0x28(%rcx), %rax
jbe 0x241c
movq -0x8(%rbp), %rax
movq -0x8(%rbp), %rcx
movslq 0x30(%rcx), %rcx
movq 0x4cbc(%rip), %rdx      # 0x70ab
movq %rdx, 0x34(%rax,%rcx)
movl 0x4cb9(%rip), %edx      # 0x70b3
movl %edx, 0x3c(%rax,%rcx)
movw 0x4cb2(%rip), %dx       # 0x70b7
movw %dx, 0x40(%rax,%rcx)
movq -0x8(%rbp), %rax
movl 0x30(%rax), %ecx
addl $0xe, %ecx
movl %ecx, 0x30(%rax)
jmp 0x2508
cmpl $0x0, -0x3c(%rbp)
jge 0x2453
xorl %eax, %eax
subl -0x3c(%rbp), %eax
movl %eax, -0x3c(%rbp)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
movl -0x3c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x3c(%rbp)
cmpl $0x0, %eax
je 0x2451
movq -0x38(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x2436
jmp 0x247c
movq -0x30(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movl -0x3c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x3c(%rbp)
cmpl $0x0, %eax
je 0x247a
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x245e
jmp 0x247c
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rdi
callq 0x10a0
movq %rax, -0x58(%rbp)
movq -0x8(%rbp), %rdi
addq $0x34, %rdi
movq -0x8(%rbp), %rax
movslq 0x30(%rax), %rax
addq %rax, %rdi
movq -0x50(%rbp), %rsi
movq -0x58(%rbp), %rdx
callq 0x1120
movq -0x58(%rbp), %rdx
movq -0x8(%rbp), %rax
movslq 0x30(%rax), %rcx
addq %rdx, %rcx
movl %ecx, 0x30(%rax)
jmp 0x2508
movq -0x8(%rbp), %rax
movq -0x8(%rbp), %rcx
movslq 0x30(%rcx), %rcx
movq 0x4bbc(%rip), %rdx      # 0x709c
movq %rdx, 0x34(%rax,%rcx)
movl 0x4bb9(%rip), %edx      # 0x70a4
movl %edx, 0x3c(%rax,%rcx)
movw 0x4bb2(%rip), %dx       # 0x70a8
movw %dx, 0x40(%rax,%rcx)
movq -0x8(%rbp), %rax
movl 0x30(%rax), %ecx
addl $0xe, %ecx
movl %ecx, 0x30(%rax)
addq $0x60, %rsp
popq %rbp
retq
nop