// File: /workspace/github_c_makefile_star2_O0/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
movq %rsp, %rbp
subq $0xc30, %rsp            # imm = 0xC30
movq %rdi, -0x8(%rbp)
movq $0x0, -0x18(%rbp)
movl $0x0, -0x20(%rbp)
cmpl $0x0, -0x20(%rbp)
jne 0x15d1
movq -0x8(%rbp), %rdi
callq 0x10a0
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rdi
leaq -0x10(%rbp), %rsi
callq 0x1570
cmpl $0x0, %eax
jne 0x15e8
jmp 0x171a
movl $0x0, -0x1c(%rbp)
movslq -0x1c(%rbp), %rax
cmpq -0x10(%rbp), %rax
jge 0x16f9
movq -0x8(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x14a0
cmpl $0x0, %eax
jne 0x1614
jmp 0x16f9
cmpl $0x0, -0x1c(%rbp)
jne 0x16e2
movq -0x28(%rbp), %rdi
leaq 0xa52(%rip), %rsi       # 0x207b
callq 0x1040
cmpl $0x0, %eax
jne 0x167f
movl -0x20(%rbp), %eax
movl %eax, %ecx
addl $0x1, %ecx
movl %ecx, -0x20(%rbp)
cmpl $0x0, %eax
je 0x167d
leaq -0x430(%rbp), %rdi
leaq 0xa30(%rip), %rsi       # 0x2081
movb $0x0, %al
callq 0x1140
movq 0x2e81(%rip), %rdx      # 0x44e0
leaq -0x430(%rbp), %rcx
leaq 0x2a73(%rip), %rdi      # 0x40e0
leaq 0x9b0(%rip), %rsi       # 0x2024
movb $0x0, %al
callq 0x1140
jmp 0x16f9
jmp 0x16e0
movq -0x28(%rbp), %rdi
leaq 0xa08(%rip), %rsi       # 0x2092
callq 0x1040
cmpl $0x0, %eax
jne 0x16de
movl -0x20(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x20(%rbp)
cmpl $0x0, %eax
je 0x16dc
leaq -0x830(%rbp), %rdi
leaq 0x9e7(%rip), %rsi       # 0x2097
movb $0x0, %al
callq 0x1140
movq 0x2e22(%rip), %rdx      # 0x44e0
leaq -0x830(%rbp), %rcx
leaq 0x2a14(%rip), %rdi      # 0x40e0
leaq 0x951(%rip), %rsi       # 0x2024
movb $0x0, %al
callq 0x1140
jmp 0x16f9
jmp 0x16de
jmp 0x16e0
jmp 0x16e2
movq -0x28(%rbp), %rdi
callq 0x1030
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x15ef
movslq -0x1c(%rbp), %rax
cmpq -0x10(%rbp), %rax
jge 0x1715
cmpq $0x0, -0x28(%rbp)
je 0x1713
movq -0x28(%rbp), %rdi
callq 0x1030
jmp 0x171a
jmp 0x15be
movq -0x8(%rbp), %rdi
callq 0x10d0
cmpl $0x0, %eax
je 0x1778
cmpl $0x0, -0x20(%rbp)
je 0x1778
leaq 0x29ab(%rip), %rdi      # 0x40e0
callq 0x1080
cmpq $0x0, %rax
jne 0x1778
leaq -0xc30(%rbp), %rdi
leaq 0x959(%rip), %rsi       # 0x20a7
movb $0x0, %al
callq 0x1140
movq 0x2d84(%rip), %rdx      # 0x44e0
leaq -0xc30(%rbp), %rcx
leaq 0x2976(%rip), %rdi      # 0x40e0
leaq 0x8b3(%rip), %rsi       # 0x2024
movb $0x0, %al
callq 0x1140
leaq 0x2961(%rip), %rdi      # 0x40e0
callq 0x1080
cmpq $0x0, %rax
jbe 0x179f
leaq 0x9a2(%rip), %rdi       # 0x2133
leaq 0x2948(%rip), %rsi      # 0x40e0
movb $0x0, %al
callq 0x1090
movq -0x18(%rbp), %rax
addq $0xc30, %rsp            # imm = 0xC30
popq %rbp
retq
nopl (%rax)