user: What is the c source code of the assembly code below?

```asm
<Tcl_Backslash>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rbx
  movl   $0x2,-0x14(%rbp)
  movzbl (%rbx),%eax
  movsbl %al,%eax
  cmp    $0x7d,%eax
  jg     L142
  cmp    $0x5b,%eax
  jge    L8
  cmp    $0xa,%eax
  je     L70
  cmp    $0xa,%eax
  jl     L142
  cmp    $0x4d,%eax
  jg     L142
  cmp    $0x20,%eax
  jge    L117
  jmp    L142
L8:
  sub    $0x5b,%eax
  cmp    $0x22,%eax
  ja     L142
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D2(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D2(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
L117:
  sub    $0x20,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  mov    %rax,%rdx
  and    $0x8000015,%edx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L68
  movabs $0x200000000000,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L360
  movabs $0x800000000,%rdx
  and    %rdx,%rax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L123
  jmp    L142
  movb   $0x8,-0x15(%rbp)
  jmp    L201
  movb   $0x1b,-0x15(%rbp)
  jmp    L201
  movb   $0xc,-0x15(%rbp)
  jmp    L201
  movb   $0xa,-0x15(%rbp)
  jmp    L201
  movb   $0xd,-0x15(%rbp)
  jmp    L201
  movb   $0x9,-0x15(%rbp)
  jmp    L201
  movb   $0xb,-0x15(%rbp)
  jmp    L201
L123:
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  jne    L23
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L400
L23:
  movb   $0x43,-0x15(%rbp)
  movl   $0x1,-0x14(%rbp)
  jmp    L201
L400:
  movl   $0x3,-0x14(%rbp)
  movzbl (%rbx),%eax
  cmp    $0x4d,%al
  jne    L210
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  jne    L213
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L81
L213:
  movb   $0xd,-0x15(%rbp)
  jmp    L201
L81:
  movl   $0x4,-0x14(%rbp)
  movzbl (%rbx),%eax
  and    $0x1f,%eax
  or     $0xffffff80,%eax
  mov    %al,-0x15(%rbp)
  jmp    L201
L210:
  movl   $0x3,-0x14(%rbp)
  movzbl (%rbx),%eax
  and    $0x1f,%eax
  mov    %al,-0x15(%rbp)
  jmp    L201
L360:
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  jne    L368
  movzbl (%rbx),%eax
  test   %al,%al
  jne    L90
L368:
  movb   $0x4d,-0x15(%rbp)
  movl   $0x1,-0x14(%rbp)
  jmp    L201
L90:
  movl   $0x3,-0x14(%rbp)
  movzbl (%rbx),%eax
  add    $0xffffff80,%eax
  mov    %al,-0x15(%rbp)
  jmp    L201
L68:
  movzbl (%rbx),%eax
  mov    %al,-0x15(%rbp)
  jmp    L201
L70:
  movb   $0x0,-0x15(%rbp)
  jmp    L201
L142:
  movzbl (%rbx),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L166
  movzbl (%rbx),%eax
  sub    $0x30,%eax
  mov    %al,-0x15(%rbp)
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L291
  movl   $0x3,-0x14(%rbp)
  movzbl -0x15(%rbp),%eax
  lea    0x0(,%rax,8),%edx
  movzbl (%rbx),%eax
  add    %edx,%eax
  sub    $0x30,%eax
  mov    %al,-0x15(%rbp)
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L91
  movl   $0x4,-0x14(%rbp)
  movzbl -0x15(%rbp),%eax
  lea    0x0(,%rax,8),%edx
  movzbl (%rbx),%eax
  add    %edx,%eax
  sub    $0x30,%eax
  mov    %al,-0x15(%rbp)
  jmp    L201
L166:
  movb   $0x5c,-0x15(%rbp)
  movl   $0x1,-0x14(%rbp)
  jmp    L201
L291:
  nop
  jmp    L201
L91:
  nop
L201:
  cmpq   $0x0,-0x30(%rbp)
  je     L3
  mov    -0x30(%rbp),%rax
  mov    -0x14(%rbp),%edx
  mov    %edx,(%rax)
L3:
  movzbl -0x15(%rbp),%eax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
char Tcl_Backslash(src, readPtr)
char *src;
int *readPtr;
{
  register char *p = src + 1;
  char result;
  int count;
  count = 2;
  switch (*p) {
  case 'b':
    result = '\b';
    break;
  case 'e':
    result = 033;
    break;
  case 'f':
    result = '\f';
    break;
  case 'n':
    result = '\n';
    break;
  case 'r':
    result = '\r';
    break;
  case 't':
    result = '\t';
    break;
  case 'v':
    result = '\v';
    break;
  case 'C':
    p++;
    if (isspace(*p) || (*p == 0)) {
      result = 'C';
      count = 1;
      break;
    }
    count = 3;
    if (*p == 'M') {
      p++;
      if (isspace(*p) || (*p == 0)) {
        result = 'M' & 037;
        break;
      }
      count = 4;
      result = (*p & 037) | 0200;
      break;
    }
    count = 3;
    result = *p & 037;
    break;
  case 'M':
    p++;
    if (isspace(*p) || (*p == 0)) {
      result = 'M';
      count = 1;
      break;
    }
    count = 3;
    result = *p + 0200;
    break;
  case '}':
  case '{':
  case ']':
  case '[':
  case '$':
  case ' ':
  case ';':
  case '"':
  case '\\':
    result = *p;
    break;
  case '\n':
    result = 0;
    break;
  default:
    if (isdigit(*p)) {
      result = *p - '0';
      p++;
      if (!isdigit(*p)) {
        break;
      }
      count = 3;
      result = (result << 3) + (*p - '0');
      p++;
      if (!isdigit(*p)) {
        break;
      }
      count = 4;
      result = (result << 3) + (*p - '0');
      break;
    }
    result = '\\';
    count = 1;
    break;
  }
  if (readPtr != 0) {
    *readPtr = count;
  }
  return result;
}
```