user: Please show me the C implementation that matches the assembly code listed below:

```asm
<mainMenu>:
  endbr64
  push   %r15
  lea    D0(%rip),%r15
  push   %r14
  lea    D12(%rip),%r14
  push   %r13
  lea    D59(%rip),%r13
  push   %r12
  lea    D21(%rip),%r12
  push   %rbp
  lea    D62(%rip),%rbp
  push   %rbx
  lea    D20(%rip),%rbx
  sub    $0x18,%rsp
  mov    %edi,0xc(%rsp)
L16:
  xor    %eax,%eax
  call   <clear@plt>
  mov    %rbp,%rdi
  call   <printw@plt>
  mov    %rbx,%rdi
  call   <printw@plt>
  mov    %r15,%rdi
  call   <printw@plt>
  mov    %rbx,%rdi
  call   <printw@plt>
  mov    %r14,%rdi
  call   <printw@plt>
  mov    %rbx,%rdi
  call   <printw@plt>
  mov    %r13,%rdi
  call   <printw@plt>
  mov    %r12,%rdi
  call   <printw@plt>
  lea    D54(%rip),%rdi
  call   <printw@plt>
  mov    %rbx,%rdi
  call   <printw@plt>
  mov    %rbp,%rdi
  call   <printw@plt>
  xor    %eax,%eax
  call   <refresh@plt>
  xor    %eax,%eax
  call   <getch@plt>
  cmp    $0x32,%al
  je     L15
  cmp    $0x33,%al
  je     L57
  cmp    $0x31,%al
  je     L40
  lea    D11(%rip),%rdi
  call   <printw@plt>
  xor    %eax,%eax
  call   <refresh@plt>
  jmp    L16
  nopl   (%rax)
L15:
  xor    %eax,%eax
  call   <sendHelp@plt>
  jmp    L16
  nopl   0x0(%rax)
L40:
  mov    0xc(%rsp),%edi
  call   <start_game@plt>
  jmp    L16
  cs nopw 0x0(%rax,%rax,1)
L57:
  lea    D48(%rip),%rdi
  call   <printw@plt>
  add    $0x18,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10f0 <refresh@plt>
```

tool_calls: name: retrieve_data
arguments: tag: D0
data_type: string
name: retrieve_data
arguments: tag: D12
data_type: string
name: retrieve_data
arguments: tag: D59
data_type: string
name: retrieve_data
arguments: tag: D21
data_type: string
name: retrieve_data
arguments: tag: D62
data_type: string
name: retrieve_data
arguments: tag: D20
data_type: string
name: retrieve_data
arguments: tag: D54
data_type: string
name: retrieve_data
arguments: tag: D11
data_type: string
name: retrieve_data
arguments: tag: D48
data_type: string

tool: D0: # Welcome to PACMAN ! ! !   #


tool: D12: # Choose an option:         #


tool: D59: # 1. Start Game             #


tool: D21: # 2. Help                   #


tool: D62: # # # # # # # # # # # # # # #


tool: D20: #                           #


tool: D54: # 3. Exit                   #


tool: D11: Wrong option. Try again


tool: D48: Goodbye.....



assistant: ```c
void mainMenu(int server_socket) {
  char choice;
  do {
    clear();
    printw("# # # # # # # # # # # # # # #\n");
    printw("#                           #\n");
    printw("# Welcome to PACMAN ! ! !   #\n");
    printw("#                           #\n");
    printw("# Choose an option:         #\n");
    printw("#                           #\n");
    printw("# 1. Start Game             #\n");
    printw("# 2. Help                   #\n");
    printw("# 3. Exit                   #\n");
    printw("#                           #\n");
    printw("# # # # # # # # # # # # # # #\n");
    refresh();
    choice = getch();
    switch (choice) {
    case '1':
      start_game(server_socket);
      break;
    case '2':
      sendHelp();
      break;
    case '3':
      printw("Goodbye.....\n\n");
      refresh();
      break;
    default:
      printw("Wrong option. Try again\n");
      refresh();
      break;
    }
  } while (choice != '3');
}
```