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

```asm
<tok_is_multi_char_token>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  lea    D98(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L97
  mov    $0x2,%eax
  jmp    L9
L97:
  mov    -0x8(%rbp),%rax
  lea    D127(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L108
  mov    $0x2,%eax
  jmp    L9
L108:
  mov    -0x8(%rbp),%rax
  lea    D65(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L170
  mov    $0x2,%eax
  jmp    L9
L170:
  mov    -0x8(%rbp),%rax
  lea    D107(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L204
  mov    $0x2,%eax
  jmp    L9
L204:
  mov    -0x8(%rbp),%rax
  lea    D143(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L45
  mov    $0x2,%eax
  jmp    L9
L45:
  mov    -0x8(%rbp),%rax
  lea    D100(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L153
  mov    $0x2,%eax
  jmp    L9
L153:
  mov    -0x8(%rbp),%rax
  lea    D43(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L149
  mov    $0x2,%eax
  jmp    L9
L149:
  mov    -0x8(%rbp),%rax
  lea    D19(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L280
  mov    $0x2,%eax
  jmp    L9
L280:
  mov    -0x8(%rbp),%rax
  lea    D17(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L106
  mov    $0x2,%eax
  jmp    L9
L106:
  mov    -0x8(%rbp),%rax
  lea    D102(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L337
  mov    $0x2,%eax
  jmp    L9
L337:
  mov    -0x8(%rbp),%rax
  lea    D154(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L211
  mov    $0x2,%eax
  jmp    L9
L211:
  mov    -0x8(%rbp),%rax
  lea    D150(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L292
  mov    $0x2,%eax
  jmp    L9
L292:
  mov    -0x8(%rbp),%rax
  lea    D73(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L103
  mov    $0x2,%eax
  jmp    L9
L103:
  mov    -0x8(%rbp),%rax
  lea    D93(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L71
  mov    $0x2,%eax
  jmp    L9
L71:
  mov    -0x8(%rbp),%rax
  lea    D178(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L141
  mov    $0x2,%eax
  jmp    L9
L141:
  mov    -0x8(%rbp),%rax
  lea    D174(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L181
  mov    $0x2,%eax
  jmp    L9
L181:
  mov    -0x8(%rbp),%rax
  lea    D156(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L268
  mov    $0x3,%eax
  jmp    L9
L268:
  mov    -0x8(%rbp),%rax
  lea    D70(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  je     L66
  mov    $0x3,%eax
  jmp    L9
L66:
  mov    $0xffffffff,%eax
L9:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D98
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D127
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D65
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D107
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D143
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D100
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D43
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D19
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D17
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D102
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D154
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D150
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D73
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D93
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D178
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D174
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D156
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D70
type_infered: string

tool: D98: <<

tool: D127: >>

tool: D65: ==

tool: D107: !=

tool: D143: >=

tool: D100: <=

tool: D43: &&

tool: D19: ||

tool: D17: +=

tool: D102: -=

tool: D154: *=

tool: D150: /=

tool: D73: %=

tool: D93: &=

tool: D178: |=

tool: D174: ^=

tool: D156: <<=

tool: D70: >>=

assistant: ```c
int tok_is_multi_char_token(char *str) {
  if (strstarts(str, "<<"))
    return 2;
  else if (strstarts(str, ">>"))
    return 2;
  else if (strstarts(str, "=="))
    return 2;
  else if (strstarts(str, "!="))
    return 2;
  else if (strstarts(str, ">="))
    return 2;
  else if (strstarts(str, "<="))
    return 2;
  else if (strstarts(str, "&&"))
    return 2;
  else if (strstarts(str, "||"))
    return 2;
  else if (strstarts(str, "+="))
    return 2;
  else if (strstarts(str, "-="))
    return 2;
  else if (strstarts(str, "*="))
    return 2;
  else if (strstarts(str, "/="))
    return 2;
  else if (strstarts(str, "%="))
    return 2;
  else if (strstarts(str, "&="))
    return 2;
  else if (strstarts(str, "|="))
    return 2;
  else if (strstarts(str, "^="))
    return 2;
  else if (strstarts(str, "<<="))
    return 3;
  else if (strstarts(str, ">>="))
    return 3;
  return -1;
}
```