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

```asm
<odp_scan_until_marker>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L160
L30:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x20(%rbp),%rdx
  mov    %rcx,(%rdx)
  movzbl -0x9(%rbp),%edx
  mov    %dl,(%rax)
  movsbl -0x9(%rbp),%eax
  cmp    $0x3f,%eax
  jg     L168
  cmp    $0x22,%eax
  jl     L29
  sub    $0x22,%eax
  cmp    $0x1d,%eax
  ja     L29
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D13(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D13(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
L168:
  cmp    $0x5c,%eax
  jne    L29
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x8(%rbp)
  jbe    L195
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rsi
  mov    -0x20(%rbp),%rcx
  mov    %rsi,(%rcx)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  jmp    L195
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    $0x27,%edi
  call   <odp_scan_until_char@plt>
  jmp    L29
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    $0x22,%edi
  call   <odp_scan_until_char@plt>
  jmp    L29
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x8(%rbp)
  jbe    L38
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L38
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rsi
  mov    -0x20(%rbp),%rcx
  mov    %rsi,(%rcx)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <odp_scan_multi_line_comment@plt>
  jmp    L38
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    $0xa,%edi
  call   <odp_scan_until_char@plt>
  jmp    L29
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x8(%rbp)
  jbe    L56
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L56
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L56
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    $0xa,%edi
  call   <odp_scan_until_char@plt>
  jmp    L56
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,(%rax)
  mov    $0x1,%eax
  jmp    L202
L195:
  nop
  jmp    L29
L38:
  nop
  jmp    L29
L56:
  nop
L29:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,(%rax)
L160:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x8(%rbp)
  ja     L30
  mov    $0x0,%eax
L202:
  leave
  ret
```

assistant: ```c
int odp_scan_until_marker(char **sql_ptr, char **dest_ptr, long len) {
  char *end = *sql_ptr + len;
  char c;
  for (; *sql_ptr < end; ++(*sql_ptr)) {
    c = **sql_ptr;
    *((*dest_ptr)++) = c;
    switch (c) {
    case '\\':
      if (*sql_ptr < end) {
        *((*dest_ptr)++) = *(++(*sql_ptr));
      }
      break;
    case '\'':
      ++(*sql_ptr);
      odp_scan_until_char('\'', sql_ptr, dest_ptr, end - *sql_ptr);
      break;
    case '"':
      ++(*sql_ptr);
      odp_scan_until_char('"', sql_ptr, dest_ptr, end - *sql_ptr);
      break;
    case '/':
      if ((*sql_ptr < end) && *(*sql_ptr + 1) == '*') {
        *((*dest_ptr)++) = *(++(*sql_ptr));
        ++(*sql_ptr);
        odp_scan_multi_line_comment(sql_ptr, dest_ptr, end - *sql_ptr);
      }
      break;
    case '#':
      ++(*sql_ptr);
      odp_scan_until_char('\n', sql_ptr, dest_ptr, end - *sql_ptr);
      break;
    case '-':
      if (((*sql_ptr + 1) < end) && *(*sql_ptr + 1) == '-' && *(*sql_ptr + 2) == ' ') {
        ++(*sql_ptr);
        odp_scan_until_char('\n', sql_ptr, dest_ptr, end - *sql_ptr);
      }
      break;
    case '?':
      ++(*sql_ptr);
      --(*dest_ptr);
      return 1;
    }
  }
  return 0;
}
```