user: What would the C source look like for the assembly code provided here:

```asm
<ircproto_parse_prefix>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %edx,-0x54(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    %r8d,-0x58(%rbp)
  mov    %r9,-0x68(%rbp)
  mov    -0x48(%rbp),%rax
  mov    $0x21,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x48(%rbp),%rax
  mov    $0x40,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x50(%rbp)
  je     L35
  cmpq   $0x0,-0x28(%rbp)
  je     L17
  mov    -0x28(%rbp),%rax
  sub    -0x48(%rbp),%rax
  jmp    L38
L17:
  mov    -0x18(%rbp),%rax
  sub    -0x48(%rbp),%rax
L38:
  mov    %eax,-0x40(%rbp)
  mov    -0x54(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x40(%rbp),%eax
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x48(%rbp),%rcx
  mov    -0x50(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x3c(%rbp),%eax
  cmp    -0x40(%rbp),%eax
  je     L35
  mov    -0x50(%rbp),%rax
  mov    %rax,%rsi
  lea    D2(%rip),%rax
  mov    %rax,%rdi
  call   <info@plt>
L35:
  cmpq   $0x0,-0x60(%rbp)
  je     L11
  cmpq   $0x0,-0x28(%rbp)
  je     L71
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x20(%rbp),%rax
  sub    -0x10(%rbp),%rax
  mov    %eax,-0x38(%rbp)
  mov    -0x58(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x38(%rbp),%eax
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x34(%rbp),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x60(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x34(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x34(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  je     L11
  mov    -0x60(%rbp),%rax
  mov    %rax,%rsi
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  call   <info@plt>
  jmp    L11
L71:
  mov    -0x60(%rbp),%rax
  movb   $0x0,(%rax)
L11:
  cmpq   $0x0,-0x68(%rbp)
  je     L37
  cmpq   $0x0,-0x20(%rbp)
  je     L49
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  sub    -0x8(%rbp),%rax
  mov    %eax,-0x30(%rbp)
  mov    0x10(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x30(%rbp),%eax
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x8(%rbp),%rcx
  mov    -0x68(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x2c(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  je     L37
  mov    -0x68(%rbp),%rax
  mov    %rax,%rsi
  lea    D15(%rip),%rax
  mov    %rax,%rdi
  call   <info@plt>
  jmp    L37
L49:
  mov    -0x68(%rbp),%rax
  movb   $0x0,(%rax)
L37:
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: tag: D2
type: string
name: read_data
arguments: tag: D4
type: string
name: read_data
arguments: tag: D15
type: string

tool: D2: parse_prefix: %s: nick overflow

tool: D4: parse_prefix: %s: uname overflow

tool: D15: parse_prefix: %s: host overflow

assistant: ```c
void ircproto_parse_prefix(char *prefix, char *nick, int nicksz, char *user, int usersz, char *host, int hostsz) {
  char *bang, *at, *end, *uidx, *hidx;
  int nlen, ulen, hlen;
  int ncpy, ucpy, hcpy;
  bang = strchr(prefix, '!');
  at = strchr(prefix, '@');
  end = prefix + strlen(prefix);
  if (nick) {
    nlen = bang ? bang - prefix : end - prefix;
    ncpy = ((nlen) < (nicksz - 1) ? (nlen) : (nicksz - 1));
    strncpy(nick, prefix, ncpy);
    nick[ncpy] = '\0';
    if (ncpy != nlen)
      info("parse_prefix: %s: nick overflow", nick);
  }
  if (user) {
    if (bang) {
      uidx = bang + 1;
      ulen = at - uidx;
      ucpy = ((ulen) < (usersz - 1) ? (ulen) : (usersz - 1));
      strncpy(user, uidx, ucpy);
      user[ucpy] = '\0';
      if (ucpy != ulen)
        info("parse_prefix: %s: uname overflow", user);
    } else
      user[0] = '\0';
  }
  if (host) {
    if (at) {
      hidx = at + 1;
      hlen = end - hidx;
      hcpy = ((hlen) < (hostsz - 1) ? (hlen) : (hostsz - 1));
      strncpy(host, hidx, hcpy);
      host[hcpy] = '\0';
      if (hcpy != hlen)
        info("parse_prefix: %s: host overflow", host);
    } else
      host[0] = '\0';
  }
}
```