user: Converte this assembly snippet into its equivalent C code:

```asm
<identifier>:
  endbr64
  push   %rbx
  mov    %rdi,%rbx
  movzbl (%rdi),%eax
  sub    $0x21,%eax
  cmp    $0x1d,%al
  ja     L20
  movzbl %al,%eax
  lea    D51(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D176(%rip),%rax
  jmp    L101
  lea    D147(%rip),%rax
L101:
  pop    %rbx
  ret
  lea    D185(%rip),%rax
  jmp    L101
  cmpb   $0x3d,0x1(%rdi)
  lea    D70(%rip),%rax
  lea    D19(%rip),%rdx
  cmove  %rdx,%rax
  jmp    L101
  cmpb   $0x3d,0x1(%rdi)
  lea    D186(%rip),%rax
  lea    D99(%rip),%rdx
  cmove  %rdx,%rax
  jmp    L101
  lea    D40(%rip),%rax
  cmpb   $0x3d,0x1(%rdi)
  je     L101
L20:
  mov    $0x2d,%esi
  mov    %rbx,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L192
  mov    $0x2e,%esi
  mov    %rbx,%rdi
  call   <strchr@plt>
  mov    %rax,%rdx
  mov    %rbx,%rax
  test   %rdx,%rdx
  je     L101
L192:
  mov    %rbx,%rdi
  call   <GC_strdup@plt>
  movzbl (%rax),%edx
  test   %dl,%dl
  je     L101
  mov    %rax,%rcx
  jmp    L87
  movzbl 0x1(%rdi),%eax
  sub    $0x2a,%eax
  cmp    $0x14,%al
  ja     L170
  movzbl %al,%eax
  lea    D179(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D117(%rip),%rax
  jmp    L101
  lea    D29(%rip),%rax
  jmp    L101
  lea    D50(%rip),%rax
  jmp    L101
  lea    D34(%rip),%rax
  jmp    L101
  lea    D149(%rip),%rax
  jmp    L101
L170:
  lea    D45(%rip),%rax
  jmp    L101
L196:
  add    $0x1,%rcx
  movzbl (%rcx),%edx
  test   %dl,%dl
  je     L101
L87:
  sub    $0x2d,%edx
  cmp    $0x1,%dl
  ja     L196
  movb   $0x5f,(%rcx)
  jmp    L196
  lea    D139(%rip),%rax
  jmp    L101
  lea    D110(%rip),%rax
  jmp    L101
  lea    D138(%rip),%rax
  jmp    L101
```

tool_calls: name: parse_data
arguments: data_label: D176
type_infered: string
name: parse_data
arguments: data_label: D147
type_infered: string
name: parse_data
arguments: data_label: D185
type_infered: string
name: parse_data
arguments: data_label: D70
type_infered: string
name: parse_data
arguments: data_label: D19
type_infered: string
name: parse_data
arguments: data_label: D186
type_infered: string
name: parse_data
arguments: data_label: D99
type_infered: string
name: parse_data
arguments: data_label: D40
type_infered: string
name: parse_data
arguments: data_label: D117
type_infered: string
name: parse_data
arguments: data_label: D29
type_infered: string
name: parse_data
arguments: data_label: D50
type_infered: string
name: parse_data
arguments: data_label: D34
type_infered: string
name: parse_data
arguments: data_label: D149
type_infered: string
name: parse_data
arguments: data_label: D45
type_infered: string
name: parse_data
arguments: data_label: D139
type_infered: string
name: parse_data
arguments: data_label: D110
type_infered: string
name: parse_data
arguments: data_label: D138
type_infered: string

tool: D176: mul

tool: D147: divide

tool: D185: eql

tool: D70: less

tool: D19: leql

tool: D186: greater

tool: D99: geql

tool: D40: neql

tool: D117: fmul

tool: D29: fsub

tool: D50: fdiv

tool: D34: fless

tool: D149: fgreater

tool: D45: stop

tool: D139: add

tool: D110: sub

tool: D138: fadd

assistant: ```c
char *identifier(const char *str) {
  int i;
  char *ptr;
  switch (*str) {
  case '+':
    return "add";
  case '*':
    return "mul";
  case '-':
    return "sub";
  case '/':
    return "divide";
  case '=':
    return "eql";
  case '<':
    if (str[1] == '=')
      return "leql";
    return "less";
  case '>':
    if (str[1] == '=')
      return "geql";
    return "greater";
  case '!':
    if (str[1] == '=')
      return "neql";
    break;
  case '.':
    switch (str[1]) {
    case '+':
      return "fadd";
    case '*':
      return "fmul";
    case '-':
      return "fsub";
    case '/':
      return "fdiv";
    case '<':
      return "fless";
    case '>':
      return "fgreater";
    default:
      return "stop";
    }
    break;
  }
  ptr = (char *)str;
  if (strchr(ptr, '-') || strchr(ptr, '.')) {
    ptr = GC_strdup(ptr);
    for (i = 0; ptr[i]; i++)
      if (ptr[i] == '-' || ptr[i] == '.')
        ptr[i] = '_';
  }
  return ptr;
}
```