// File: /workspace/github_c_makefile_star2_O1/nilyang[P]redis-tdd-annotation/src/redis-check-aof.c
// Function: process
off_t process(FILE *fp) {
    long argc;
    off_t pos = 0;
    int i, multi = 0;
    char *str;

    while(1) {

        // 定位到最后一个 MULTI 出现的偏移量
        if (!multi) pos = ftello(fp);

        // 读取参数的个数
        if (!readArgc(fp, &argc)) break;

        // 遍历各个参数
        // 参数包括命令以及命令参数
        // 比如 SET key value 
        // SET 就是第一个参数，而 key 和 value 就是第二和第三个参数
        for (i = 0; i < argc; i++) {

            // 读取参数
            if (!readString(fp,&str)) break;

            // 检查命令是否 MULTI 或者 EXEC
            if (i == 0) {
                if (strcasecmp(str, "multi") == 0) {
                    // 记录一个 MULTI 
                    // 如果前面已经有一个 MULTI ，那么报错（MULTI 不应该嵌套）
                    if (multi++) {
                        ERROR("Unexpected MULTI");
                        break;
                    }
                } else if (strcasecmp(str, "exec") == 0) {
                    // 清除一个 MULTI 记录
                    // 如果前面没有 MULTI ，那么报错（MULTI 和 EXEC 应该一对对出现）
                    if (--multi) {
                        ERROR("Unexpected EXEC");
                        break;
                    }
                }
            }

            // 释放
            free(str);
        }

        /* Stop if the loop did not finish 
         *
         * 如果 for 循环没有正常结束，那么跳出 while
         */
        if (i < argc) {
            if (str) free(str);
            break;
        }
    }

    // 文件读取完了，但是没有找到和 MULTI 对应的 EXEC
    if (feof(fp) && multi && strlen(error) == 0) {
        ERROR("Reached EOF before reading EXEC for MULTI");
    }

    // 如果有错误出现，那么打印错误
    if (strlen(error) > 0) {
        printf("%s\n", error);
    }

    // 返回偏移量
    return pos;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x428, %rsp            # imm = 0x428
movq %rdi, (%rsp)
movq $0x0, 0x10(%rsp)
xorl %ebx, %ebx
testl %ebx, %ebx
jne 0x14dc
movq (%rsp), %rdi
callq 0x10a0
movq %rax, 0x10(%rsp)
movq (%rsp), %rdi
movl $0x2a, %esi
leaq 0x18(%rsp), %rdx
callq 0x12de
testl %eax, %eax
je 0x161d
movq 0x18(%rsp), %rbp
testq %rbp, %rbp
setg %r15b
jle 0x1604
movq %rbp, %r13
negq %r13
movl $0x1, %r12d
movl %ebx, %r14d
movq (%rsp), %rdi
leaq 0x8(%rsp), %rsi
callq 0x141e
testl %eax, %eax
je 0x1601
cmpq $0x1, %r12
jne 0x155f
movq 0x8(%rsp), %rbx
movq %rbx, %rdi
leaq 0xb38(%rip), %rsi       # 0x207b
callq 0x1040
testl %eax, %eax
je 0x1564
movq %rbx, %rdi
leaq 0xb3c(%rip), %rsi       # 0x2092
callq 0x1040
testl %eax, %eax
je 0x156f
movl %r14d, %ebx
jmp 0x1576
leal 0x1(%r14), %ebx
testl %r14d, %r14d
je 0x1576
jmp 0x15a0
xorl %ebx, %ebx
decl %r14d
jne 0x15d4
movq 0x8(%rsp), %rdi
callq 0x1030
cmpq %r12, %rbp
setg %r15b
leaq (%r12,%r13), %rax
incq %rax
incq %r12
movl %ebx, %r14d
cmpq $0x1, %rax
jne 0x1518
jmp 0x1604
movups 0xada(%rip), %xmm0      # 0x2081
movaps %xmm0, 0x20(%rsp)
movb $0x0, 0x30(%rsp)
movq 0x2f28(%rip), %rdx      # 0x44e0
leaq 0x2b21(%rip), %rdi      # 0x40e0
leaq 0xa5e(%rip), %rsi       # 0x2024
leaq 0x20(%rsp), %rcx
xorl %eax, %eax
callq 0x1140
jmp 0x1604
movups 0xabc(%rip), %xmm0      # 0x2097
movaps %xmm0, 0x20(%rsp)
movq 0x2ef9(%rip), %rdx      # 0x44e0
leaq 0x2af2(%rip), %rdi      # 0x40e0
leaq 0xa2f(%rip), %rsi       # 0x2024
leaq 0x20(%rsp), %rcx
xorl %eax, %eax
callq 0x1140
movl %r14d, %ebx
testb $0x1, %r15b
je 0x14ca
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x161d
callq 0x1030
movq (%rsp), %rdi
callq 0x10d0
testl %eax, %eax
je 0x1678
testl %ebx, %ebx
je 0x1678
cmpb $0x0, 0x2aab(%rip)      # 0x40e0
jne 0x1678
movups 0xa83(%rip), %xmm0      # 0x20c1
leaq 0x20(%rsp), %rcx
movups %xmm0, 0x1a(%rcx)
movups 0xa69(%rip), %xmm0      # 0x20b7
movaps %xmm0, 0x10(%rcx)
movups 0xa4e(%rip), %xmm0      # 0x20a7
movaps %xmm0, (%rcx)
movq 0x2e7d(%rip), %rdx      # 0x44e0
leaq 0x2a76(%rip), %rdi      # 0x40e0
leaq 0x9b3(%rip), %rsi       # 0x2024
xorl %eax, %eax
callq 0x1140
cmpb $0x0, 0x2a61(%rip)      # 0x40e0
je 0x168d
leaq 0x2a58(%rip), %rdi      # 0x40e0
callq 0x1060
movq 0x10(%rsp), %rax
addq $0x428, %rsp            # imm = 0x428
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq