user: Translate the below assembly code into C programming language:

```asm
<CheckTokenType>:
  endbr64
  push   %r14
  push   %r13
  mov    $0x1,%r13d
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  call   <CheckOpcode@plt>
  test   %rax,%rax
  je     L156
L234:
  pop    %rbx
  mov    %r13d,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L156:
  mov    %rbp,%rdi
  mov    $0x2,%r13d
  call   <CheckDotCommand@plt>
  test   %rax,%rax
  jne    L234
  lea    D10(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L234
  lea    D18(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L234
  movsbl 0x0(%rbp),%edi
  cmp    $0x2a,%dil
  je     L68
  mov    $0x1,%ebx
  mov    $0x4,%r13d
  cmp    $0x26,%dil
  jne    L27
  movsbl 0x1(%rbp),%edi
  mov    $0x2,%ebx
  mov    $0x8,%r13d
  jmp    L27
  nopl   0x0(%rax)
L183:
  lea    0x2(%r12),%r14d
L127:
  cmp    $0x2e,%bl
  jne    L110
  lea    0x1(%r14),%ebx
  movslq %r14d,%r14
  movsbl 0x0(%rbp,%r14,1),%edi
L27:
  call   <toupper@plt>
  lea    -0x42(%rax),%edx
  cmp    $0x1,%dl
  jbe    L69
  cmp    $0x52,%al
  je     L69
  cmp    $0x54,%al
  je     L69
  cmp    $0x57,%al
  jne    L112
L69:
  lea    0x1(%rbx),%r12d
  movslq %ebx,%rbx
  movsbl 0x0(%rbp,%rbx,1),%edi
  call   <toupper@plt>
  movsbl %al,%edi
  call   <isdigit@plt>
  test   %eax,%eax
  je     L112
  movslq %r12d,%rax
  lea    0x1(%r12),%r14d
  movsbl 0x0(%rbp,%rax,1),%edi
  call   <toupper@plt>
  movsbl %al,%edi
  mov    %edi,%ebx
  call   <isdigit@plt>
  test   %eax,%eax
  je     L127
  movslq %r14d,%r14
  movsbl 0x0(%rbp,%r14,1),%edi
  call   <toupper@plt>
  movsbl %al,%edi
  mov    %edi,%ebx
  call   <isdigit@plt>
  test   %eax,%eax
  je     L183
L112:
  xor    %r13d,%r13d
  pop    %rbx
  pop    %rbp
  mov    %r13d,%eax
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L68:
  movsbl 0x1(%rbp),%edi
  cmp    $0x26,%dil
  je     L82
  mov    $0x2,%ebx
  mov    $0x14,%r13d
  cmp    $0x2d,%dil
  jne    L27
  cmpb   $0x2d,0x2(%rbp)
  jne    L112
  movsbl 0x3(%rbp),%edi
  mov    $0x4,%ebx
  mov    $0x54,%r13d
  jmp    L27
L110:
  test   $0xdf,%bl
  je     L234
  cmp    $0x9,%bl
  je     L234
  cmp    $0x2b,%bl
  jne    L112
  test   $0x48,%r13b
  jne    L112
  movslq %r14d,%r14
  cmpb   $0x2b,0x0(%rbp,%r14,1)
  jne    L112
  cmpb   $0x0,0x1(%rbp,%r14,1)
  jne    L112
  or     $0x20,%r13d
  jmp    L234
  nopw   0x0(%rax,%rax,1)
L82:
  movsbl 0x2(%rbp),%edi
  mov    $0x3,%ebx
  mov    $0x18,%r13d
  jmp    L27
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D10
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D18
type_guessed: string

tool: D10: SIZE

tool: D18: OFFSET

assistant: ```c
uint CheckTokenType(char *word) {
  int i, parse_state;
  uint flags;
  char c;
  if (CheckOpcode(word))
    return (0x0001);
  if (CheckDotCommand(word))
    return (0x0002);
  if (!strcmp(word, "SIZE") || !strcmp(word, "OFFSET"))
    return (0x0002);
  i = 0;
  parse_state = 0;
  if (word[i] == '*') {
    flags = 0x0010;
    i++;
    if (word[i] == '&') {
      flags |= 0x0008;
      i++;
    } else {
      flags |= 0x0004;
      if (word[i] == '-') {
        if (word[i + 1] != '-')
          return (0);
        i += 2;
        flags |= 0x0040;
      }
    }
  } else if (word[i] == '&') {
    flags = 0x0008;
    i++;
  } else
    flags = 0x0004;
  for (;;) {
    c = word[i++];
    c = toupper(c);
    switch (parse_state) {
    case 0:
      if (c == 'B' || c == 'C' || c == 'R' || c == 'T' || c == 'W')
        parse_state = 1;
      else
        return (0);
      break;
    case 1:
      if (isdigit(c))
        parse_state = 2;
      else
        return (0);
      break;
    case 2:
    case 3:
      if (isdigit(c)) {
        parse_state++;
        if (parse_state > 3)
          return (0);
      } else if (c == '.')
        parse_state = 0;
      else if (!c || c == ' ' || c == 0x9)
        return (flags);
      else if (c == '+') {
        if (flags & (0x0008 | 0x0040))
          return (0);
        if (word[i] != c || word[i + 1] != 0)
          return (0);
        flags |= 0x0020;
        return (flags);
      } else
        return (0);
      break;
    }
  }
}
```