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

```asm
<zipc_xml_unescape>:
  endbr64
  push   %r15
  mov    $0x26,%esi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  call   <strchr@plt>
  test   %rax,%rax
  je     L20
  mov    %rax,%rbx
  movzbl (%rax),%eax
  mov    %rbx,%r15
  test   %al,%al
  je     L94
  lea    D5(%rip),%rbp
  lea    D17(%rip),%r12
  lea    D19(%rip),%r13
  jmp    L216
  nopl   0x0(%rax)
L0:
  mov    %al,(%r15)
  mov    %r14,%rbx
  add    $0x1,%r15
L183:
  movzbl (%rbx),%eax
  test   %al,%al
  je     L94
L216:
  lea    0x1(%rbx),%r14
  cmp    $0x26,%al
  jne    L0
  mov    $0x3b,%esi
  mov    %r14,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L106
  mov    $0x4,%edx
  mov    %rbp,%rsi
  mov    %r14,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L126
  add    $0x5,%rbx
  movb   $0x26,(%r15)
  add    $0x1,%r15
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L216
  nopw   0x0(%rax,%rax,1)
L94:
  movb   $0x0,(%r15)
L20:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L106:
  movzbl (%rbx),%eax
  jmp    L0
  nopl   (%rax)
L126:
  mov    $0x3,%edx
  mov    %r12,%rsi
  mov    %r14,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L142
  movb   $0x3c,(%r15)
  add    $0x4,%rbx
  add    $0x1,%r15
  jmp    L183
  nopl   (%rax)
L142:
  mov    $0x3,%edx
  mov    %r13,%rsi
  mov    %r14,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L179
  movb   $0x3e,(%r15)
  add    $0x4,%rbx
  add    $0x1,%r15
  jmp    L183
L179:
  mov    $0x5,%edx
  lea    D34(%rip),%rsi
  mov    %r14,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L220
  movb   $0x22,(%r15)
  add    $0x6,%rbx
  add    $0x1,%r15
  jmp    L183
L220:
  mov    $0x5,%edx
  lea    D24(%rip),%rsi
  mov    %r14,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L86
  movb   $0x27,(%r15)
  add    $0x6,%rbx
  add    $0x1,%r15
  jmp    L183
L86:
  cmpb   $0x23,0x1(%rbx)
  je     L137
  movb   $0x26,(%r15)
  mov    %r14,%rbx
  add    $0x1,%r15
  jmp    L183
L137:
  cmpb   $0x78,0x2(%rbx)
  lea    0x2(%rbx),%r14
  je     L65
  mov    $0xa,%edx
  xor    %esi,%esi
  mov    %r14,%rdi
  call   <strtol@plt>
L251:
  cmp    $0x7f,%eax
  jg     L113
  mov    %al,(%r15)
  add    $0x1,%r15
L249:
  mov    $0x3b,%esi
  mov    %r14,%rdi
  call   <strchr@plt>
  lea    0x1(%rax),%rbx
  jmp    L183
L65:
  mov    $0x10,%edx
  xor    %esi,%esi
  mov    %r14,%rdi
  call   <strtol@plt>
  jmp    L251
L113:
  mov    %eax,%esi
  mov    %eax,%edx
  and    $0x3f,%esi
  sar    $0x6,%edx
  or     $0xffffff80,%esi
  cmp    $0x7ff,%eax
  jg     L136
  or     $0xffffffc0,%edx
  mov    %sil,0x1(%r15)
  add    $0x2,%r15
  mov    %dl,-0x2(%r15)
  jmp    L249
L136:
  mov    %eax,%ecx
  and    $0x3f,%edx
  sar    $0xc,%ecx
  or     $0xffffff80,%edx
  cmp    $0xffff,%eax
  jg     L257
  or     $0xffffffe0,%ecx
  mov    %dl,0x1(%r15)
  add    $0x3,%r15
  mov    %cl,-0x3(%r15)
  mov    %sil,-0x1(%r15)
  jmp    L249
L257:
  sar    $0x12,%eax
  mov    %dl,0x2(%r15)
  add    $0x4,%r15
  or     $0xfffffff0,%eax
  mov    %sil,-0x1(%r15)
  mov    %al,-0x4(%r15)
  mov    %ecx,%eax
  and    $0x3f,%eax
  or     $0xffffff80,%eax
  mov    %al,-0x3(%r15)
  jmp    L249
```

tool_calls: name: retrieve_data
arguments: data_label: D5
type_infered: string
name: retrieve_data
arguments: data_label: D17
type_infered: string
name: retrieve_data
arguments: data_label: D19
type_infered: string
name: retrieve_data
arguments: data_label: D34
type_infered: string
name: retrieve_data
arguments: data_label: D24
type_infered: string

tool: D5: amp;

tool: D17: lt;

tool: D19: gt;

tool: D34: quot;

tool: D24: apos;

assistant: ```c
void zipc_xml_unescape(char *buffer) {
  char *inptr, *outptr;
  if ((inptr = strchr(buffer, '&')) == NULL)
    return;
  for (outptr = inptr; *inptr;) {
    if (*inptr == '&' && strchr(inptr + 1, ';')) {
      inptr++;
      if (!strncmp(inptr, "amp;", 4)) {
        inptr += 4;
        *outptr++ = '&';
      } else if (!strncmp(inptr, "lt;", 3)) {
        inptr += 3;
        *outptr++ = '<';
      } else if (!strncmp(inptr, "gt;", 3)) {
        inptr += 3;
        *outptr++ = '>';
      } else if (!strncmp(inptr, "quot;", 5)) {
        inptr += 5;
        *outptr++ = '\"';
      } else if (!strncmp(inptr, "apos;", 5)) {
        inptr += 5;
        *outptr++ = '\'';
      } else if (*inptr == '#') {
        int ch;
        inptr++;
        if (*inptr == 'x')
          ch = (int)strtol(inptr, NULL, 16);
        else
          ch = (int)strtol(inptr, NULL, 10);
        if (ch < 0x80) {
          *outptr++ = ch;
        } else if (ch < 0x800) {
          *outptr++ = 0xc0 | (ch >> 6);
          *outptr++ = 0x80 | (ch & 0x3f);
        } else if (ch < 0x10000) {
          *outptr++ = 0xe0 | (ch >> 12);
          *outptr++ = 0x80 | ((ch >> 6) & 0x3f);
          *outptr++ = 0x80 | (ch & 0x3f);
        } else {
          *outptr++ = 0xf0 | (ch >> 18);
          *outptr++ = 0x80 | ((ch >> 12) & 0x3f);
          *outptr++ = 0x80 | ((ch >> 6) & 0x3f);
          *outptr++ = 0x80 | (ch & 0x3f);
        }
        inptr = strchr(inptr, ';') + 1;
      } else {
        *outptr++ = '&';
      }
    } else {
      *outptr++ = *inptr++;
    }
  }
  *outptr = '\0';
}
```