user: What would the C source look like for the assembly code provided here:

```asm
<return_pdu_type_string>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,%eax
  mov    %al,-0x54(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x48(%rbp)
  movabs $0x6575716552746547,%rax
  mov    %rax,-0x2a(%rbp)
  movw   $0x7473,-0x22(%rbp)
  movb   $0x0,-0x20(%rbp)
  movabs $0x6f70736552746547,%rax
  mov    %rax,-0x14(%rbp)
  movl   $0x65736e,-0xc(%rbp)
  movabs $0x7478654e746547,%rax
  mov    %rax,-0x3c(%rbp)
  movabs $0x6575716552746553,%rax
  mov    %rax,-0x1f(%rbp)
  movw   $0x7473,-0x17(%rbp)
  movb   $0x0,-0x15(%rbp)
  movabs $0x445020676e6f7277,%rax
  mov    %rax,-0x34(%rbp)
  movw   $0x55,-0x2c(%rbp)
  movzbl -0x54(%rbp),%eax
  cmp    $0xa3,%eax
  je     L59
  cmp    $0xa3,%eax
  jg     L36
  cmp    $0xa2,%eax
  je     L9
  cmp    $0xa2,%eax
  jg     L36
  cmp    $0xa0,%eax
  je     L68
  cmp    $0xa1,%eax
  je     L12
  jmp    L36
L68:
  lea    -0x2a(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,-0x48(%rbp)
  lea    -0x2a(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L51
L12:
  lea    -0x3c(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,-0x48(%rbp)
  lea    -0x3c(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L51
L9:
  lea    -0x14(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,-0x48(%rbp)
  lea    -0x14(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L51
L59:
  lea    -0x1f(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,-0x48(%rbp)
  lea    -0x1f(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L51
L36:
  lea    -0x34(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  mov    %eax,%esi
  mov    $0x1,%edi
  call   <calloc@plt>
  mov    %rax,-0x48(%rbp)
  lea    -0x34(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  nop
L51:
  mov    -0x48(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L64
  call   <__stack_chk_fail@plt>
L64:
  leave
  ret
```

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;
}
```