user: Please show me the C implementation that matches the assembly code listed below:

```asm
<split_string>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  jmp    L77
L203:
  addq   $0x1,-0x28(%rbp)
L77:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L203
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L203
  movl   $0x0,-0x2c(%rbp)
  jmp    L7
L196:
  addq   $0x1,-0x28(%rbp)
L199:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L74
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L74
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  jne    L196
L74:
  addl   $0x1,-0x2c(%rbp)
  jmp    L238
L220:
  addq   $0x1,-0x28(%rbp)
L238:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L220
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L220
L7:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L199
  mov    -0x2c(%rbp),%eax
  add    $0x1,%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <smalloc@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movq   $0x0,(%rax)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  jmp    L226
L34:
  addq   $0x1,-0x28(%rbp)
L226:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L34
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L34
  movl   $0x0,-0x2c(%rbp)
  jmp    L75
L50:
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L147
L217:
  addq   $0x1,-0x28(%rbp)
L147:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L22
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L22
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  jne    L217
L22:
  cmpl   $0x0,-0x3c(%rbp)
  je     L88
  mov    -0x28(%rbp),%rax
  sub    -0x18(%rbp),%rax
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x20(%rbp),%rax
  lea    (%rcx,%rax,1),%rbx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <string_ndup@plt>
  mov    %rax,(%rbx)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L20
  addq   $0x1,-0x28(%rbp)
  jmp    L20
L88:
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x18(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L20
  mov    -0x28(%rbp),%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x28(%rbp)
L20:
  addl   $0x1,-0x2c(%rbp)
  jmp    L48
L214:
  addq   $0x1,-0x28(%rbp)
L48:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L214
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L214
L75:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L50
  mov    -0x20(%rbp),%rax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
char **split_string(char *str, int copy) {
  char **bits;
  int nbits;
  char *ch, *start;
  for (ch = str; (*ch == ' ') || (*ch == '\t'); ch++)
    ;
  for (nbits = 0; *ch != '\0';) {
    for (; (*ch != '\0') && (*ch != ' ') && (*ch != '\t'); ch++)
      ;
    nbits++;
    for (; (*ch == ' ') || (*ch == '\t'); ch++)
      ;
  }
  bits = (char **)smalloc((nbits + 1) * sizeof(char *));
  bits[nbits] = NULL;
  for (ch = str; (*ch == ' ') || (*ch == '\t'); ch++)
    ;
  for (nbits = 0; *ch != '\0';) {
    start = ch;
    for (; (*ch != '\0') && (*ch != ' ') && (*ch != '\t'); ch++)
      ;
    if (copy) {
      bits[nbits] = string_ndup(start, (int)(ch - start));
      if (*ch != '\0') {
        ch++;
      }
    } else {
      bits[nbits] = start;
      if (*ch != '\0') {
        *ch = '\0';
        ch++;
      }
    }
    nbits++;
    for (; (*ch == ' ') || (*ch == '\t'); ch++)
      ;
  }
  return bits;
}
```