user: 这段汇编代码用C语言表示是什么样的：

```asm
<oauth_url_escape>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  test   %rdi,%rdi
  je     L129
  mov    %rdi,%rbx
  call   <strlen@plt>
  mov    %eax,0x8(%rsp)
  lea    0x1(%rax),%r14d
  movslq %r14d,%r14
  mov    %r14,%rdi
  call   <malloc@plt>
  mov    %rax,%r13
  cmp    $0x1,%r14
  je     L128
  mov    %r14,%r15
  mov    %rbx,%rbp
  mov    $0x0,%r12d
  movslq 0x8(%rsp),%rax
  add    %rbx,%rax
  mov    %rax,0x8(%rsp)
  jmp    L1
L129:
  lea    D18(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%r13
  jmp    L47
L101:
  lea    -0x41(%rbx),%eax
  movabs $0x23ffffff43ffffff,%rdx
  bt     %rax,%rdx
  jae    L57
L125:
  mov    %bl,0x0(%r13,%r12,1)
  lea    0x1(%r12),%r12
L115:
  add    $0x1,%rbp
  cmp    0x8(%rsp),%rbp
  je     L144
L1:
  movzbl 0x0(%rbp),%ebx
  cmp    $0x7f,%bl
  je     L57
  cmp    $0x40,%bl
  jg     L101
  cmp    $0x2e,%bl
  jg     L94
  cmp    $0x2c,%bl
  jg     L125
L57:
  add    $0x2,%r15
  cmp    %r14,%r15
  ja     L20
L97:
  movzbl %bl,%ecx
  lea    0x0(%r13,%r12,1),%rdi
  lea    D15(%rip),%rdx
  mov    $0x4,%esi
  call   <snprintf@plt>
  add    $0x3,%r12
  jmp    L115
L94:
  lea    -0x30(%rbx),%eax
  cmp    $0x9,%al
  ja     L57
  jmp    L125
L20:
  add    %r14,%r14
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <realloc@plt>
  mov    %rax,%r13
  jmp    L97
L128:
  mov    $0x0,%r12d
L144:
  movb   $0x0,0x0(%r13,%r12,1)
L47:
  mov    %r13,%rax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D18
data_type: string
name: extract_symbolic_data
arguments: data_label: D15
data_type: string

tool: 

tool: D15: %%%02X

assistant: ```c
char *oauth_url_escape(const char *string) {
  size_t alloc, newlen;
  char *ns = NULL, *testing_ptr = NULL;
  unsigned char in;
  size_t strindex = 0;
  size_t length;
  if (!string)
    return strdup("");
  alloc = strlen(string) + 1;
  newlen = alloc;
  ns = (char *)malloc(alloc);
  length = alloc - 1;
  while (length--) {
    in = *string;
    switch (in) {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    case 'a':
    case 'b':
    case 'c':
    case 'd':
    case 'e':
    case 'f':
    case 'g':
    case 'h':
    case 'i':
    case 'j':
    case 'k':
    case 'l':
    case 'm':
    case 'n':
    case 'o':
    case 'p':
    case 'q':
    case 'r':
    case 's':
    case 't':
    case 'u':
    case 'v':
    case 'w':
    case 'x':
    case 'y':
    case 'z':
    case 'A':
    case 'B':
    case 'C':
    case 'D':
    case 'E':
    case 'F':
    case 'G':
    case 'H':
    case 'I':
    case 'J':
    case 'K':
    case 'L':
    case 'M':
    case 'N':
    case 'O':
    case 'P':
    case 'Q':
    case 'R':
    case 'S':
    case 'T':
    case 'U':
    case 'V':
    case 'W':
    case 'X':
    case 'Y':
    case 'Z':
    case '_':
    case '~':
    case '.':
    case '-':
      ns[strindex++] = in;
      break;
    default:
      newlen += 2;
      if (newlen > alloc) {
        alloc *= 2;
        testing_ptr = (char *)realloc(ns, alloc);
        ns = testing_ptr;
      }
      snprintf(&ns[strindex], 4, "%%%02X", in);
      strindex += 3;
      break;
    }
    string++;
  }
  ns[strindex] = 0;
  return ns;
}
```