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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movabs $0x6f770a6f6c6c6568,%rax
  mov    %rax,-0x20(%rbp)
  movl   $0x646c72,-0x18(%rbp)
  movq   $0x0,-0x70(%rbp)
  movq   $0x0,-0x68(%rbp)
  lea    -0x70(%rbp),%rcx
  lea    -0x20(%rbp),%rax
  lea    D13(%rip),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strsplit@plt>
  mov    %rax,-0x80(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x88(%rbp)
  jmp    L13
L9:
  mov    -0x88(%rbp),%eax
  cltq
  mov    -0x70(%rbp,%rax,8),%rax
  mov    %rax,%rsi
  lea    D36(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  addl   $0x1,-0x88(%rbp)
L13:
  mov    -0x88(%rbp),%eax
  cltq
  cmp    %rax,-0x80(%rbp)
  ja     L9
  movl   $0x0,-0x88(%rbp)
  jmp    L64
L17:
  mov    -0x88(%rbp),%eax
  cltq
  mov    -0x70(%rbp,%rax,8),%rax
  mov    %rax,%rdi
  call   <free@plt>
  addl   $0x1,-0x88(%rbp)
L64:
  mov    -0x80(%rbp),%rax
  cmp    %eax,-0x88(%rbp)
  jl     L17
  movabs $0x2033203220312030,%rax
  movabs $0x2037203620352034,%rdx
  mov    %rax,-0x20(%rbp)
  mov    %rdx,-0x18(%rbp)
  movl   $0x392038,-0x10(%rbp)
  movq   $0x0,-0x70(%rbp)
  movq   $0x0,-0x68(%rbp)
  movq   $0x0,-0x60(%rbp)
  movq   $0x0,-0x58(%rbp)
  movq   $0x0,-0x50(%rbp)
  movq   $0x0,-0x48(%rbp)
  movq   $0x0,-0x40(%rbp)
  movq   $0x0,-0x38(%rbp)
  movq   $0x0,-0x30(%rbp)
  movq   $0x0,-0x28(%rbp)
  lea    -0x70(%rbp),%rcx
  lea    -0x20(%rbp),%rax
  lea    D8(%rip),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strsplit@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x84(%rbp)
  jmp    L21
L69:
  mov    -0x84(%rbp),%eax
  cltq
  mov    -0x70(%rbp,%rax,8),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  cmp    %eax,-0x84(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x84(%rbp),%eax
  cltq
  mov    -0x70(%rbp,%rax,8),%rax
  mov    %rax,%rsi
  lea    D36(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  addl   $0x1,-0x84(%rbp)
L21:
  mov    -0x78(%rbp),%rax
  cmp    %eax,-0x84(%rbp)
  jl     L69
  movl   $0x0,-0x84(%rbp)
  jmp    L19
L3:
  mov    -0x84(%rbp),%eax
  cltq
  mov    -0x70(%rbp,%rax,8),%rax
  mov    %rax,%rdi
  call   <free@plt>
  addl   $0x1,-0x84(%rbp)
L19:
  mov    -0x78(%rbp),%rax
  cmp    %eax,-0x84(%rbp)
  jl     L3
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L32
  call   <__stack_chk_fail@plt>
L32:
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D13
datatype: string
name: parse_data
arguments: label: D36
datatype: string
name: parse_data
arguments: label: D8
datatype: string

tool: D13: 


tool: D36: %s


tool: D8:  

assistant: ```c
int main(void) {
  {
    char str[] = "hello\nworld";
    char *parts[2] = {NULL};
    size_t size = strsplit(str, parts, "\n");
    assert(size);
    int i = 0;
    for (; i < size; i++) {
      printf("%s\n", parts[i]);
    }
    for (i = 0; i < (int)size; i++) {
      free(parts[i]);
    }
  }
  {
    char str[] = "0 1 2 3 4 5 6 7 8 9";
    char *parts[10] = {NULL};
    size_t size = strsplit(str, parts, " ");
    assert(size);
    int i = 0;
    for (; i < (int)size; i++) {
      assert(i == atoi(parts[i]));
      printf("%s\n", parts[i]);
    }
    for (i = 0; i < (int)size; i++) {
      free(parts[i]);
    }
  }
  return 0;
}
```