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

```asm
<escape_character>:
  endbr64
  push   %rbx
  mov    %rsi,%rbx
  cmp    $0x27,%dil
  jg     L119
  test   %dil,%dil
  js     L117
  cmp    $0x27,%dil
  ja     L117
  movzbl %dil,%eax
  lea    D98(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
L119:
  cmp    $0x5c,%dil
  jne    L117
  mov    $0x5,%edx
  lea    D80(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D45(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
L110:
  movb   $0x0,0x4(%rbx)
  mov    %rbx,%rax
  pop    %rbx
  ret
  mov    $0x5,%edx
  lea    D3(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D11(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D70(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D94(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D12(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D76(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D28(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D81(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
  mov    $0x5,%edx
  lea    D65(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  jmp    L110
L117:
  lea    -0x20(%rdi),%eax
  cmp    $0x5e,%al
  ja     L127
  movzbl %dil,%ecx
  lea    D2(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <snprintf@plt>
  jmp    L110
L127:
  movzbl %dil,%ecx
  lea    D43(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <snprintf@plt>
  jmp    L110
```

tool_calls: name: retrieve_data
arguments: data_label: D80
type: string
name: retrieve_data
arguments: data_label: D45
type: string
name: retrieve_data
arguments: data_label: D3
type: string
name: retrieve_data
arguments: data_label: D11
type: string
name: retrieve_data
arguments: data_label: D70
type: string
name: retrieve_data
arguments: data_label: D94
type: string
name: retrieve_data
arguments: data_label: D12
type: string
name: retrieve_data
arguments: data_label: D76
type: string
name: retrieve_data
arguments: data_label: D28
type: string
name: retrieve_data
arguments: data_label: D81
type: string
name: retrieve_data
arguments: data_label: D65
type: string
name: retrieve_data
arguments: data_label: D2
type: string
name: retrieve_data
arguments: data_label: D43
type: string

tool: D80: \\

tool: D45: \0

tool: D3: \a

tool: D11: \b

tool: D70: \f

tool: D94: \n

tool: D12: \r

tool: D76: \t

tool: D28: \v

tool: D81: \'

tool: D65: \"

tool: D2: %c

tool: D43: \x%02x

assistant: ```c
const char *escape_character(char ch, char (*buf)[5]) {
  switch (ch) {
  case '\x00':
    strncpy(*buf, "\\0", 5);
    break;
  case '\x07':
    strncpy(*buf, "\\a", 5);
    break;
  case '\x08':
    strncpy(*buf, "\\b", 5);
    break;
  case '\x0c':
    strncpy(*buf, "\\f", 5);
    break;
  case '\x0a':
    strncpy(*buf, "\\n", 5);
    break;
  case '\x0d':
    strncpy(*buf, "\\r", 5);
    break;
  case '\x09':
    strncpy(*buf, "\\t", 5);
    break;
  case '\x0b':
    strncpy(*buf, "\\v", 5);
    break;
  case '\\':
    strncpy(*buf, "\\\\", 5);
    break;
  case '\'':
    strncpy(*buf, "\\\'", 5);
    break;
  case '\"':
    strncpy(*buf, "\\\"", 5);
    break;
  default:
    if (ch >= '\x20' && ch < '\x7f')
      snprintf(*buf, 5, "%c", ch);
    else
      snprintf(*buf, 5, "\\x%02x", (unsigned char)ch);
  }
  (*buf)[4] = '\0';
  return (char *)buf;
}
```