user: 下面的汇编指令对应的C源代码是什么：

```asm
<zipc_xml_unescape>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    $0x26,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  je     L241
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  jmp    L234
L58:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x26,%al
  jne    L205
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  mov    $0x3b,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L205
  addq   $0x1,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    $0x4,%edx
  lea    D15(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L256
  addq   $0x4,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x26,(%rax)
  jmp    L234
L256:
  mov    -0x10(%rbp),%rax
  mov    $0x3,%edx
  lea    D22(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L242
  addq   $0x3,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x3c,(%rax)
  jmp    L234
L242:
  mov    -0x10(%rbp),%rax
  mov    $0x3,%edx
  lea    D3(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L200
  addq   $0x3,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x3e,(%rax)
  jmp    L234
L200:
  mov    -0x10(%rbp),%rax
  mov    $0x5,%edx
  lea    D42(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L127
  addq   $0x5,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x22,(%rax)
  jmp    L234
L127:
  mov    -0x10(%rbp),%rax
  mov    $0x5,%edx
  lea    D8(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L116
  addq   $0x5,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x27,(%rax)
  jmp    L234
L116:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x23,%al
  jne    L185
  addq   $0x1,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  jne    L159
  mov    -0x10(%rbp),%rax
  mov    $0x10,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtol@plt>
  mov    %eax,-0x14(%rbp)
  jmp    L146
L159:
  mov    -0x10(%rbp),%rax
  mov    $0xa,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtol@plt>
  mov    %eax,-0x14(%rbp)
L146:
  cmpl   $0x7f,-0x14(%rbp)
  jg     L112
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x14(%rbp),%edx
  mov    %dl,(%rax)
  jmp    L237
L112:
  cmpl   $0x7ff,-0x14(%rbp)
  jg     L228
  mov    -0x14(%rbp),%eax
  sar    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffffc0,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffff80,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L237
L228:
  cmpl   $0xffff,-0x14(%rbp)
  jg     L158
  mov    -0x14(%rbp),%eax
  sar    $0xc,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffffe0,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  sar    $0x6,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffff80,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffff80,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L237
L158:
  mov    -0x14(%rbp),%eax
  sar    $0x12,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xfffffff0,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  sar    $0xc,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffff80,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  sar    $0x6,%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffff80,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  and    $0x3f,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  or     $0xffffff80,%ecx
  mov    %ecx,%edx
  mov    %dl,(%rax)
L237:
  mov    -0x10(%rbp),%rax
  mov    $0x3b,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  add    $0x1,%rax
  mov    %rax,-0x10(%rbp)
  jmp    L234
L185:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x26,(%rax)
  jmp    L234
L205:
  mov    -0x10(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L234:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L58
  mov    -0x8(%rbp),%rax
  movb   $0x0,(%rax)
  jmp    L186
L241:
  nop
L186:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D15
type: string
name: retrieve_data
arguments: data_label: D22
type: string
name: retrieve_data
arguments: data_label: D3
type: string
name: retrieve_data
arguments: data_label: D42
type: string
name: retrieve_data
arguments: data_label: D8
type: string

tool: D15: amp;

tool: D22: lt;

tool: D3: gt;

tool: D42: quot;

tool: D8: 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';
}
```