user: 请从给定的汇编指令推导出C源代码：

```asm
<unescape_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,%eax
  mov    %rdx,-0x38(%rbp)
  mov    %al,-0x2c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x18(%rbp)
L167:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x2c(%rbp)
  jne    L144
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x10(%rbp),%rax
  sub    -0x28(%rbp),%rax
  jmp    L45
L144:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L78
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x78,%eax
  jg     L150
  cmp    $0x5c,%eax
  jge    L200
  cmp    $0x30,%eax
  je     L7
  cmp    $0x30,%eax
  jg     L150
  cmp    $0x22,%eax
  je     L232
  cmp    $0x27,%eax
  je     L232
  jmp    L150
L200:
  sub    $0x5c,%eax
  cmp    $0x1c,%eax
  ja     L150
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D23(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D23(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x10(%rbp),%rax
  movb   $0x5c,(%rax)
  jmp    L70
  mov    -0x10(%rbp),%rax
  movb   $0xa,(%rax)
  jmp    L70
  mov    -0x10(%rbp),%rax
  movb   $0xd,(%rax)
  jmp    L70
  mov    -0x10(%rbp),%rax
  movb   $0x9,(%rax)
  jmp    L70
  mov    -0x10(%rbp),%rax
  movb   $0xb,(%rax)
  jmp    L70
L7:
  mov    -0x10(%rbp),%rax
  movb   $0x0,(%rax)
  jmp    L70
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isxdigit@plt>
  test   %eax,%eax
  je     L239
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isxdigit@plt>
  test   %eax,%eax
  jne    L34
L239:
  mov    $0xffffffff,%eax
  jmp    L45
L34:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rcx
  lea    -0x1c(%rbp),%rax
  mov    %rax,%rdx
  lea    D19(%rip),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <sscanf@plt>
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x2,-0x18(%rbp)
  jmp    L70
L232:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
  jmp    L70
L150:
  mov    $0xffffffff,%eax
  jmp    L45
L78:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
L70:
  addq   $0x1,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  test   %al,%al
  jne    L167
  mov    -0x38(%rbp),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x10(%rbp),%rax
  sub    -0x28(%rbp),%rax
  sub    $0x1,%eax
L45:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L191
  call   <__stack_chk_fail@plt>
L191:
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D19
type_infered: string

tool: D19: %2x

assistant: ```c
int unescape_line(char *line, char delim, char **tail) {
  char *p, *q;
  unsigned int x;
  p = q = line;
  do {
    if (*p == delim) {
      *tail = p + 1;
      return (int)(q - line);
    } else if (*p == '\\')
      switch (*++p) {
      case '\\':
        *q = '\\';
        break;
      case 'n':
        *q = '\n';
        break;
      case 'r':
        *q = '\r';
        break;
      case 't':
        *q = '\t';
        break;
      case 'v':
        *q = '\v';
        break;
      case '0':
        *q = '\0';
        break;
      case 'x':
        if (!isxdigit(p[1]) || !isxdigit(p[2]))
          return -1;
        sscanf(p + 1, "%2x", &x);
        *q = x;
        p += 2;
        break;
      case '\"':
      case '\'':
      case '`':
        *q = *p;
        break;
      default:
        return -1;
      }
    else
      *q = *p;
    q++;
  } while (*p++ != '\0');
  *tail = p;
  return (int)(q - line - 1);
}
```