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

```asm
<CheckTokenType>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%r13
  call   <CheckOpcode@plt>
  mov    $0x1,%ebx
  test   %rax,%rax
  je     L182
L184:
  mov    %ebx,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L182:
  mov    %r13,%rdi
  call   <CheckDotCommand@plt>
  mov    $0x2,%ebx
  test   %rax,%rax
  jne    L184
  lea    D5(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L184
  lea    D12(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L184
  movzbl 0x0(%r13),%eax
  cmp    $0x2a,%al
  je     L332
  cmp    $0x26,%al
  sete   %r15b
  movzbl %r15b,%r15d
  lea    0x4(,%r15,4),%r15d
  sete   %r12b
  movzbl %r12b,%r12d
L277:
  add    $0x1,%r12d
  movslq %r12d,%r12
  mov    $0x0,%ebx
  jmp    L219
L332:
  movzbl 0x1(%r13),%eax
  cmp    $0x26,%al
  je     L287
  mov    $0x14,%r15d
  mov    $0x1,%r12d
  cmp    $0x2d,%al
  jne    L277
  mov    $0x0,%ebx
  cmpb   $0x2d,0x2(%r13)
  jne    L184
  mov    $0x54,%r15d
  mov    $0x3,%r12d
  jmp    L277
L287:
  mov    $0x18,%r15d
  mov    $0x2,%r12d
  jmp    L277
L58:
  lea    -0x2(%rbx),%eax
  cmp    $0x1,%eax
  ja     L328
  movsbl %bpl,%edi
  call   <isdigit@plt>
  test   %eax,%eax
  je     L284
  add    $0x1,%ebx
  cmp    $0x3,%ebx
  jle    L328
  mov    $0x0,%ebx
  jmp    L184
L44:
  movsbl %al,%edi
  call   <isdigit@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L184
  mov    $0x2,%ebx
L328:
  add    $0x1,%r12
L219:
  movsbl -0x1(%r13,%r12,1),%edi
  call   <toupper@plt>
  mov    %eax,%ebp
  cmp    $0x1,%ebx
  je     L44
  jg     L58
  test   %ebx,%ebx
  jne    L328
  sub    $0x42,%ebp
  cmp    $0x15,%bpl
  ja     L184
  mov    $0x250003,%eax
  bt     %rbp,%rax
  jae    L184
  mov    $0x1,%ebx
  jmp    L328
L284:
  cmp    $0x2b,%bpl
  je     L230
  jg     L296
  mov    %r15d,%ebx
  cmp    $0x9,%bpl
  je     L184
  test   $0xdf,%bpl
  cmovne %eax,%ebx
  jmp    L184
L296:
  cmp    $0x2e,%bpl
  jne    L124
  mov    %eax,%ebx
  jmp    L328
L124:
  mov    %eax,%ebx
  jmp    L184
L230:
  mov    %r15d,%ebx
  and    $0x48,%ebx
  jne    L19
  movslq %r12d,%r14
  cmpb   $0x2b,0x0(%r13,%r14,1)
  jne    L184
  cmpb   $0x0,0x1(%r13,%r14,1)
  jne    L184
  mov    %r15d,%ebx
  or     $0x20,%ebx
  jmp    L184
L19:
  mov    %eax,%ebx
  jmp    L184
```

tool_calls: name: disassemble_data
arguments: label: D5
type_infered: string
name: disassemble_data
arguments: label: D12
type_infered: string

tool: D5: SIZE

tool: D12: 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;
    }
  }
}
```