user: Please show me the C implementation that matches the assembly code listed below:

```asm
<tok_is_multi_char_token>:
  endbr64
  push   %rbx
  mov    %rdi,%rbx
  lea    D38(%rip),%rsi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D56(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D76(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D119(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D74(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D94(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D3(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D176(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D168(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D29(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D84(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D117(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D54(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D50(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D63(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D31(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  mov    %rax,%rdx
  mov    $0x2,%eax
  test   %rdx,%rdx
  jne    L15
  lea    D90(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  test   %rax,%rax
  jne    L82
  lea    D123(%rip),%rsi
  mov    %rbx,%rdi
  call   <strstarts@plt>
  cmp    $0x1,%rax
  sbb    %eax,%eax
  or     $0x3,%eax
L15:
  pop    %rbx
  ret
L82:
  mov    $0x3,%eax
  jmp    L15
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D38
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D56
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D76
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D119
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D74
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D94
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D3
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D176
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D168
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D29
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D84
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D117
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D54
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D50
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D63
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D31
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D90
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D123
type_guessed: string

tool: D38: <<

tool: D56: >>

tool: D76: ==

tool: D119: !=

tool: D74: >=

tool: D94: <=

tool: D3: &&

tool: D176: ||

tool: D168: +=

tool: D29: -=

tool: D84: *=

tool: D117: /=

tool: D54: %=

tool: D50: &=

tool: D63: |=

tool: D31: ^=

tool: D90: <<=

tool: D123: >>=

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;
}
```