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

```asm
<poptParseArgvString>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,%rdx
  mov    -0x48(%rbp),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <strcpy@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  movb   $0x0,-0x3d(%rbp)
  movl   $0x5,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x20(%rbp)
  movl   $0x0,-0x38(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  jmp    L52
L223:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x3d(%rbp)
  jne    L191
  movb   $0x0,-0x3d(%rbp)
  jmp    L162
L191:
  cmpb   $0x0,-0x3d(%rbp)
  je     L136
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L185
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L62
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    $0xfffffff1,%eax
  jmp    L58
L62:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x3d(%rbp)
  je     L185
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  movb   $0x5c,(%rax)
L185:
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  mov    -0x28(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  jmp    L162
L136:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  je     L147
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L162
  addq   $0x1,-0x30(%rbp)
  addl   $0x1,-0x38(%rbp)
  mov    -0x38(%rbp),%eax
  cmp    -0x3c(%rbp),%eax
  jne    L8
  addl   $0x5,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <realloc@plt>
  mov    %rax,-0x20(%rbp)
L8:
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rax,(%rdx)
  jmp    L162
L147:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x5c,%eax
  je     L123
  cmp    $0x5c,%eax
  jg     L85
  cmp    $0x22,%eax
  je     L37
  cmp    $0x27,%eax
  jne    L85
L37:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x3d(%rbp)
  jmp    L162
L123:
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L85
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    $0xfffffff1,%eax
  jmp    L58
L85:
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  mov    -0x28(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L162:
  addq   $0x1,-0x28(%rbp)
L52:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L223
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L10
  addl   $0x1,-0x38(%rbp)
  addq   $0x1,-0x30(%rbp)
L10:
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  sub    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x38(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x10(%rbp)
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rcx
  mov    -0x8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x30(%rbp),%rax
  sub    -0x18(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rcx
  mov    -0x10(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  movl   $0x0,-0x34(%rbp)
  jmp    L200
L229:
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  sub    -0x18(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  addl   $0x1,-0x34(%rbp)
L200:
  mov    -0x34(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  jl     L229
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x58(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x50(%rbp),%rax
  mov    -0x38(%rbp),%edx
  mov    %edx,(%rax)
  mov    $0x0,%eax
L58:
  leave
  ret
```

assistant: ```c
int poptParseArgvString(char *s, int *argcPtr, char ***argvPtr) {
  char *buf = strcpy(malloc(strlen(s) + 1), s);
  char *bufStart = buf;
  char *src, *dst;
  char quote = '\0';
  int argvAlloced = 5;
  char **argv = malloc(sizeof(*argv) * argvAlloced);
  char **argv2;
  int argc = 0;
  int i;
  src = s;
  dst = buf;
  argv[argc] = buf;
  memset(buf, '\0', strlen(s) + 1);
  while (*src) {
    if (quote == *src) {
      quote = '\0';
    } else if (quote) {
      if (*src == '\\') {
        src++;
        if (!*src) {
          free(argv);
          return -15;
        }
        if (*src != quote)
          *buf++ = '\\';
      }
      *buf++ = *src;
    } else if (isspace(*src)) {
      if (*argv[argc]) {
        buf++, argc++;
        if (argc == argvAlloced) {
          argvAlloced += 5;
          argv = realloc(argv, sizeof(*argv) * argvAlloced);
        }
        argv[argc] = buf;
      }
    } else
      switch (*src) {
      case '"':
      case '\'':
        quote = *src;
        break;
      case '\\':
        src++;
        if (!*src) {
          free(argv);
          return -15;
        }
      default:
        *buf++ = *src;
      }
    src++;
  }
  if (strlen(argv[argc])) {
    argc++, buf++;
  }
  dst = malloc(argc * sizeof(*argv) + (buf - bufStart));
  argv2 = (void *)dst;
  dst += argc * sizeof(*argv);
  memcpy(argv2, argv, argc * sizeof(*argv));
  memcpy(dst, bufStart, buf - bufStart);
  for (i = 0; i < argc; i++) {
    argv2[i] = dst + (argv[i] - bufStart);
  }
  free(argv);
  *argvPtr = argv2;
  *argcPtr = argc;
  return 0;
}
```