// File: /workspace/github_c_makefile_star2_O0/pocari[P]compilerbook-9cc/ynicc.c
// Function: main
int main(int argc, char **argv) {
  bool f_dump_ast = false;
  bool f_dump_ast_only = false;
  bool f_dump_tokens = false;

  if (argc < 2) {
    fprintf(stderr, "引数の個数が正しくありません\n");
    return 1;
  }

  if (argc > 2) {
    for (int i = 1; i < argc - 1; i++) {
      if (strcmp(argv[i], "--ast") == 0) {
        f_dump_ast = true;
      }
      if (strcmp(argv[i], "--ast-only") == 0) {
        f_dump_ast = true;
        f_dump_ast_only = true;
      }
      if (strcmp(argv[i], "--tokens") == 0) {
        f_dump_tokens = true;
      }
    }
  }

  // プログラム全体を保存
  filename = argv[argc - 1];
  user_input = read_file(filename);

  // head はfree用
  Token *head = token = tokenize(user_input);
  // fprintf(stderr, "-------------------------------- tokenized\n");
  if (f_dump_tokens) {
    printf("##-----------------------------\n");
    printf("## tokens\n");
    dump_tokens(head);
  }

  // パースする(結果は グローバル変数のfunctionsに入る)
  Program *pgm = program();


  if (f_dump_ast) {
    printf("##-----------------------------\n");
    printf("## ast\n");
    dump_globals(pgm->global_var);
    for (Function *f = pgm->functions; f; f = f->next) {
      if (f_dump_ast) {
        dump_function(f);
      }
    }
  }

  if (!f_dump_ast_only) {
    codegen(pgm);
  }

  free_tokens(head);

  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movb $0x0, -0x11(%rbp)
movb $0x0, -0x12(%rbp)
movb $0x0, -0x13(%rbp)
cmpl $0x2, -0x8(%rbp)
jge 0xde6c
movq 0x71a9(%rip), %rax      # 0x14ff8
movq (%rax), %rdi
leaq 0x32db(%rip), %rsi      # 0x11134
movb $0x0, %al
callq 0x2100
movl $0x1, -0x4(%rbp)
jmp 0xdffb
cmpl $0x2, -0x8(%rbp)
jle 0xdf03
movl $0x1, -0x18(%rbp)
movl -0x18(%rbp), %eax
movl -0x8(%rbp), %ecx
subl $0x1, %ecx
cmpl %ecx, %eax
jge 0xdf01
movq -0x10(%rbp), %rax
movslq -0x18(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
leaq 0x32c3(%rip), %rsi      # 0x11160
callq 0x20f0
cmpl $0x0, %eax
jne 0xdeab
movb $0x1, -0x11(%rbp)
movq -0x10(%rbp), %rax
movslq -0x18(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
leaq 0x32a8(%rip), %rsi      # 0x11166
callq 0x20f0
cmpl $0x0, %eax
jne 0xded0
movb $0x1, -0x11(%rbp)
movb $0x1, -0x12(%rbp)
movq -0x10(%rbp), %rax
movslq -0x18(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
leaq 0x328e(%rip), %rsi      # 0x11171
callq 0x20f0
cmpl $0x0, %eax
jne 0xdef1
movb $0x1, -0x13(%rbp)
jmp 0xdef3
movl -0x18(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x18(%rbp)
jmp 0xde7d
jmp 0xdf03
movq -0x10(%rbp), %rax
movl -0x8(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movq (%rax,%rcx,8), %rax
movq %rax, 0x76a5(%rip)      # 0x155c0
movq 0x769e(%rip), %rdi      # 0x155c0
callq 0xd320
movq %rax, 0x769a(%rip)      # 0x155c8
movq 0x7693(%rip), %rdi      # 0x155c8
callq 0xcbc0
movq %rax, 0x768f(%rip)      # 0x155d0
movq %rax, -0x20(%rbp)
testb $0x1, -0x13(%rbp)
je 0xdf70
leaq 0x3228(%rip), %rdi      # 0x1117a
movb $0x0, %al
callq 0x20a0
leaq 0x323b(%rip), %rdi      # 0x1119b
movb $0x0, %al
callq 0x20a0
movq -0x20(%rbp), %rdi
callq 0x6340
movb $0x0, %al
callq 0x6860
movq %rax, -0x28(%rbp)
testb $0x1, -0x11(%rbp)
je 0xdfdc
leaq 0x31f2(%rip), %rdi      # 0x1117a
movb $0x0, %al
callq 0x20a0
leaq 0x3210(%rip), %rdi      # 0x111a6
movb $0x0, %al
callq 0x20a0
movq -0x28(%rbp), %rax
movq (%rax), %rdi
callq 0x62c0
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0xdfda
testb $0x1, -0x11(%rbp)
je 0xdfcb
movq -0x30(%rbp), %rdi
callq 0x6280
jmp 0xdfcd
movq -0x30(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0xdfb5
jmp 0xdfdc
testb $0x1, -0x12(%rbp)
jne 0xdfeb
movq -0x28(%rbp), %rdi
callq 0x22e0
movq -0x20(%rbp), %rdi
callq 0xc950
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq