user: What would the C source look like for the assembly code provided here:

```asm
<multipart_parse_headers>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xc8,%rsp
  mov    %rdi,(%rsp)
  mov    %rsi,0x8(%rsp)
  mov    %rdx,%rdi
  mov    %rcx,0x10(%rsp)
  mov    %r8d,0x1c(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xb8(%rsp)
  xor    %eax,%eax
  call   <kore_buf_stringify@plt>
  mov    %rax,%rdi
  lea    0x30(%rsp),%rdx
  mov    $0x5,%ecx
  lea    D35(%rip),%rsi
  call   <kore_split_string@plt>
  test   %eax,%eax
  jle    L148
  lea    0x30(%rsp),%rbx
  lea    -0x1(%rax),%eax
  lea    0x38(%rsp,%rax,8),%r13
  lea    D48(%rip),%r12
  lea    D45(%rip),%r14
  lea    D19(%rip),%r15
  jmp    L112
L12:
  add    $0x1,%rbp
L54:
  movsbl 0x0(%rbp),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L12
  lea    0x90(%rsp),%rdx
  mov    $0x5,%ecx
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <kore_split_string@plt>
  cmp    $0x1,%eax
  jle    L55
  lea    D32(%rip),%rsi
  mov    0x90(%rsp),%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L55
  mov    $0x3d,%esi
  mov    0x98(%rsp),%rdi
  call   <strchr@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L55
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    $0x2,%rax
  jle    L55
  lea    0x20(%rsp),%rdx
  lea    0x1(%rbp),%rdi
  mov    $0x22,%esi
  call   <kore_strip_chars@plt>
  mov    0xa0(%rsp),%rbp
  test   %rbp,%rbp
  jne    L46
  mov    0x1c(%rsp),%r8d
  mov    0x10(%rsp),%rcx
  mov    0x20(%rsp),%rdx
  mov    0x8(%rsp),%rsi
  mov    (%rsp),%rdi
  call   <multipart_add_field@plt>
  mov    0x20(%rsp),%rdi
  call   <kore_mem_free@plt>
  jmp    L55
L162:
  add    $0x1,%rbp
L46:
  movsbl 0x0(%rbp),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L162
  mov    $0x9,%edx
  lea    D4(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncasecmp@plt>
  test   %eax,%eax
  jne    L194
  mov    $0x3d,%esi
  mov    %rbp,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L188
  lea    0x28(%rsp),%rdx
  lea    0x1(%rax),%rdi
  mov    $0x22,%esi
  call   <kore_strip_chars@plt>
  mov    0x28(%rsp),%rbp
  mov    %rbp,%rdi
  call   <strlen@plt>
  test   %rax,%rax
  jg     L189
L80:
  mov    0x28(%rsp),%rdi
  call   <kore_mem_free@plt>
L194:
  mov    0x20(%rsp),%rdi
  call   <kore_mem_free@plt>
L55:
  add    $0x8,%rbx
  cmp    %r13,%rbx
  je     L148
L112:
  lea    0x60(%rsp),%rdx
  mov    $0x5,%ecx
  mov    %r12,%rsi
  mov    (%rbx),%rdi
  call   <kore_split_string@plt>
  cmp    $0x2,%eax
  jne    L55
  mov    %r14,%rsi
  mov    0x60(%rsp),%rdi
  call   <strcasecmp@plt>
  mov    0x68(%rsp),%rbp
  test   %rax,%rax
  jne    L55
  jmp    L54
L188:
  mov    0x20(%rsp),%rdi
  call   <kore_mem_free@plt>
  jmp    L55
L189:
  mov    0x1c(%rsp),%r9d
  mov    0x10(%rsp),%r8
  mov    %rbp,%rcx
  mov    0x20(%rsp),%rdx
  mov    0x8(%rsp),%rsi
  mov    (%rsp),%rdi
  call   <multipart_file_add@plt>
  jmp    L80
L148:
  mov    0xb8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L86
  mov    $0x1,%eax
  add    $0xc8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L86:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: data_label: D35
type_guessed: string
name: read_data
arguments: data_label: D48
type_guessed: string
name: read_data
arguments: data_label: D45
type_guessed: string
name: read_data
arguments: data_label: D19
type_guessed: string
name: read_data
arguments: data_label: D32
type_guessed: string
name: read_data
arguments: data_label: D4
type_guessed: string

tool: D35: 


tool: D48: :

tool: D45: content-disposition

tool: D19: ;

tool: D32: form-data

tool: D4: filename=

assistant: ```c
int multipart_parse_headers(struct http_request *req, struct kore_buf *in, struct kore_buf *hbuf, const char *boundary, const int blen) {
  int h, c, i;
  char *headers[5], *args[5], *opt[5];
  char *d, *val, *name, *fname, *string;
  string = kore_buf_stringify(hbuf);
  h = kore_split_string(string, "\r\n", headers, 5);
  for (i = 0; i < h; i++) {
    c = kore_split_string(headers[i], ":", args, 5);
    if (c != 2)
      continue;
    if (strcasecmp(args[0], "content-disposition"))
      continue;
    for (d = args[1]; isspace(*d); d++)
      ;
    c = kore_split_string(d, ";", opt, 5);
    if (c < 2)
      continue;
    if (strcasecmp(opt[0], "form-data"))
      continue;
    if ((val = strchr(opt[1], '=')) == NULL)
      continue;
    if (strlen(val) < 3)
      continue;
    val++;
    kore_strip_chars(val, '"', &name);
    if (opt[2] == NULL) {
      multipart_add_field(req, in, name, boundary, blen);
      kore_mem_free(name);
      continue;
    }
    for (d = opt[2]; isspace(*d); d++)
      ;
    if (!strncasecmp(d, "filename=", 9)) {
      if ((val = strchr(d, '=')) == NULL) {
        kore_mem_free(name);
        continue;
      }
      val++;
      kore_strip_chars(val, '"', &fname);
      if (strlen(fname) > 0) {
        multipart_file_add(req, in, name, fname, boundary, blen);
      }
      kore_mem_free(fname);
    } else {
      ;
    }
    kore_mem_free(name);
  }
  return (1);
}
```