user: 请将以下的汇编代码转换成C语言代码：

```asm
<parse_escape>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x28(%rbp),%rdx
  mov    %rcx,(%rdx)
  movzbl (%rax),%eax
  movsbl %al,%ebx
  cmp    $0x76,%ebx
  jg     L101
  cmp    $0x30,%ebx
  jge    L200
  test   %ebx,%ebx
  je     L199
  cmp    $0xa,%ebx
  je     L265
  jmp    L101
L200:
  lea    -0x30(%rbx),%eax
  cmp    $0x46,%eax
  ja     L101
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D6(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D6(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    $0x7,%eax
  jmp    L228
  mov    $0x8,%eax
  jmp    L228
  mov    $0x1b,%eax
  jmp    L228
  mov    $0xc,%eax
  jmp    L228
  mov    $0xa,%eax
  jmp    L228
  mov    $0xd,%eax
  jmp    L228
  mov    $0x9,%eax
  jmp    L228
  mov    $0xb,%eax
  jmp    L228
L265:
  mov    $0xfffffffe,%eax
  jmp    L228
L199:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  mov    $0x0,%eax
  jmp    L228
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x28(%rbp),%rdx
  mov    %rcx,(%rdx)
  movzbl (%rax),%eax
  movsbl %al,%ebx
  cmp    $0x5c,%ebx
  jne    L238
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <parse_escape>
  mov    %eax,%ebx
L238:
  cmp    $0x3f,%ebx
  jne    L104
  mov    $0x7f,%eax
  jmp    L228
L104:
  mov    %ebx,%eax
  and    $0x9f,%eax
  jmp    L228
  lea    -0x30(%rbx),%r12d
  mov    $0x0,%r13d
  jmp    L224
L245:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x28(%rbp),%rdx
  mov    %rcx,(%rdx)
  movzbl (%rax),%eax
  movsbl %al,%ebx
  cmp    $0x2f,%ebx
  jle    L119
  cmp    $0x37,%ebx
  jg     L119
  shl    $0x3,%r12d
  lea    -0x30(%rbx),%eax
  add    %eax,%r12d
  jmp    L224
L119:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L116
L224:
  add    $0x1,%r13d
  cmp    $0x2,%r13d
  jle    L245
L116:
  mov    %r12d,%eax
  jmp    L228
L101:
  mov    %ebx,%eax
L228:
  add    $0x18,%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %rbp
  ret
```

assistant: ```c
int parse_escape(string_ptr)
char **string_ptr;
{
  register int c = *(*string_ptr)++;
  switch (c) {
  case 'a':
    return '\a';
  case 'b':
    return '\b';
  case 'e':
    return 033;
  case 'f':
    return '\f';
  case 'n':
    return '\n';
  case 'r':
    return '\r';
  case 't':
    return '\t';
  case 'v':
    return '\v';
  case '\n':
    return -2;
  case 0:
    (*string_ptr)--;
    return 0;
  case '^':
    c = *(*string_ptr)++;
    if (c == '\\')
      c = parse_escape(string_ptr);
    if (c == '?')
      return 0177;
    return (c & 0200) | (c & 037);
  case '0':
  case '1':
  case '2':
  case '3':
  case '4':
  case '5':
  case '6':
  case '7': {
    register int i = c - '0';
    register int count = 0;
    while (++count < 3) {
      if ((c = *(*string_ptr)++) >= '0' && c <= '7') {
        i *= 8;
        i += c - '0';
      } else {
        (*string_ptr)--;
        break;
      }
    }
    return i;
  }
  default:
    return c;
  }
}
```