// File: /workspace/github_c_makefile_star2_O0/mrkite[P]regs/docmaker/parser.cc
// Function: Parser::parseFunc(Symbol*, File*)
bool Parser::parseFunc(Symbol *s, File *f) {
  Function *func = new Function();
  s->kind = isFunction;
  s->asFunction = func;

  Token token;
  while ((token = f->token()).type == VAR) {
    Argument arg;
    if (!parseArgument(&arg, token, f)) {
      return false;
    }
    func->arguments.push_back(arg);
    token = f->token();
    if (!token.expect(",)")) {
      return false;
    }
    if (token.asSym == ')') {
      break;
    }
  }
  if (!token.expect(')')) {
    return false;
  }
  token = f->token();
  if (!token.expect(":;{")) {
    return false;
  }
  func->retType.symbol = nullptr;
  if (token.asSym == ':') {
    if (!parseRef(&func->retType, f)) {
      return false;
    }
    token = f->token();
    if (!token.expect(";{")) {
      return false;
    }
  }
  if (token.asSym == '{') {
    while ((token = f->token()).type == NUMBER) {
      func->signature.push_back(token.asNum);
      token = f->token();
      if (!token.expect(",}")) {
        return false;
      }
      if (token.asSym == '}') {
        break;
      }
    }
    if (!token.expect('}')) {
      return false;
    }
  }
  return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x390, %rsp            # imm = 0x390
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x310(%rbp)
movl $0x60, %edi
callq 0x3240
movq %rax, %rdi
movq %rdi, -0x308(%rbp)
xorl %esi, %esi
movl $0x60, %edx
callq 0x3140
movq -0x308(%rbp), %rdi
callq 0x6de0
movq -0x308(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movl $0x6, 0x78(%rax)
movq -0x28(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x80(%rax)
leaq -0x80(%rbp), %rdi
callq 0x6860
movq -0x20(%rbp), %rsi
leaq -0xd8(%rbp), %rdi
callq 0xc500
jmp 0x59ae
leaq -0x80(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x6c90
movl (%rax), %eax
movl %eax, -0x314(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0x68a0
movl -0x314(%rbp), %eax
cmpl $0x7, %eax
jne 0x5b47
leaq -0x138(%rbp), %rdi
movq %rdi, -0x320(%rbp)
callq 0x6e20
movq -0x310(%rbp), %rdi
movq -0x320(%rbp), %rsi
movq -0x20(%rbp), %rcx
leaq -0x80(%rbp), %rdx
callq 0x6230
movb %al, -0x315(%rbp)
jmp 0x5a17
movb -0x315(%rbp), %al
testb $0x1, %al
jne 0x5a70
jmp 0x5a23
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5b14
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe0(%rbp)
movl %eax, -0xe4(%rbp)
jmp 0x5e11
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe0(%rbp)
movl %eax, -0xe4(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x6ec0
jmp 0x5e11
movq -0x28(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0x6e50
jmp 0x5a82
movq -0x20(%rbp), %rsi
leaq -0x198(%rbp), %rdi
callq 0xc500
jmp 0x5a94
leaq -0x80(%rbp), %rdi
movq %rdi, -0x330(%rbp)
leaq -0x198(%rbp), %rsi
movq %rsi, -0x338(%rbp)
callq 0x6c90
movq -0x338(%rbp), %rdi
callq 0x68a0
movq -0x330(%rbp), %rdi
leaq 0xb667(%rip), %rsi      # 0x11133
callq 0xca90
movb %al, -0x321(%rbp)
jmp 0x5ad9
movb -0x321(%rbp), %al
testb $0x1, %al
jne 0x5af5
jmp 0x5ae5
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5b14
movsbl -0x58(%rbp), %eax
cmpl $0x29, %eax
jne 0x5b0a
movl $0x3, -0x13c(%rbp)
jmp 0x5b14
movl $0x0, -0x13c(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x6ec0
movl -0x13c(%rbp), %eax
movl %eax, -0x33c(%rbp)
testl %eax, %eax
je 0x5b42
jmp 0x5b32
movl -0x33c(%rbp), %eax
subl $0x3, %eax
je 0x5b47
jmp 0x5dfa
jmp 0x599c
leaq -0x80(%rbp), %rdi
movl $0x29, %esi
callq 0xc990
movb %al, -0x33d(%rbp)
jmp 0x5b5d
movb -0x33d(%rbp), %al
testb $0x1, %al
jne 0x5b7c
jmp 0x5b69
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5dfa
movq -0x20(%rbp), %rsi
leaq -0x1f0(%rbp), %rdi
callq 0xc500
jmp 0x5b8e
leaq -0x80(%rbp), %rdi
movq %rdi, -0x348(%rbp)
leaq -0x1f0(%rbp), %rsi
movq %rsi, -0x350(%rbp)
callq 0x6c90
movq -0x350(%rbp), %rdi
callq 0x68a0
movq -0x348(%rbp), %rdi
leaq 0xb570(%rip), %rsi      # 0x11136
callq 0xca90
movb %al, -0x33e(%rbp)
jmp 0x5bd3
movb -0x33e(%rbp), %al
testb $0x1, %al
jne 0x5bf2
jmp 0x5bdf
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5dfa
movq -0x28(%rbp), %rax
movq $0x0, 0x18(%rax)
movsbl -0x58(%rbp), %eax
cmpl $0x3a, %eax
jne 0x5cc2
movq -0x310(%rbp), %rdi
movq -0x28(%rbp), %rsi
addq $0x18, %rsi
movq -0x20(%rbp), %rdx
callq 0x6320
movb %al, -0x351(%rbp)
jmp 0x5c2b
movb -0x351(%rbp), %al
testb $0x1, %al
jne 0x5c4a
jmp 0x5c37
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5dfa
movq -0x20(%rbp), %rsi
leaq -0x248(%rbp), %rdi
callq 0xc500
jmp 0x5c5c
leaq -0x80(%rbp), %rdi
movq %rdi, -0x360(%rbp)
leaq -0x248(%rbp), %rsi
movq %rsi, -0x368(%rbp)
callq 0x6c90
movq -0x368(%rbp), %rdi
callq 0x68a0
movq -0x360(%rbp), %rdi
leaq 0xb4a3(%rip), %rsi      # 0x11137
callq 0xca90
movb %al, -0x352(%rbp)
jmp 0x5ca1
movb -0x352(%rbp), %al
testb $0x1, %al
jne 0x5cc0
jmp 0x5cad
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5dfa
jmp 0x5cc2
movsbl -0x58(%rbp), %eax
cmpl $0x7b, %eax
jne 0x5dec
jmp 0x5cd1
movq -0x20(%rbp), %rsi
leaq -0x2a0(%rbp), %rdi
callq 0xc500
jmp 0x5ce3
leaq -0x80(%rbp), %rdi
leaq -0x2a0(%rbp), %rsi
callq 0x6c90
movl (%rax), %eax
movl %eax, -0x36c(%rbp)
leaq -0x2a0(%rbp), %rdi
callq 0x68a0
movl -0x36c(%rbp), %eax
cmpl $0x2, %eax
jne 0x5db8
movq -0x28(%rbp), %rdi
addq $0x48, %rdi
movl -0x54(%rbp), %eax
movl %eax, -0x2a4(%rbp)
leaq -0x2a4(%rbp), %rsi
callq 0x6ef0
jmp 0x5d35
movq -0x20(%rbp), %rsi
leaq -0x300(%rbp), %rdi
callq 0xc500
jmp 0x5d47
leaq -0x80(%rbp), %rdi
movq %rdi, -0x378(%rbp)
leaq -0x300(%rbp), %rsi
movq %rsi, -0x380(%rbp)
callq 0x6c90
movq -0x380(%rbp), %rdi
callq 0x68a0
movq -0x378(%rbp), %rdi
leaq 0xb3b1(%rip), %rsi      # 0x11130
callq 0xca90
movb %al, -0x36d(%rbp)
jmp 0x5d8c
movb -0x36d(%rbp), %al
testb $0x1, %al
jne 0x5da8
jmp 0x5d98
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5dfa
movsbl -0x58(%rbp), %eax
cmpl $0x7d, %eax
jne 0x5db3
jmp 0x5db8
jmp 0x5cd1
leaq -0x80(%rbp), %rdi
movl $0x7d, %esi
callq 0xc990
movb %al, -0x381(%rbp)
jmp 0x5dce
movb -0x381(%rbp), %al
testb $0x1, %al
jne 0x5dea
jmp 0x5dda
movb $0x0, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
jmp 0x5dfa
jmp 0x5dec
movb $0x1, -0x1(%rbp)
movl $0x1, -0x13c(%rbp)
leaq -0x80(%rbp), %rdi
callq 0x68a0
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x390, %rsp            # imm = 0x390
popq %rbp
retq
leaq -0x80(%rbp), %rdi
callq 0x68a0
movq -0xe0(%rbp), %rdi
callq 0x3490
nopw %cs:(%rax,%rax)