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

```asm
<conf_init>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x110,%rsp
  mov    %rdi,-0x108(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x108(%rbp),%rax
  lea    D29(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x100(%rbp)
  cmpq   $0x0,-0x100(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  jmp    L78
L48:
  mov    -0x100(%rbp),%rdx
  lea    -0xe0(%rbp),%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <fgets@plt>
  lea    -0xe0(%rbp),%rax
  lea    D43(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L29
  mov    -0x100(%rbp),%rdx
  lea    -0xe0(%rbp),%rax
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <fgets@plt>
  jmp    L78
L29:
  lea    -0xe0(%rbp),%rax
  lea    D39(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L80
  mov    -0x100(%rbp),%rdx
  lea    -0xe0(%rbp),%rax
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <fgets@plt>
  jmp    L78
L80:
  mov    -0x100(%rbp),%rdx
  lea    -0x70(%rbp),%rax
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <fgets@plt>
  lea    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  sub    $0x1,%eax
  cltq
  movzbl -0x70(%rbp,%rax,1),%eax
  cmp    $0xa,%al
  jne    L111
  lea    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  sub    $0x1,%eax
  cltq
  movb   $0x20,-0x70(%rbp,%rax,1)
L111:
  lea    -0x70(%rbp),%rdx
  lea    -0xe0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    %rax,-0xf8(%rbp)
  mov    -0xf8(%rbp),%rax
  lea    D27(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  mov    %rax,-0xf0(%rbp)
  lea    D27(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0xe8(%rbp)
  mov    -0xf0(%rbp),%rax
  mov    %rax,%rdi
  call   <Trims@plt>
  mov    %rax,-0xf0(%rbp)
  mov    -0xe8(%rbp),%rax
  mov    %rax,%rdi
  call   <Trims@plt>
  mov    %rax,-0xe8(%rbp)
  cmpq   $0x0,-0xf0(%rbp)
  jne    L53
  jmp    L78
L53:
  cmpq   $0x0,-0xe8(%rbp)
  jne    L40
  mov    -0xf0(%rbp),%rax
  mov    $0x1,%edx
  lea    D45(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <setenv@plt>
  jmp    L78
L40:
  mov    -0xe8(%rbp),%rcx
  mov    -0xf0(%rbp),%rax
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <setenv@plt>
L78:
  mov    -0x100(%rbp),%rax
  mov    %rax,%rdi
  call   <feof@plt>
  test   %eax,%eax
  je     L48
  mov    -0x100(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L3
  call   <__stack_chk_fail@plt>
L3:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D29
datatype: string
name: parse_data
arguments: tag: D43
datatype: string
name: parse_data
arguments: tag: D39
datatype: string
name: parse_data
arguments: tag: D27
datatype: string
name: parse_data
arguments: tag: D45
datatype: string

tool: D29: r

tool: D43: #

tool: D39: [

tool: D27: =

tool: 

assistant: ```c
void conf_init(char *path) {
  FILE *fp;
  char *p, *right_val, *left_val;
  char buf[100], bufs[100];
  fp = fopen(path, "r");
  assert((fp != NULL));
  while (!feof(fp)) {
    fgets(buf, 2, fp);
    if (!strcmp(buf, "#")) {
      fgets(buf, 100, fp);
    } else if (!strcmp(buf, "[")) {
      fgets(buf, 100, fp);
    } else {
      fgets(bufs, 100, fp);
      if (bufs[strlen(bufs) - 1] == '\n')
        bufs[strlen(bufs) - 1] = ' ';
      p = strcat(buf, bufs);
      left_val = strtok(p, "=");
      right_val = strtok(NULL, "=");
      left_val = Trims(left_val);
      right_val = Trims(right_val);
      if (left_val == NULL)
        continue;
      if (right_val == NULL)
        setenv(left_val, "", 1);
      else
        setenv(left_val, right_val, 1);
    }
  }
  fclose(fp);
}
```