user: Demonstrate the C code that generates the assembly output below:

```asm
<parse_server_input>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  lea    D43(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  mov    %rax,-0x18(%rbp)
  lea    D43(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L202
  lea    D83(%rip),%rax
  mov    %rax,%rcx
  mov    $0x4,%edx
  mov    $0x0,%esi
  mov    $0xffffffff,%edi
  mov    $0x0,%eax
  call   <log_add@plt>
  mov    $0xffffffff,%eax
  jmp    L141
L202:
  cmpq   $0x0,-0x10(%rbp)
  jne    L29
  lea    D179(%rip),%rax
  mov    %rax,%rcx
  mov    $0x4,%edx
  mov    $0x0,%esi
  mov    $0xffffffff,%edi
  mov    $0x0,%eax
  call   <log_add@plt>
  mov    $0xffffffff,%eax
  jmp    L141
L29:
  lea    D143(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x1c(%rbp)
  mov    -0x10(%rbp),%rax
  lea    D206(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L72
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_hello@plt>
  jmp    L329
L72:
  mov    -0x10(%rbp),%rax
  lea    D152(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L101
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_msg@plt>
  jmp    L329
L101:
  mov    -0x10(%rbp),%rax
  lea    D207(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L235
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_ctcp@plt>
  jmp    L329
L235:
  mov    -0x10(%rbp),%rax
  lea    D125(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L296
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_notice@plt>
  jmp    L329
L296:
  mov    -0x10(%rbp),%rax
  lea    D174(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L33
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_snotice@plt>
  jmp    L329
L33:
  mov    -0x10(%rbp),%rax
  lea    D196(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L191
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_ctcpr@plt>
  jmp    L329
L191:
  mov    -0x10(%rbp),%rax
  lea    D93(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L19
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_join@plt>
  jmp    L329
L19:
  mov    -0x10(%rbp),%rax
  lea    D24(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L370
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_part@plt>
  jmp    L329
L370:
  mov    -0x10(%rbp),%rax
  lea    D157(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L30
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_nick@plt>
  jmp    L329
L30:
  mov    -0x10(%rbp),%rax
  lea    D78(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L214
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_quit@plt>
  jmp    L329
L214:
  mov    -0x10(%rbp),%rax
  lea    D79(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L49
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_connect@plt>
  jmp    L329
L49:
  mov    -0x10(%rbp),%rax
  lea    D108(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L176
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_update@plt>
  jmp    L329
L176:
  mov    -0x10(%rbp),%rax
  lea    D69(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L224
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_send@plt>
  jmp    L329
L224:
  mov    -0x10(%rbp),%rax
  lea    D105(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L328
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_topic@plt>
  jmp    L329
L328:
  mov    -0x10(%rbp),%rax
  lea    D1(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L170
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_note@plt>
  jmp    L329
L170:
  mov    -0x10(%rbp),%rax
  lea    D3(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L289
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_dcc@plt>
  jmp    L329
L289:
  mov    -0x10(%rbp),%rax
  lea    D109(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L250
  mov    -0x8(%rbp),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <server_invite@plt>
  jmp    L329
L250:
  mov    -0x10(%rbp),%rax
  mov    %rax,%r8
  lea    D17(%rip),%rax
  mov    %rax,%rcx
  mov    $0x4,%edx
  mov    $0x0,%esi
  mov    $0xffffffff,%edi
  mov    $0x0,%eax
  call   <log_add@plt>
L329:
  mov    $0x0,%eax
L141:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D43
datatype: string
name: extract_symbolic_data
arguments: label: D83
datatype: string
name: extract_symbolic_data
arguments: label: D179
datatype: string
name: extract_symbolic_data
arguments: label: D143
datatype: string
name: extract_symbolic_data
arguments: label: D206
datatype: string
name: extract_symbolic_data
arguments: label: D152
datatype: string
name: extract_symbolic_data
arguments: label: D207
datatype: string
name: extract_symbolic_data
arguments: label: D125
datatype: string
name: extract_symbolic_data
arguments: label: D174
datatype: string
name: extract_symbolic_data
arguments: label: D196
datatype: string
name: extract_symbolic_data
arguments: label: D93
datatype: string
name: extract_symbolic_data
arguments: label: D24
datatype: string
name: extract_symbolic_data
arguments: label: D157
datatype: string
name: extract_symbolic_data
arguments: label: D78
datatype: string
name: extract_symbolic_data
arguments: label: D79
datatype: string
name: extract_symbolic_data
arguments: label: D108
datatype: string
name: extract_symbolic_data
arguments: label: D69
datatype: string
name: extract_symbolic_data
arguments: label: D105
datatype: string
name: extract_symbolic_data
arguments: label: D1
datatype: string
name: extract_symbolic_data
arguments: label: D3
datatype: string
name: extract_symbolic_data
arguments: label: D109
datatype: string
name: extract_symbolic_data
arguments: label: D17
datatype: string

tool: D43:  

tool: D83: Garbage server input: no child id

tool: D179: Garbage server input: no command

tool: 

tool: D206: HELLO

tool: D152: MSG

tool: D207: CTCP

tool: D125: NOTICE

tool: D174: SNOTICE

tool: D196: CTCPR

tool: D93: JOIN

tool: D24: PART

tool: D157: NICK

tool: D78: QUIT

tool: D79: CONNECT

tool: D108: UPDATE

tool: D69: SEND

tool: D105: TOPIC

tool: D1: NOTE

tool: D3: DCC

tool: D109: INVITE

tool: D17: Garbage server input: unknown command `%s'.

assistant: ```c
int parse_server_input(char *msg) {
  char *id, *cmd, *param;
  int cid;
  id = strtok(msg, " ");
  cmd = strtok(NULL, " ");
  if (id == NULL) {
    log_add(-1, NULL, 0x00000004, "Garbage server input: no child id");
    return -1;
  }
  if (cmd == NULL) {
    log_add(-1, NULL, 0x00000004, "Garbage server input: no command");
    return -1;
  }
  param = strtok(NULL, "");
  cid = atoi(id);
  if (strcmp(cmd, "HELLO") == 0)
    server_hello(cid, param);
  else if (strcmp(cmd, "MSG") == 0)
    server_msg(cid, param);
  else if (strcmp(cmd, "CTCP") == 0)
    server_ctcp(cid, param);
  else if (strcmp(cmd, "NOTICE") == 0)
    server_notice(cid, param);
  else if (strcmp(cmd, "SNOTICE") == 0)
    server_snotice(cid, param);
  else if (strcmp(cmd, "CTCPR") == 0)
    server_ctcpr(cid, param);
  else if (strcmp(cmd, "JOIN") == 0)
    server_join(cid, param);
  else if (strcmp(cmd, "PART") == 0)
    server_part(cid, param);
  else if (strcmp(cmd, "NICK") == 0)
    server_nick(cid, param);
  else if (strcmp(cmd, "QUIT") == 0)
    server_quit(cid, param);
  else if (strcmp(cmd, "CONNECT") == 0)
    server_connect(cid, param);
  else if (strcmp(cmd, "UPDATE") == 0)
    server_update(cid, param);
  else if (strcmp(cmd, "SEND") == 0)
    server_send(cid, param);
  else if (strcmp(cmd, "TOPIC") == 0)
    server_topic(cid, param);
  else if (strcmp(cmd, "NOTE") == 0)
    server_note(cid, param);
  else if (strcmp(cmd, "DCC") == 0)
    server_dcc(cid, param);
  else if (strcmp(cmd, "INVITE") == 0)
    server_invite(cid, param);
  else {
    log_add(-1, NULL, 0x00000004, "Garbage server input: unknown command `%s'.", cmd);
  }
  return 0;
}
```