// File: /workspace/github_c_makefile_star2_O0/takoeight0821[P]hoc_nyan/src/token.c
// Function: next_token
static Token* next_token(void) {
  if (*cur == '\0') {
    return NULL;
  }

  if (start_with("/*", cur)) {
    while (!start_with("*/", cur)) {
      consume();
    }
    consume();
    consume();
    return next_token();
  }

  if (start_with("//", cur)) {
    consume();
    consume();
    while (*cur != '\n') {
      consume();
    }
    return next_token();
  }

  if (bol && *cur == '#') {
    consume();
    if (start_with("define", cur)) {
      Token* token = new_token(TDIRECTIVE, cur);
      token->bol = true;
      cur += strlen("define");
      token->ident = "define";
      return token;
    } else if (start_with("include", cur)) {
      Token* token = new_token(TDIRECTIVE, cur);
      token->bol = true;
      cur += strlen("include");
      token->ident = "include";
      whitespace();
      token->str = read_include_path();
      return token;
    } else if (start_with("ifdef", cur)) {
      Token* token = new_token(TDIRECTIVE, cur);
      token->bol = true;
      cur += strlen("ifdef");
      token->ident = "ifdef";
      return token;
    } else if (start_with("ifndef", cur)) {
      Token* token = new_token(TDIRECTIVE, cur);
      token->bol = true;
      cur += strlen("ifndef");
      token->ident = "ifndef";
      return token;
    } else if (start_with("endif", cur)) {
      Token* token = new_token(TDIRECTIVE, cur);
      token->bol = true;
      cur += strlen("endif");
      token->ident = "endif";
      return token;
    } else {
      print_line(src, cur);
      error("invalid preprocessing directive\n");
    }
  } else if (*cur == '#') {
    print_line(src, cur);
    error("invalid #\n");
  }

  if (strchr(" \t\n\r", *cur)) {
    whitespace();
    return next_token();
  }

  if (strchr("0123456789", *cur)) {
    return integer(cur);
  }

  for (int i = 0; i < (sizeof(punctuators) / sizeof(char*)); i++) {
    if (start_with(punctuators[i], cur)) {
      Token* t = new_reserved(cur, punctuators[i]);
      cur += strlen(punctuators[i]);
      return t;
    }
  }

  for (int i = 0; i < (sizeof(keywords) / sizeof(char*)); i++) {
    if (start_with(keywords[i], cur)) {
      Token* t = new_reserved(cur, keywords[i]);
      cur += strlen(keywords[i]);
      if (isalnum(*cur) || *cur == '_') {
        cur -= strlen(keywords[i]);
      } else {
        return t;
      }
    }
  }

  if ('\"' == *cur) {
    char* start = cur;
    consume();
    StringBuilder* sb = new_sb();
    while (*cur != '\"') {
      sb_putc(sb, read_char());
    }
    consume();
    Token* tok = new_token(TSTRING, start);
    tok->str = sb_run(sb);
    return tok;
  }

  if ('\'' == *cur) {
    consume();
    Token* t = new_token(TINT, cur - 1);
    t->integer = read_char();
    if (*cur != '\'') {
      print_line(src, cur);
      error("expected ' but actual %c\n", *cur);
    }
    consume();
    return t;
  }

  if (isalpha(*cur) || *cur == '_') {
    return ident(cur);
  }

  print_line(src, cur);
  error("invalid character: %c\n", *cur);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq 0x881e(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0x0, %eax
jne 0xeed7
movq $0x0, -0x8(%rbp)
jmp 0xf55f
movq 0x8802(%rip), %rsi      # 0x176e0
leaq 0x4763(%rip), %rdi      # 0x13648
callq 0xf570
testb $0x1, %al
jne 0xeef0
jmp 0xef2c
jmp 0xeef2
movq 0x87e7(%rip), %rsi      # 0x176e0
leaq 0x474b(%rip), %rdi      # 0x1364b
callq 0xf570
xorb $-0x1, %al
testb $0x1, %al
jne 0xef0d
jmp 0xef14
callq 0xf970
jmp 0xeef2
callq 0xf970
callq 0xf970
callq 0xeeb0
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x87ad(%rip), %rsi      # 0x176e0
leaq 0x4714(%rip), %rdi      # 0x1364e
callq 0xf570
testb $0x1, %al
jne 0xef45
jmp 0xef73
callq 0xf970
callq 0xf970
movq 0x878a(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0xa, %eax
je 0xef65
callq 0xf970
jmp 0xef4f
callq 0xeeb0
movq %rax, -0x8(%rbp)
jmp 0xf55f
testb $0x1, 0x83b6(%rip)      # 0x17330
je 0xf1c2
movq 0x8759(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0x23, %eax
jne 0xf1c2
callq 0xf970
movq 0x8741(%rip), %rsi      # 0x176e0
leaq 0x3066(%rip), %rdi      # 0x1200c
callq 0xf570
testb $0x1, %al
jne 0xefb1
jmp 0xeffc
movq 0x8728(%rip), %rsi      # 0x176e0
movl $0x4, %edi
callq 0xf5f0
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movb $0x1, 0x30(%rax)
movq 0x870b(%rip), %rax      # 0x176e0
addq $0x6, %rax
movq %rax, 0x8700(%rip)      # 0x176e0
movq -0x10(%rbp), %rax
leaq 0x3021(%rip), %rcx      # 0x1200c
movq %rcx, 0x10(%rax)
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x86dd(%rip), %rsi      # 0x176e0
leaq 0x3014(%rip), %rdi      # 0x1201e
callq 0xf570
testb $0x1, %al
jne 0xf015
jmp 0xf075
movq 0x86c4(%rip), %rsi      # 0x176e0
movl $0x4, %edi
callq 0xf5f0
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movb $0x1, 0x30(%rax)
movq 0x86a7(%rip), %rax      # 0x176e0
addq $0x7, %rax
movq %rax, 0x869c(%rip)      # 0x176e0
movq -0x18(%rbp), %rax
leaq 0x2fcf(%rip), %rcx      # 0x1201e
movq %rcx, 0x10(%rax)
callq 0xf9e0
callq 0xf660
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x8664(%rip), %rsi      # 0x176e0
leaq 0x2fa3(%rip), %rdi      # 0x12026
callq 0xf570
testb $0x1, %al
jne 0xf08e
jmp 0xf0d9
movq 0x864b(%rip), %rsi      # 0x176e0
movl $0x4, %edi
callq 0xf5f0
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movb $0x1, 0x30(%rax)
movq 0x862e(%rip), %rax      # 0x176e0
addq $0x5, %rax
movq %rax, 0x8623(%rip)      # 0x176e0
movq -0x20(%rbp), %rax
leaq 0x2f5e(%rip), %rcx      # 0x12026
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x8600(%rip), %rsi      # 0x176e0
leaq 0x2f45(%rip), %rdi      # 0x1202c
callq 0xf570
testb $0x1, %al
jne 0xf0f2
jmp 0xf13d
movq 0x85e7(%rip), %rsi      # 0x176e0
movl $0x4, %edi
callq 0xf5f0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movb $0x1, 0x30(%rax)
movq 0x85ca(%rip), %rax      # 0x176e0
addq $0x6, %rax
movq %rax, 0x85bf(%rip)      # 0x176e0
movq -0x28(%rbp), %rax
leaq 0x2f00(%rip), %rcx      # 0x1202c
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x859c(%rip), %rsi      # 0x176e0
leaq 0x2ee8(%rip), %rdi      # 0x12033
callq 0xf570
testb $0x1, %al
jne 0xf156
jmp 0xf1a1
movq 0x8583(%rip), %rsi      # 0x176e0
movl $0x4, %edi
callq 0xf5f0
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movb $0x1, 0x30(%rax)
movq 0x8566(%rip), %rax      # 0x176e0
addq $0x5, %rax
movq %rax, 0x855b(%rip)      # 0x176e0
movq -0x30(%rbp), %rax
leaq 0x2ea3(%rip), %rcx      # 0x12033
movq %rcx, 0x10(%rax)
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x8530(%rip), %rdi      # 0x176d8
movq 0x8531(%rip), %rsi      # 0x176e0
callq 0xec40
leaq 0x4496(%rip), %rdi      # 0x13651
movb $0x0, %al
callq 0xfb50
movq 0x8517(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0x23, %eax
jne 0xf1f2
movq 0x8500(%rip), %rdi      # 0x176d8
movq 0x8501(%rip), %rsi      # 0x176e0
callq 0xec40
leaq 0x4487(%rip), %rdi      # 0x13672
movb $0x0, %al
callq 0xfb50
jmp 0xf1f4
movq 0x84e5(%rip), %rax      # 0x176e0
movsbl (%rax), %esi
leaq 0x4478(%rip), %rdi      # 0x1367d
callq 0x2080
cmpq $0x0, %rax
je 0xf223
callq 0xf9e0
callq 0xeeb0
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x84b6(%rip), %rax      # 0x176e0
movsbl (%rax), %esi
leaq 0x444e(%rip), %rdi      # 0x13682
callq 0x2080
cmpq $0x0, %rax
je 0xf254
movq 0x849a(%rip), %rdi      # 0x176e0
callq 0xf720
movq %rax, -0x8(%rbp)
jmp 0xf55f
movl $0x0, -0x34(%rbp)
movslq -0x34(%rbp), %rax
cmpq $0x2e, %rax
jae 0xf2e4
movslq -0x34(%rbp), %rcx
leaq 0x80d0(%rip), %rax      # 0x17340
movq (%rax,%rcx,8), %rdi
movq 0x8465(%rip), %rsi      # 0x176e0
callq 0xf570
testb $0x1, %al
jne 0xf286
jmp 0xf2d4
movq 0x8453(%rip), %rdi      # 0x176e0
movslq -0x34(%rbp), %rcx
leaq 0x80a8(%rip), %rax      # 0x17340
movq (%rax,%rcx,8), %rsi
callq 0xf7a0
movq %rax, -0x40(%rbp)
movslq -0x34(%rbp), %rcx
leaq 0x8090(%rip), %rax      # 0x17340
movq (%rax,%rcx,8), %rdi
callq 0x2070
addq 0x8420(%rip), %rax      # 0x176e0
movq %rax, 0x8419(%rip)      # 0x176e0
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
jmp 0xf2d6
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0xf25b
movl $0x0, -0x44(%rbp)
movslq -0x44(%rbp), %rax
cmpq $0x2b, %rax
jae 0xf3dc
movslq -0x44(%rbp), %rcx
leaq 0x81ac(%rip), %rax      # 0x174b0
movq (%rax,%rcx,8), %rdi
movq 0x83d1(%rip), %rsi      # 0x176e0
callq 0xf570
testb $0x1, %al
jne 0xf31d
jmp 0xf3cc
movq 0x83bc(%rip), %rdi      # 0x176e0
movslq -0x44(%rbp), %rcx
leaq 0x8181(%rip), %rax      # 0x174b0
movq (%rax,%rcx,8), %rsi
callq 0xf7a0
movq %rax, -0x50(%rbp)
movslq -0x44(%rbp), %rcx
leaq 0x8169(%rip), %rax      # 0x174b0
movq (%rax,%rcx,8), %rdi
callq 0x2070
addq 0x8389(%rip), %rax      # 0x176e0
movq %rax, 0x8382(%rip)      # 0x176e0
callq 0x2170
movq (%rax), %rax
movq 0x8373(%rip), %rcx      # 0x176e0
movsbl (%rcx), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x8, %eax
cmpl $0x0, %eax
jne 0xf38e
movq 0x835a(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0x5f, %eax
jne 0xf3bd
movslq -0x44(%rbp), %rcx
leaq 0x8117(%rip), %rax      # 0x174b0
movq (%rax,%rcx,8), %rdi
callq 0x2070
movq %rax, %rdx
movq 0x8334(%rip), %rax      # 0x176e0
xorl %ecx, %ecx
subq %rdx, %rcx
addq %rcx, %rax
movq %rax, 0x8325(%rip)      # 0x176e0
jmp 0xf3ca
movq -0x50(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
jmp 0xf3cc
jmp 0xf3ce
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0xf2eb
movq 0x82fd(%rip), %rax      # 0x176e0
movsbl (%rax), %ecx
movl $0x22, %eax
cmpl %ecx, %eax
jne 0xf46a
movq 0x82ea(%rip), %rax      # 0x176e0
movq %rax, -0x58(%rbp)
callq 0xf970
callq 0xfcd0
movq %rax, -0x60(%rbp)
movq 0x82d1(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0x22, %eax
je 0xf432
movq -0x60(%rbp), %rax
movq %rax, -0x78(%rbp)
callq 0xf7e0
movq -0x78(%rbp), %rdi
movsbl %al, %esi
callq 0xfd30
jmp 0xf408
callq 0xf970
movq -0x58(%rbp), %rsi
movl $0x1, %edi
callq 0xf5f0
movq %rax, -0x68(%rbp)
movq -0x60(%rbp), %rdi
callq 0xfe20
movq %rax, %rcx
movq -0x68(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x68(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x826f(%rip), %rax      # 0x176e0
movsbl (%rax), %ecx
movl $0x27, %eax
cmpl %ecx, %eax
jne 0xf4f0
callq 0xf970
movq 0x8257(%rip), %rsi      # 0x176e0
addq $-0x1, %rsi
xorl %edi, %edi
callq 0xf5f0
movq %rax, -0x70(%rbp)
callq 0xf7e0
movsbl %al, %ecx
movq -0x70(%rbp), %rax
movl %ecx, 0xc(%rax)
movq 0x8232(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0x27, %eax
je 0xf4e1
movq 0x821b(%rip), %rdi      # 0x176d8
movq 0x821c(%rip), %rsi      # 0x176e0
callq 0xec40
movq 0x8210(%rip), %rax      # 0x176e0
movsbl (%rax), %esi
leaq 0x41b3(%rip), %rdi      # 0x1368d
movb $0x0, %al
callq 0xfb50
callq 0xf970
movq -0x70(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xf55f
callq 0x2170
movq (%rax), %rax
movq 0x81e1(%rip), %rcx      # 0x176e0
movsbl (%rcx), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x400, %eax            # imm = 0x400
cmpl $0x0, %eax
jne 0xf522
movq 0x81c6(%rip), %rax      # 0x176e0
movsbl (%rax), %eax
cmpl $0x5f, %eax
jne 0xf534
movq 0x81b7(%rip), %rdi      # 0x176e0
callq 0xf8c0
movq %rax, -0x8(%rbp)
jmp 0xf55f
movq 0x819d(%rip), %rdi      # 0x176d8
movq 0x819e(%rip), %rsi      # 0x176e0
callq 0xec40
movq 0x8192(%rip), %rax      # 0x176e0
movsbl (%rax), %esi
leaq 0x414f(%rip), %rdi      # 0x136a7
movb $0x0, %al
callq 0xfb50
movq -0x8(%rbp), %rax
addq $0x80, %rsp
popq %rbp
retq
nopl (%rax)