user: What is the c source code of the assembly code below:

```asm
<code_ACC_word_PL>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %r8,-0x48(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x5,-0x20(%rbp)
  movl   $0x0,-0x18(%rbp)
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x1c(%rbp)
  lea    -0xd(%rbp),%rax
  mov    $0x5,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  cmpq   $0x0,-0x30(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  cmpl   $0x0,-0x24(%rbp)
  setg   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  cmpq   $0x0,-0x40(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x24(%rbp),%eax
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %ecx,%eax
  sar    %eax
  cmp    %eax,%edx
  setge  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  jmp    L12
L43:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x24(%rbp),%eax
  sub    -0x18(%rbp),%eax
  lea    -0xd(%rbp),%rcx
  lea    -0x20(%rbp),%rdx
  mov    %eax,%edi
  call   <derive_first_word@plt>
  mov    -0x20(%rbp),%eax
  test   %eax,%eax
  jne    L22
  mov    -0x24(%rbp),%eax
  sub    -0x18(%rbp),%eax
  mov    %eax,%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L34
L22:
  mov    -0x20(%rbp),%eax
  lea    -0x1c(%rbp),%rdx
  lea    -0xd(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <code_ACC_word_DAT_number@plt>
  mov    -0x20(%rbp),%eax
  add    %eax,-0x18(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rax,%rdx
  mov    -0x1c(%rbp),%eax
  mov    %eax,(%rdx)
  movl   $0x5,-0x20(%rbp)
  addl   $0x1,-0x14(%rbp)
L12:
  mov    -0x18(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L43
L34:
  mov    -0x38(%rbp),%rax
  mov    -0x14(%rbp),%edx
  mov    %edx,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L14
  call   <__stack_chk_fail@plt>
L14:
  leave
  ret
```

assistant: ```c
void code_ACC_word_PL(const uint8_t ACC_GEN_size, const char *restrict ACC_independentClause, uint8_t *restrict DAT_GEN_size, uint16_t *restrict DAT_code_independentClause, uint8_t *restrict DAT_GEN_remainder) {
  char DAT_word[0x05];
  uint8_t DAT_word_GEN_size = 0x05;
  uint8_t i = 0;
  uint8_t j = 0;
  uint16_t number = 0;
  memset(DAT_word, 0, 0x05);
  assert(ACC_independentClause != NULL);
  assert(ACC_GEN_size > 0);
  assert(DAT_code_independentClause != NULL);
  assert(*DAT_GEN_size >= ACC_GEN_size / 2);
  for (; i < ACC_GEN_size; j++) {
    derive_first_word((uint8_t)(ACC_GEN_size - i), ACC_independentClause + i, &DAT_word_GEN_size, DAT_word);
    if (DAT_word_GEN_size == 0) {
      *DAT_GEN_remainder = (uint8_t)(ACC_GEN_size - i);
      break;
    }
    code_ACC_word_DAT_number(DAT_word_GEN_size, DAT_word, &number);
    i = (uint8_t)(i + DAT_word_GEN_size);
    DAT_code_independentClause[j] = number;
    DAT_word_GEN_size = 0x05;
  }
  *DAT_GEN_size = j;
}
```