user: Demonstrate the C code that generates the assembly output below:

```asm
<hurl_header_split_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  movl   $0x0,-0xc(%rbp)
  movl   $0x0,-0x8(%rbp)
  movl   $0xffffffff,-0x4(%rbp)
  movl   $0x0,-0xc(%rbp)
  jmp    L88
L124:
  cmpl   $0x0,-0x8(%rbp)
  jne    L81
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L81
  mov    -0xc(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x18(%rbp),%rax
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <hurl_allocstrcpy@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L164
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L176
  mov    -0xc(%rbp),%eax
  add    $0x2,%eax
  mov    %eax,-0x8(%rbp)
  addl   $0x1,-0xc(%rbp)
  jmp    L116
L176:
  mov    -0xc(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x8(%rbp)
  jmp    L116
L164:
  mov    $0x0,%eax
  jmp    L60
L81:
  cmpl   $0x0,-0x8(%rbp)
  je     L9
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  jne    L9
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  jne    L9
  mov    -0xc(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  jmp    L116
L9:
  cmpl   $0x0,-0x8(%rbp)
  je     L116
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  jne    L116
  mov    -0xc(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
L116:
  addl   $0x1,-0xc(%rbp)
L88:
  mov    -0x20(%rbp),%rax
  sub    $0x1,%eax
  cmp    %eax,-0xc(%rbp)
  jl     L124
  cmpl   $0x0,-0x8(%rbp)
  je     L129
  cmpl   $0xffffffff,-0x4(%rbp)
  jne    L174
  mov    -0x20(%rbp),%rax
  sub    -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
L174:
  mov    -0x4(%rbp),%eax
  cltq
  mov    -0x8(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x18(%rbp),%rdx
  add    %rdx,%rcx
  mov    $0x1,%edx
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <hurl_allocstrcpy@plt>
  mov    -0x30(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L72
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x28(%rbp),%rax
  movq   $0x0,(%rax)
  mov    -0x30(%rbp),%rax
  movq   $0x0,(%rax)
  mov    $0x0,%eax
  jmp    L60
L72:
  mov    $0x1,%eax
  jmp    L60
L129:
  mov    $0x0,%eax
L60:
  leave
  ret
```

assistant: ```c
int hurl_header_split_line(const char *line, size_t line_len, char **key, char **value) {
  int i = 0;
  int bgof_value = 0;
  int value_len = -1;
  for (i = 0; i < (int)line_len - 1; i++) {
    if (!bgof_value && line[i] == ':') {
      if ((*key = hurl_allocstrcpy(line, (size_t)i, 1)) != NULL) {
        if (line[i + 1] == ' ') {
          bgof_value = i + 2;
          i++;
        } else {
          bgof_value = i + 1;
        }
      } else {
        return 0;
      }
    } else if (bgof_value && line[i] == '\r' && line[i + 1] == '\n') {
      value_len = (int)(i - bgof_value);
    } else if (bgof_value && line[i] == '\n') {
      value_len = i - bgof_value;
    }
  }
  if (bgof_value) {
    if (value_len == -1) {
      value_len = (int)line_len - bgof_value;
    }
    if ((*value = hurl_allocstrcpy(line + bgof_value, (size_t)value_len, 1)) == NULL) {
      free(*key);
      *key = NULL;
      *value = NULL;
      return 0;
    } else {
      return 1;
    }
  }
  return 0;
}
```