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

```asm
<return_pdu_type_string>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  movabs $0x6575716552746547,%rax
  mov    %rax,0x16(%rsp)
  movw   $0x7473,0x1e(%rsp)
  movb   $0x0,0x20(%rsp)
  movabs $0x6f70736552746547,%rax
  mov    %rax,0x2c(%rsp)
  movl   $0x65736e,0x34(%rsp)
  movabs $0x7478654e746547,%rax
  mov    %rax,0x4(%rsp)
  movabs $0x6575716552746553,%rax
  mov    %rax,0x21(%rsp)
  movw   $0x7473,0x29(%rsp)
  movb   $0x0,0x2b(%rsp)
  movabs $0x445020676e6f7277,%rax
  mov    %rax,0xc(%rsp)
  movw   $0x55,0x14(%rsp)
  cmp    $0xa2,%dil
  je     L95
  ja     L74
  cmp    $0xa0,%dil
  je     L49
  cmp    $0xa1,%dil
  jne    L38
  lea    0x4(%rsp),%rbp
  mov    %rbp,%rdi
  call   <strlen@plt>
  lea    0x1(%rax),%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L55
L74:
  cmp    $0xa3,%dil
  jne    L38
  lea    0x21(%rsp),%rbp
  mov    %rbp,%rdi
  call   <strlen@plt>
  lea    0x1(%rax),%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L55
L49:
  lea    0x16(%rsp),%rbp
  mov    %rbp,%rdi
  call   <strlen@plt>
  lea    0x1(%rax),%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L55:
  mov    0x38(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L44
  mov    %rbx,%rax
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  ret
L95:
  lea    0x2c(%rsp),%rbp
  mov    %rbp,%rdi
  call   <strlen@plt>
  lea    0x1(%rax),%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L55
L38:
  lea    0xc(%rsp),%rbp
  mov    %rbp,%rdi
  call   <strlen@plt>
  lea    0x1(%rax),%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,%rbx
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L55
L44:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
unsigned char *return_pdu_type_string(unsigned char pdu_type) {
  char *pdu_type_string = NULL;
  char GetRequest[] = {'G', 'e', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', '\0'};
  char GetResponse[] = {'G', 'e', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\0'};
  char GetNext[] = {'G', 'e', 't', 'N', 'e', 'x', 't', '\0'};
  char SetRequest[] = {'S', 'e', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', '\0'};
  char Error[] = {'w', 'r', 'o', 'n', 'g', 0x20, 'P', 'D', 'U', '\0'};
  switch (pdu_type) {
  case 0xA0:
    pdu_type_string = calloc(1, strlen(GetRequest) + 1);
    strcpy(pdu_type_string, GetRequest);
    break;
  case 0xA1:
    pdu_type_string = calloc(1, strlen(GetNext) + 1);
    strcpy(pdu_type_string, GetNext);
    break;
  case 0xA2:
    pdu_type_string = calloc(1, strlen(GetResponse) + 1);
    strcpy(pdu_type_string, GetResponse);
    break;
  case 0xA3:
    pdu_type_string = calloc(1, strlen(SetRequest) + 1);
    strcpy(pdu_type_string, SetRequest);
    break;
  default:
    pdu_type_string = calloc(1, strlen(Error) + 1);
    strcpy(pdu_type_string, Error);
    break;
  }
  return (unsigned char *)pdu_type_string;
}
```