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

```asm
<gen_argv_from_string>:
  endbr64
  push   %r15
  xor    %eax,%eax
  mov    %rsi,%r15
  push   %r14
  mov    $0x1,%r14d
  push   %r13
  mov    %rdx,%r13
  push   %r12
  xor    %r12d,%r12d
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x18,%rsp
  movl   $0x0,(%rsi)
  movq   $0x0,(%rdx)
  movzbl (%rdi),%edx
L245:
  test   %r12d,%r12d
  je     L1
L270:
  mov    %eax,%ecx
  test   %r14d,%r14d
  je     L219
  cmp    $0x23,%dl
  je     L80
  test   %dl,%dl
  jne    L112
  mov    %eax,%ecx
  mov    %r14d,%r12d
L307:
  mov    %eax,%ebx
  xor    %edx,%edx
  mov    %ecx,%eax
L54:
  xor    %ecx,%ecx
  test   %dl,%dl
  sete   %cl
L189:
  cmp    %ebx,%eax
  je     L53
  mov    %ebx,%esi
  mov    %ecx,0xc(%rsp)
  sub    %eax,%esi
  cltq
  lea    0x0(%rbp,%rax,1),%rdi
  call   <strndup@plt>
  mov    $0x1,%edx
  mov    $0x5c,%esi
  mov    %rax,%rdi
  mov    %rax,(%rsp)
  call   <strip_char@plt>
  mov    (%r15),%eax
  mov    0x0(%r13),%rdi
  lea    0x8(,%rax,8),%esi
  call   <realloc@plt>
  movslq (%r15),%rdx
  mov    (%rsp),%r8
  mov    %rax,0x0(%r13)
  mov    0xc(%rsp),%ecx
  lea    0x1(%rdx),%esi
  mov    %esi,(%r15)
  mov    %r8,(%rax,%rdx,8)
L53:
  lea    0x1(%rbx),%eax
  test   %ecx,%ecx
  jne    L268
  movslq %eax,%rdx
  movzbl 0x0(%rbp,%rdx,1),%edx
  test   %r12d,%r12d
  jne    L270
L1:
  cmp    $0x5c,%dl
  je     L111
  test   %r14d,%r14d
  je     L27
  cmp    $0x23,%dl
  je     L45
L27:
  mov    %eax,%ebx
L199:
  lea    -0x9(%rdx),%ecx
  cmp    $0x1,%cl
  jbe    L288
  cmp    $0x20,%dl
  je     L288
  mov    %eax,%ecx
  xor    %r12d,%r12d
  mov    %ebx,%eax
L219:
  test   %dl,%dl
  je     L307
  lea    0x1(%rax),%ebx
  movslq %ebx,%rsi
  movzbl 0x0(%rbp,%rsi,1),%edi
  mov    %eax,%esi
  mov    %ecx,%eax
  test   %r14d,%r14d
  jne    L26
L51:
  lea    0x1(%rsi),%ebx
  xor    %r14d,%r14d
  movslq %ebx,%rdx
  movzbl 0x0(%rbp,%rdx,1),%edx
  cmp    $0x5c,%dl
  jne    L199
L253:
  lea    0x1(%rbx),%esi
  movslq %esi,%rdx
  cmpb   $0x0,0x0(%rbp,%rdx,1)
  jne    L51
  mov    %eax,%ecx
  xor    %r14d,%r14d
  mov    %esi,%eax
  mov    $0x1,%r12d
  jmp    L307
  nopw   0x0(%rax,%rax,1)
L288:
  xor    %r12d,%r12d
  cmp    $0xa,%dl
  jne    L54
  xor    %ecx,%ecx
  mov    $0x1,%r14d
  jmp    L189
  nopl   0x0(%rax)
L268:
  add    $0x18,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L112:
  lea    0x1(%rax),%ebx
  mov    %edx,%ecx
  movslq %ebx,%rsi
  movzbl 0x0(%rbp,%rsi,1),%edx
L290:
  cmp    $0x20,%cl
  je     L59
  cmp    $0x9,%cl
  je     L59
  cmp    $0xa,%cl
  je     L59
  xor    %r14d,%r14d
  cmp    $0x5c,%dl
  jne    L199
  jmp    L253
  nopl   (%rax)
L59:
  cmp    $0x5c,%dl
  je     L253
  mov    $0x1,%r14d
  cmp    $0x23,%dl
  jne    L199
  mov    %ebx,%eax
  xor    %r12d,%r12d
  nopl   (%rax)
L45:
  lea    0x1(%rax),%ecx
  movslq %ecx,%rcx
  jmp    L251
  nopl   0x0(%rax,%rax,1)
L301:
  cmp    $0xa,%dl
  je     L262
L251:
  movzbl 0x0(%rbp,%rcx,1),%edx
  mov    %ecx,%eax
  add    $0x1,%rcx
  test   %dl,%dl
  jne    L301
L262:
  xor    %r14d,%r14d
  jmp    L245
  nopl   0x0(%rax)
L111:
  mov    %eax,%ebx
  jmp    L253
  nopw   0x0(%rax,%rax,1)
L26:
  mov    %edx,%ecx
  mov    %edi,%edx
  jmp    L290
  nopl   0x0(%rax)
L80:
  mov    %r14d,%r12d
  jmp    L45
```

assistant: ```c
int gen_argv_from_string(const char *str, int *argc, char ***argv) {
  int i = 0, k = 0, n = 1, esc = 0, end = 0;
  char *tmp;
  *argc = 0;
  *argv = NULL;
  while (!end) {
    if (!esc && str[k] == '\\') {
      esc = 1;
      n = 0;
    } else if (n && str[k] == '#') {
      while (str[k] != '\0' && str[k] != '\n')
        ++k;
      i = k;
      n = 0;
      continue;
    } else if ((!esc && (str[k] == ' ' || str[k] == '\t' || str[k] == '\n')) || str[k] == '\0') {
      if (str[k] == '\n')
        n = 1;
      else if (str[k] == '\0')
        end = 1;
      if (i != k) {
        tmp = strndup(&str[i], k - i);
        strip_char(tmp, '\\', 1);
        *argv = realloc(*argv, (*argc + 1) * sizeof(char *));
        (*argv)[(*argc)++] = tmp;
        i = k;
      }
      ++i;
    } else {
      if (n && !(str[k] == ' ' || str[k] == '\t' || str[k] == '\n'))
        n = 0;
      esc = 0;
    }
    ++k;
  }
  return 0;
}
```