user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<unquote>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x18,%rsp
  movzbl (%rsi),%eax
  test   %al,%al
  je     L61
  mov    %rsi,%rbx
  lea    D4(%rip),%r13
  jmp    L89
  nopl   0x0(%rax,%rax,1)
L244:
  mov    %al,-0x1(%rbp)
  add    $0x1,%rbx
L128:
  movzbl (%rbx),%eax
  test   %al,%al
  je     L61
L89:
  add    $0x1,%rbp
  cmp    $0x5c,%al
  jne    L244
  movzbl 0x1(%rbx),%r12d
  test   %r12b,%r12b
  je     L244
  lea    -0x30(%r12),%eax
  cmp    $0x7,%al
  ja     L109
  movzbl 0x2(%rbx),%ecx
  lea    -0x30(%rcx),%edx
  cmp    $0x7,%dl
  ja     L52
  movzbl 0x3(%rbx),%ecx
  sub    $0x30,%ecx
  cmp    $0x7,%cl
  ja     L52
  lea    (%rdx,%rax,8),%eax
  add    $0x4,%rbx
  lea    (%rcx,%rax,8),%eax
  mov    %al,-0x1(%rbp)
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L89
L61:
  movb   $0x0,0x0(%rbp)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L109:
  cmp    $0x78,%r12b
  je     L240
  cmp    $0xa,%r12b
  je     L20
  lea    -0x61(%r12),%eax
  cmp    $0x15,%al
  ja     L52
  movzbl %al,%eax
  movslq 0x0(%r13,%rax,4),%rax
  add    %r13,%rax
  notrack jmp *%rax
  nopl   0x0(%rax,%rax,1)
L240:
  movzbl 0x2(%rbx),%r14d
  lea    -0x30(%r14),%eax
  cmp    $0x9,%al
  jbe    L107
  movsbl %r14b,%edi
  call   <tolower@plt>
  sub    $0x61,%eax
  cmp    $0x5,%eax
  jbe    L107
  cs nopw 0x0(%rax,%rax,1)
L52:
  mov    %r12b,-0x1(%rbp)
L20:
  add    $0x2,%rbx
  jmp    L128
  nopl   (%rax)
L107:
  movzbl 0x3(%rbx),%r15d
  lea    -0x30(%r15),%edx
  cmp    $0x9,%dl
  ja     L260
L72:
  movsbl %r14b,%edi
  mov    %edi,%r12d
  shl    $0x4,%r12d
  cmp    $0x39,%r14b
  jle    L81
  mov    %dl,0xf(%rsp)
  call   <tolower@plt>
  movzbl 0xf(%rsp),%edx
  lea    -0x57(%rax),%r12d
  shl    $0x4,%r12d
L81:
  cmp    $0x39,%r15b
  jle    L99
  movsbl %r15b,%edi
  call   <tolower@plt>
  lea    -0x57(%rax),%edx
L99:
  add    %edx,%r12d
  add    $0x4,%rbx
  mov    %r12b,-0x1(%rbp)
  jmp    L128
  nopw   0x0(%rax,%rax,1)
L260:
  movsbl %r15b,%edi
  mov    %dl,0xf(%rsp)
  call   <tolower@plt>
  movzbl 0xf(%rsp),%edx
  sub    $0x61,%eax
  cmp    $0x5,%eax
  ja     L52
  jmp    L72
  movb   $0xc,-0x1(%rbp)
  add    $0x2,%rbx
  jmp    L128
  movb   $0xa,-0x1(%rbp)
  add    $0x2,%rbx
  jmp    L128
  movb   $0x7,-0x1(%rbp)
  add    $0x2,%rbx
  jmp    L128
  movb   $0xb,-0x1(%rbp)
  add    $0x2,%rbx
  jmp    L128
  movb   $0xd,-0x1(%rbp)
  add    $0x2,%rbx
  jmp    L128
  movb   $0x9,-0x1(%rbp)
  add    $0x2,%rbx
  jmp    L128
```

assistant: ```c
void unquote(char *unquotedString, const char *quotedString) {
  const char *s = quotedString;
  char *d = unquotedString;
  while (*s != '\0') {
    if (*s == '\\' && s[1] != '\0') {
      if (((s[1]) >= '0' && (s[1]) <= '7') && ((s[2]) >= '0' && (s[2]) <= '7') && ((s[3]) >= '0' && (s[3]) <= '7')) {
        *d++ = ((s[1]) - '0') * 64 + ((s[2]) - '0') * 8 + ((s[3]) - '0');
        s += 4;
      } else if (s[1] == 'x' && (((s[2]) >= '0' && (s[2]) <= '9') || (tolower(s[2]) >= 'a' && tolower(s[2]) <= 'f')) && (((s[3]) >= '0' && (s[3]) <= '9') || (tolower(s[3]) >= 'a' && tolower(s[3]) <= 'f'))) {
        *d++ = ((s[2]) > '9' ? (10 + (tolower(s[2]) - 'a')) : ((s[2]) - '0')) * 16 + ((s[3]) > '9' ? (10 + (tolower(s[3]) - 'a')) : ((s[3]) - '0'));
        s += 4;
      } else {
        if (s[1] == 'n')
          *d++ = '\n';
        else if (s[1] == 'r')
          *d++ = '\r';
        else if (s[1] == 'f')
          *d++ = '\f';
        else if (s[1] == 't')
          *d++ = '\t';
        else if (s[1] == 'a')
          *d++ = '\a';
        else if (s[1] == 'v')
          *d++ = '\v';
        else if (s[1] == '\n')
          *d++;
        else
          *d++ = s[1];
        s += 2;
      }
    } else {
      *d++ = *s++;
    }
  }
  *d++ = '\0';
}
```