user: 请将以下的汇编代码转换成C语言代码：

```asm
<Assign_State>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %edx,-0x30(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0xffffffff,-0x14(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  jne    L77
  movl   $0x0,-0x18(%rbp)
  jmp    L103
L100:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x41,%eax
  cmp    $0x14,%eax
  ja     L249
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D7(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D7(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x18(%rbp),%eax
  cltq
  movl   $0x0,-0x14(%rbp,%rax,4)
  jmp    L45
  mov    -0x18(%rbp),%eax
  cltq
  movl   $0x1,-0x14(%rbp,%rax,4)
  jmp    L45
  mov    -0x18(%rbp),%eax
  cltq
  movl   $0x2,-0x14(%rbp,%rax,4)
  jmp    L45
  mov    -0x18(%rbp),%eax
  cltq
  movl   $0x3,-0x14(%rbp,%rax,4)
  jmp    L45
  mov    -0x18(%rbp),%eax
  cltq
  movl   $0x3,-0x14(%rbp,%rax,4)
  jmp    L45
L249:
  mov    -0x18(%rbp),%eax
  cltq
  movl   $0xffffffff,-0x14(%rbp,%rax,4)
  nop
L45:
  addl   $0x1,-0x18(%rbp)
L103:
  mov    -0x18(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jl     L100
  cmpl   $0x1,-0x30(%rbp)
  jle    L298
  mov    -0x14(%rbp),%eax
  lea    0x0(,%rax,4),%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  lea    0x0(,%rax,4),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  jmp    L294
L298:
  mov    -0x14(%rbp),%eax
  jmp    L294
L77:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x41,%eax
  cmp    $0x19,%eax
  ja     L172
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D27(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D27(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  movl   $0x0,-0x14(%rbp)
  jmp    L3
  movl   $0x1,-0x14(%rbp)
  jmp    L3
  movl   $0x2,-0x14(%rbp)
  jmp    L3
  movl   $0x3,-0x14(%rbp)
  jmp    L3
  movl   $0x4,-0x14(%rbp)
  jmp    L3
  movl   $0x5,-0x14(%rbp)
  jmp    L3
  movl   $0x6,-0x14(%rbp)
  jmp    L3
  movl   $0x7,-0x14(%rbp)
  jmp    L3
  movl   $0x8,-0x14(%rbp)
  jmp    L3
  movl   $0x9,-0x14(%rbp)
  jmp    L3
  movl   $0xa,-0x14(%rbp)
  jmp    L3
  movl   $0xb,-0x14(%rbp)
  jmp    L3
  movl   $0xc,-0x14(%rbp)
  jmp    L3
  movl   $0xd,-0x14(%rbp)
  jmp    L3
  movl   $0xe,-0x14(%rbp)
  jmp    L3
  movl   $0xf,-0x14(%rbp)
  jmp    L3
  movl   $0x10,-0x14(%rbp)
  jmp    L3
  movl   $0x11,-0x14(%rbp)
  jmp    L3
  movl   $0x12,-0x14(%rbp)
  jmp    L3
  movl   $0x13,-0x14(%rbp)
  jmp    L3
  movl   $0x2,-0x14(%rbp)
  jmp    L3
  movl   $0x5,-0x14(%rbp)
  jmp    L3
L172:
  movl   $0xffffffff,-0x14(%rbp)
  nop
L3:
  mov    -0x14(%rbp),%eax
L294:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L10
  call   <__stack_chk_fail@plt>
L10:
  leave
  ret
```

assistant: ```c
int Assign_State(char *c, int datatype, int stepsize) {
  int state[3];
  int i;
  state[0] = -1;
  if (!datatype) {
    for (i = 0; i < stepsize; i++) {
      switch (c[i]) {
      case 'A':
        state[i] = 0;
        break;
      case 'C':
        state[i] = 1;
        break;
      case 'G':
        state[i] = 2;
        break;
      case 'T':
        state[i] = 3;
        break;
      case 'U':
        state[i] = 3;
        break;
      default:
        state[i] = -1;
        break;
      }
    }
    return (stepsize > 1) ? (state[0] * 16 + state[1] * 4 + state[2]) : (state[0]);
  } else {
    switch (c[0]) {
    case 'A':
      state[0] = 0;
      break;
    case 'R':
      state[0] = 1;
      break;
    case 'N':
      state[0] = 2;
      break;
    case 'D':
      state[0] = 3;
      break;
    case 'C':
      state[0] = 4;
      break;
    case 'Q':
      state[0] = 5;
      break;
    case 'E':
      state[0] = 6;
      break;
    case 'G':
      state[0] = 7;
      break;
    case 'H':
      state[0] = 8;
      break;
    case 'I':
      state[0] = 9;
      break;
    case 'L':
      state[0] = 10;
      break;
    case 'K':
      state[0] = 11;
      break;
    case 'M':
      state[0] = 12;
      break;
    case 'F':
      state[0] = 13;
      break;
    case 'P':
      state[0] = 14;
      break;
    case 'S':
      state[0] = 15;
      break;
    case 'T':
      state[0] = 16;
      break;
    case 'W':
      state[0] = 17;
      break;
    case 'Y':
      state[0] = 18;
      break;
    case 'V':
      state[0] = 19;
      break;
    case 'B':
      state[0] = 2;
      break;
    case 'Z':
      state[0] = 5;
      break;
    default:
      state[0] = -1;
      break;
    }
    return state[0];
  }
  return -1;
}
```