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

```asm
<text2morse>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  mov    %rsi,%rdi
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x18,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  movq   $0x0,(%rsp)
  call   <strlen@plt>
  lea    0x1(%rax),%edi
  mov    %rax,%r13
  call   <malloc@plt>
  mov    %rax,%rbp
  lea    0x0(%r13,%r13,2),%eax
  lea    0x1(%rax,%rax,1),%edi
  call   <malloc@plt>
  mov    $0x6,%edi
  mov    %rax,(%r12)
  call   <malloc@plt>
  mov    (%r12),%rdi
  lea    D9(%rip),%rsi
  mov    %rax,(%rsp)
  call   <strcpy@plt>
  test   %r13d,%r13d
  jle    L10
  lea    -0x1(%r13),%edx
  mov    %rbx,%rax
  xor    %ecx,%ecx
  movabs $0xf8000001fc00fffe,%r9
  lea    0x1(%rbx,%rdx,1),%r8
  jmp    L87
  nopl   0x0(%rax)
L118:
  mov    %esi,%edx
L19:
  movslq %ecx,%rsi
  add    $0x1,%ecx
  mov    %dl,0x0(%rbp,%rsi,1)
L63:
  add    $0x1,%rax
  cmp    %rax,%r8
  je     L47
L87:
  movzbl (%rax),%edx
  lea    -0x61(%rdx),%edi
  lea    -0x20(%rdx),%esi
  cmp    $0x19,%dil
  jbe    L118
  cmp    $0x3a,%sil
  ja     L63
  bt     %rsi,%r9
  jae    L19
  jmp    L63
  nopw   0x0(%rax,%rax,1)
L47:
  movslq %ecx,%rcx
  add    %rbp,%rcx
L94:
  movb   $0x0,(%rcx)
  mov    %rbp,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  jle    L83
  sub    $0x1,%eax
  mov    %rbp,%rbx
  lea    D13(%rip),%r13
  lea    0x1(%rbp,%rax,1),%r14
  nop
L44:
  movsbl (%rbx),%esi
  cmp    $0x20,%sil
  je     L140
  mov    %rsp,%rdi
  add    $0x1,%rbx
  call   <ascii2word@plt>
  mov    (%r12),%r15
  mov    %r15,%rdi
  call   <strlen@plt>
  mov    (%rsp),%rdx
  mov    %r13,%rsi
  cltq
  lea    (%r15,%rax,1),%rdi
  call   <sprintf@plt>
  cmp    %rbx,%r14
  jne    L44
L83:
  mov    %rbp,%rdi
  call   <free@plt>
  mov    (%rsp),%rdi
  test   %rdi,%rdi
  je     L134
  call   <free@plt>
L134:
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L106
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L140:
  mov    (%rsp),%rdi
  lea    D3(%rip),%rsi
  add    $0x1,%rbx
  call   <strcpy@plt>
  mov    (%r12),%r15
  mov    %r15,%rdi
  call   <strlen@plt>
  mov    (%rsp),%rdx
  mov    %r13,%rsi
  cltq
  lea    (%r15,%rax,1),%rdi
  call   <sprintf@plt>
  cmp    %r14,%rbx
  jne    L44
  jmp    L83
  nopl   (%rax)
L10:
  mov    %rbp,%rcx
  jmp    L94
L106:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: tag: D9
type_guessed: string
name: unpack_data
arguments: tag: D13
type_guessed: string
name: unpack_data
arguments: tag: D3
type_guessed: string

tool: 

tool: D13: %s 

tool: D3: /

assistant: ```c
void text2morse(char **morse, char *text) {
  int rc = 0, counter = 0, total = 0, i = 0, l = 0;
  size_t length = 0;
  char chr;
  char *clean_text = NULL, *word = NULL;
  length = strlen(text);
  clean_text = malloc(sizeof(char) * length + 1);
  *morse = malloc(sizeof(char) * (6 * length) + 1);
  word = malloc(sizeof(char) * 5 + 1);
  strcpy(*morse, "");
  for (i = 0, l = (int)length; i < l; i++) {
    chr = text[i];
    if ((chr >= 'a' && chr <= 'z')) {
      chr -= 0x20;
    }
    if ((chr >= 'A' && chr <= 'Z') || (chr >= '0' && chr <= '9') || chr == ' ') {
      clean_text[counter++] = chr;
    }
  }
  clean_text[counter] = '\0';
  length = strlen(clean_text);
  for (i = 0, l = (int)length; i < l; i++) {
    if (clean_text[i] == ' ') {
      strcpy(word, "/");
    } else {
      ascii2word(&word, clean_text[i]);
    }
    total = (int)strlen(*morse);
    sprintf(*morse + total, "%s ", word);
  }
  if (clean_text) {
    free(clean_text);
  }
  if (word) {
    free(word);
  }
  if (rc) {
    exit(EXIT_FAILURE);
  }
}
```