user: 请将以下的汇编代码转换成C语言代码：

```asm
<popen_noshell_split_command_to_argv>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x68,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x38(%rsp)
  movabs $0x3b267c0a60245c21,%rax
  movq   $0x0,0x40(%rsp)
  mov    %rax,0x4b(%rsp)
  movl   $0x3e3c2928,0x53(%rsp)
  movb   $0x0,0x57(%rsp)
  movl   $0x0,0x3c(%rsp)
  call   <strlen@plt>
  mov    $0x1,%esi
  lea    0x1(%rax),%edi
  call   <calloc@plt>
  mov    %rax,(%rbx)
  test   %rax,%rax
  je     L3
  mov    0x8(%rsp),%rdi
  mov    %rax,%r13
  call   <strlen@plt>
  movl   $0x0,0x3c(%rsp)
  cltq
  mov    %rax,0x10(%rsp)
  test   %rax,%rax
  je     L201
  lea    0x3c(%rsp),%rax
  xor    %ebx,%ebx
  xor    %r12d,%r12d
  xor    %r14d,%r14d
  movl   $0x0,(%rsp)
  lea    0x4b(%rsp),%r15
  mov    %rax,0x20(%rsp)
  jmp    L243
  nopw   0x0(%rax,%rax,1)
L36:
  mov    (%rsp),%eax
  mov    %ebx,%ecx
  xor    $0x1,%ecx
  xor    $0x1,%eax
  cmp    $0x27,%bpl
  jne    L239
  test   $0x1,%al
  je     L239
  movl   $0x0,(%rsp)
  mov    %ecx,%ebx
L147:
  add    $0x1,%r14
  cmp    %r14,0x10(%rsp)
  jbe    L259
L243:
  mov    %ebx,%r11d
  test   %r12,%r12
  je     L218
L46:
  mov    0x8(%rsp),%rax
  mov    %r15,%rdi
  movsbl (%rax,%r14,1),%esi
  mov    %esi,%ebp
  call   <index@plt>
  mov    %rax,%r9
  test   %rax,%rax
  jne    L194
  cmp    $0x20,%bpl
  je     L93
  cmp    $0x9,%bpl
  jne    L36
L93:
  mov    (%rsp),%r11d
  or     %ebx,%r11d
  jne    L57
  mov    0x20(%rsp),%r8
  lea    0x38(%rsp),%rbx
  mov    %r13,%rcx
  mov    %r12,%rdx
  lea    0x40(%rsp),%rbp
  mov    %rbx,%rsi
  mov    %r9,(%rsp)
  mov    %rbp,%rdi
  mov    %r11d,0x1c(%rsp)
  mov    %r8,0x28(%rsp)
  call   <_popen_noshell_add_token@plt>
  mov    (%rsp),%r9
  test   %rax,%rax
  jne    L207
  add    $0x1,%r14
  cmp    %r14,0x10(%rsp)
  mov    0x1c(%rsp),%r11d
  jbe    L181
  movl   $0x0,(%rsp)
L218:
  movslq 0x3c(%rsp),%r12
  mov    %r11d,%ebx
  add    %r13,%r12
  jmp    L46
  nopl   0x0(%rax)
L57:
  movslq 0x3c(%rsp),%rax
  add    $0x1,%r14
  lea    0x1(%rax),%ecx
  mov    %ecx,0x3c(%rsp)
  mov    %bpl,0x0(%r13,%rax,1)
  cmp    %r14,0x10(%rsp)
  ja     L243
L259:
  mov    (%rsp),%eax
  or     %ebx,%eax
  jne    L159
  lea    0x3c(%rsp),%rax
  lea    0x38(%rsp),%rbx
  mov    %rax,0x28(%rsp)
  lea    0x40(%rsp),%rbp
L226:
  mov    0x28(%rsp),%r8
  mov    %r13,%rcx
  mov    %r12,%rdx
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <_popen_noshell_add_token@plt>
  test   %rax,%rax
  jne    L3
  mov    0x38(%rsp),%eax
  test   %eax,%eax
  je     L194
  xor    %edx,%edx
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <popen_noshell_add_ptr_to_argv@plt>
  mov    0x40(%rsp),%r9
  test   %rax,%rax
  je     L69
  mov    %r9,%rdi
  call   <free@plt>
  xor    %r9d,%r9d
  jmp    L69
  xchg   %ax,%ax
L239:
  cmp    $0x22,%bpl
  jne    L57
  and    $0x1,%ecx
  je     L57
  mov    %eax,(%rsp)
  xor    %ebx,%ebx
  jmp    L147
  nopl   (%rax)
L194:
  mov    D5(%rip),%rax
  mov    (%rax),%edx
  mov    D26(%rip),%rax
  mov    %edx,(%rax)
L3:
  mov    0x40(%rsp),%rdi
  call   <free@plt>
  xor    %r9d,%r9d
L69:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L184
  add    $0x68,%rsp
  mov    %r9,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L207:
  mov    0x40(%rsp),%rdi
  mov    %r9,(%rsp)
  call   <free@plt>
  mov    (%rsp),%r9
  jmp    L69
L201:
  lea    0x3c(%rsp),%rax
  lea    0x38(%rsp),%rbx
  mov    %rax,0x28(%rsp)
  lea    0x40(%rsp),%rbp
L181:
  xor    %r12d,%r12d
  jmp    L226
L159:
  mov    D5(%rip),%rax
  mov    0x40(%rsp),%rdi
  mov    %r9,(%rsp)
  mov    (%rax),%edx
  mov    D26(%rip),%rax
  mov    %edx,(%rax)
  call   <free@plt>
  mov    (%rsp),%r9
  jmp    L69
L184:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
char **popen_noshell_split_command_to_argv(const char *command_original, char **free_this_buf) {
  char *command;
  size_t i, len;
  char *start = NULL;
  char c;
  char **argv = NULL;
  int count = 0;
  const char _popen_bash_meta_characters[] = "!\\$`\n|&;()<>";
  int in_sq = 0;
  int in_dq = 0;
  int j = 0;
  command = (char *)calloc(strlen(command_original) + 1, sizeof(char));
  *free_this_buf = command;
  if (!command) {
    free(argv);
    return NULL;
  };
  len = strlen(command_original);
  j = 0;
  for (i = 0; i < len; ++i) {
    if (!start)
      start = command + j;
    c = command_original[i];
    if (index(_popen_bash_meta_characters, c) != NULL) {
      errno = EINVAL;
      {
        free(argv);
        return NULL;
      };
    }
    if (c == ' ' || c == '\t') {
      if (in_sq || in_dq) {
        command[j++] = c;
        continue;
      }
      if (_popen_noshell_add_token(&argv, &count, start, command, &j) != 0) {
        {
          free(argv);
          return NULL;
        };
      }
      start = NULL;
      continue;
    }
    if (c == '\'' && !in_dq) {
      in_sq = !in_sq;
      continue;
    }
    if (c == '"' && !in_sq) {
      in_dq = !in_dq;
      continue;
    }
    command[j++] = c;
  }
  if (in_sq || in_dq) {
    errno = EINVAL;
    {
      free(argv);
      return NULL;
    };
  }
  if (_popen_noshell_add_token(&argv, &count, start, command, &j) != 0) {
    {
      free(argv);
      return NULL;
    };
  }
  if (count == 0) {
    errno = EINVAL;
    {
      free(argv);
      return NULL;
    };
  }
  if (popen_noshell_add_ptr_to_argv(&argv, &count, NULL) != 0) {
    {
      free(argv);
      return NULL;
    };
  }
  return argv;
}
```