user: Translate the below assembly code into C programming language:

```asm
<string_split_quotes>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    -0x20(%rbp),%rax
  movl   $0x0,(%rax)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L245
  mov    $0x0,%eax
  jmp    L70
L226:
  addq   $0x1,-0x18(%rbp)
L53:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L226
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L210
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  cltq
  shl    $0x3,%rax
  lea    (%rsi,%rax,1),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rax,(%rdx)
  jmp    L104
L219:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L77
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memmove@plt>
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L104
  addq   $0x1,-0x18(%rbp)
  jmp    L104
L77:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L231
  mov    -0x18(%rbp),%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x18(%rbp)
  jmp    L245
L231:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x27,%al
  je     L50
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  jne    L217
L50:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x1(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memmove@plt>
  jmp    L1
L191:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L239
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memmove@plt>
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L1
  addq   $0x1,-0x18(%rbp)
  jmp    L1
L239:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1(%rbp)
  jne    L80
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memmove@plt>
  jmp    L84
L80:
  addq   $0x1,-0x18(%rbp)
L1:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L191
L84:
  jmp    L104
L217:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L14
  jmp    L245
L14:
  addq   $0x1,-0x18(%rbp)
L104:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L219
L245:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L53
  jmp    L172
L210:
  nop
L172:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cltq
  shl    $0x3,%rax
  add    %rdx,%rax
  movq   $0x0,(%rax)
  mov    $0x1,%eax
L70:
  leave
  ret
```

assistant: ```c
int string_split_quotes(char *str, int *argc, char ***argv) {
  *argc = 0;
  *argv = malloc((strlen(str) + 1) * sizeof(char *));
  if (!*argv)
    return 0;
  while (*str) {
    while (isspace((int)*str)) {
      str++;
    }
    if (!*str)
      break;
    (*argv)[(*argc)++] = str;
    while (*str) {
      if (*str == '\\') {
        memmove(str, str + 1, strlen(str));
        if (*str)
          str++;
      } else if (isspace((int)*str)) {
        *str = 0;
        str++;
        break;
      } else if (*str == '\'' || *str == '\"') {
        char quote = *str;
        memmove(str, str + 1, strlen(str));
        while (*str) {
          if (*str == '\\') {
            memmove(str, str + 1, strlen(str));
            if (*str)
              str++;
          } else if (*str == quote) {
            memmove(str, str + 1, strlen(str));
            break;
          } else {
            str++;
          }
        }
      } else if (!*str) {
        break;
      } else {
        str++;
      }
    }
  }
  (*argv)[*argc] = 0;
  return 1;
}
```