// File: /workspace/github_c_makefile_star2_O0/tyabu12[P]pl0compiler/pl0dmMain.c
// Function: main
int main(int argc, char *argv[]) {
    FILE *fin = NULL;
    int opt, quit, update;
    int stepRun = 0; /* ステップ実行フラグ */
    int secretMode = 0, secretValue; /* シークレットモード用 */
    /* コマンドラインオプションを解釈 */
    while ((opt = getopt(argc, argv, "hsz")) != -1) {
        switch (opt) {
        case 'h': printUsage(argv[0]); return 0;      /* ヘルプ表示 */
        case 's': stepRun = 1; break;                 /* ステップ実行する */
        case 'z': secretMode = 1; break;              /* シークレットモード有効化 */
        default:  printUsage(argv[0]); return 1;      /* 無効なオプション */
        }
    }
    if (optind >= argc) {
        fprintf(stderr, "%s: no input file\n", argv[0]);
        printUsage(argv[0]);
        return 1;
    }
    if ((fin = fopen(argv[optind], "r")) == NULL) { /* 命令語ファイルの読み込み */
        printf("can't open %s\n", argv[optind]);
        return 1;
    }
    if (readCode(fin)) return 1;
    if (secretMode) scanf("%d", &secretValue); /* シークレットモード用の値の読み込み */
    /* エラーがなければ実行 */
    if (!stepRun) { /* まとめて実行 */
        execute(secretMode ? &secretValue : NULL);
    } else { /* ステップ実行 */
        static Mem memory;
        initMemory(&memory, (secretMode ? &secretValue : NULL));
        quit = 0; /* 終了するか */
        update = 1; /* 更新があったか */
        while (!quit) {
          if (update) { /* 更新があった場合のみ表示 */
            if (memory.top > memory.topMax) memory.topMax = memory.top;
            update = 0;
            printMemory(&memory);
            if (memory.exitCode) { /* 終了状態 */
              /*printf("q: quit\n");*/
              quit = 1; continue;
            } else
              printf("[ret] (step), c (cont.), b[0-%d] (set bp), q (quit)\n", getCLength()-1);
          }
          switch (getchar()) {
          case 'b': 
            scanf("%d ", &memory.breakPoint);
            update = 1; break;
          case 'q': quit = 1; break; /* 終了 */
          case 'c':
            while (1) {
              stepForward(&memory); 
              if (memory.top > memory.topMax) memory.topMax = memory.top;
              printMemory(&memory);
              if (memory.exitCode) { /* 終了状態 */
                quit = 1; break;
              } else if (memory.stepCount == memory.breakPoint-1)
                break;
            }
            break;
          /*case 's':*/
          default:
            stepForward(&memory); update = 1; break;  /* 1 step 前進 */
          }
        }
        printf("[finished]\n");
    }
    fclose(fin);
    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq $0x0, -0x18(%rbp)
movl $0x0, -0x28(%rbp)
movl $0x0, -0x2c(%rbp)
movl -0x8(%rbp), %edi
movq -0x10(%rbp), %rsi
leaq 0x1390(%rip), %rdx      # 0x657a
callq 0x2120
movl %eax, -0x1c(%rbp)
cmpl $-0x1, %eax
je 0x525c
movl -0x1c(%rbp), %eax
movl %eax, -0x34(%rbp)
subl $0x68, %eax
je 0x5218
jmp 0x5204
movl -0x34(%rbp), %eax
subl $0x73, %eax
je 0x5230
jmp 0x520e
movl -0x34(%rbp), %eax
subl $0x7a, %eax
je 0x5239
jmp 0x5242
movq -0x10(%rbp), %rax
movq (%rax), %rdi
callq 0x5500
movl $0x0, -0x4(%rbp)
jmp 0x54e9
movl $0x1, -0x28(%rbp)
jmp 0x525a
movl $0x1, -0x2c(%rbp)
jmp 0x525a
movq -0x10(%rbp), %rax
movq (%rax), %rdi
callq 0x5500
movl $0x1, -0x4(%rbp)
jmp 0x54e9
jmp 0x51dc
movq 0x3d6d(%rip), %rax      # 0x8fd0
movl (%rax), %eax
cmpl -0x8(%rbp), %eax
jl 0x52a1
movq 0x3d7f(%rip), %rax      # 0x8ff0
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rdx
leaq 0x12fc(%rip), %rsi      # 0x657e
movb $0x0, %al
callq 0x20d0
movq -0x10(%rbp), %rax
movq (%rax), %rdi
callq 0x5500
movl $0x1, -0x4(%rbp)
jmp 0x54e9
movq -0x10(%rbp), %rax
movq 0x3d24(%rip), %rcx      # 0x8fd0
movslq (%rcx), %rcx
movq (%rax,%rcx,8), %rdi
leaq 0x1247(%rip), %rsi      # 0x6501
callq 0x2110
movq %rax, -0x18(%rbp)
cmpq $0x0, %rax
jne 0x52f5
movq -0x10(%rbp), %rax
movq 0x3cfc(%rip), %rcx      # 0x8fd0
movslq (%rcx), %rcx
movq (%rax,%rcx,8), %rsi
leaq 0x106d(%rip), %rdi      # 0x634f
movb $0x0, %al
callq 0x2080
movl $0x1, -0x4(%rbp)
jmp 0x54e9
movq -0x18(%rbp), %rdi
callq 0x2890
cmpl $0x0, %eax
je 0x530f
movl $0x1, -0x4(%rbp)
jmp 0x54e9
cmpl $0x0, -0x2c(%rbp)
je 0x5327
leaq 0xe4c(%rip), %rdi       # 0x6168
leaq -0x30(%rbp), %rsi
movb $0x0, %al
callq 0x2130
cmpl $0x0, -0x28(%rbp)
jne 0x5353
cmpl $0x0, -0x2c(%rbp)
je 0x533d
leaq -0x30(%rbp), %rax
movq %rax, -0x40(%rbp)
jmp 0x5345
xorl %eax, %eax
movq %rax, -0x40(%rbp)
jmp 0x5345
movq -0x40(%rbp), %rdi
callq 0x3840
jmp 0x54d9
cmpl $0x0, -0x2c(%rbp)
je 0x5363
leaq -0x30(%rbp), %rax
movq %rax, -0x48(%rbp)
jmp 0x536b
xorl %eax, %eax
movq %rax, -0x48(%rbp)
jmp 0x536b
movq -0x48(%rbp), %rsi
leaq 0x60c2(%rip), %rdi      # 0xb438
callq 0x2cc0
movl $0x0, -0x20(%rbp)
movl $0x1, -0x24(%rbp)
cmpl $0x0, -0x20(%rbp)
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x539b
jmp 0x54cb
cmpl $0x0, -0x24(%rbp)
je 0x53fc
movl 0x7fe9(%rip), %eax      # 0xd390
cmpl 0x7fe7(%rip), %eax      # 0xd394
jle 0x53bb
movl 0x7fdb(%rip), %eax      # 0xd390
movl %eax, 0x7fd9(%rip)      # 0xd394
movl $0x0, -0x24(%rbp)
leaq 0x606f(%rip), %rdi      # 0xb438
callq 0x2e10
cmpl $0x0, 0x7fc3(%rip)      # 0xd398
je 0x53e0
movl $0x1, -0x20(%rbp)
jmp 0x5389
movb $0x0, %al
callq 0x2cb0
movl %eax, %esi
subl $0x1, %esi
leaq 0x119e(%rip), %rdi      # 0x6591
movb $0x0, %al
callq 0x2080
jmp 0x53fc
callq 0x20c0
movl %eax, %ecx
movl %ecx, -0x4c(%rbp)
subl $0x62, %eax
je 0x5424
jmp 0x540d
movl -0x4c(%rbp), %eax
subl $0x63, %eax
je 0x5452
jmp 0x5417
movl -0x4c(%rbp), %eax
subl $0x71, %eax
je 0x5449
jmp 0x54b3
leaq 0x119b(%rip), %rdi      # 0x65c6
leaq 0x6006(%rip), %rsi      # 0xb438
addq $0x2168, %rsi           # imm = 0x2168
movb $0x0, %al
callq 0x2130
movl $0x1, -0x24(%rbp)
jmp 0x54c6
movl $0x1, -0x20(%rbp)
jmp 0x54c6
jmp 0x5454
leaq 0x5fdd(%rip), %rdi      # 0xb438
callq 0x3130
movl 0x7f2a(%rip), %eax      # 0xd390
cmpl 0x7f28(%rip), %eax      # 0xd394
jle 0x547a
movl 0x7f1c(%rip), %eax      # 0xd390
movl %eax, 0x7f1a(%rip)      # 0xd394
leaq 0x5fb7(%rip), %rdi      # 0xb438
callq 0x2e10
cmpl $0x0, 0x7f0b(%rip)      # 0xd398
je 0x5498
movl $0x1, -0x20(%rbp)
jmp 0x54b1
movl 0x7efe(%rip), %eax      # 0xd39c
movl 0x80fc(%rip), %ecx      # 0xd5a0
subl $0x1, %ecx
cmpl %ecx, %eax
jne 0x54ad
jmp 0x54b1
jmp 0x54af
jmp 0x5454
jmp 0x54c6
leaq 0x5f7e(%rip), %rdi      # 0xb438
callq 0x3130
movl $0x1, -0x24(%rbp)
jmp 0x5389
leaq 0x10f8(%rip), %rdi      # 0x65ca
movb $0x0, %al
callq 0x2080
movq -0x18(%rbp), %rdi
callq 0x2060
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)