user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<main>:
  endbr64
  push   %rbx
  lea    D29(%rip),%rdi
  call   <mls_conf_ini@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L51
L12:
  mov    %rbx,%rdi
  call   <mls_conf_load@plt>
  lea    D296(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D296(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  lea    D450(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D450(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  lea    D75(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D75(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  lea    D426(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D426(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  lea    D89(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D89(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  lea    D17(%rip),%rdx
  lea    D450(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_set@plt>
  test   %eax,%eax
  jne    L59
L24:
  lea    D17(%rip),%rdx
  lea    D450(%rip),%rsi
  lea    D238(%rip),%rdi
  call   <printf@plt>
  lea    D148(%rip),%rdx
  lea    D74(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_set@plt>
  test   %eax,%eax
  jne    L41
L53:
  lea    D148(%rip),%rdx
  lea    D74(%rip),%rsi
  lea    D238(%rip),%rdi
  call   <printf@plt>
  lea    D450(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D450(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  lea    D74(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D74(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  lea    D89(%rip),%rsi
  mov    %rbx,%rdi
  call   <mls_conf_get@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  lea    D67(%rip),%rax
  cmove  %rax,%rdx
  lea    D89(%rip),%rsi
  lea    D258(%rip),%rdi
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <mls_conf_store@plt>
  mov    %rbx,%rdi
  call   <mls_conf_fin@plt>
  mov    $0x0,%eax
  pop    %rbx
  ret
L51:
  lea    D377(%rip),%rdi
  mov    $0x0,%eax
  call   <mls_fatal_perror@plt>
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L12
L59:
  lea    D17(%rip),%rdx
  lea    D450(%rip),%rsi
  lea    D46(%rip),%rdi
  mov    $0x0,%eax
  call   <mls_fatal_perror@plt>
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L24
L41:
  lea    D148(%rip),%rdx
  lea    D74(%rip),%rsi
  lea    D46(%rip),%rdi
  mov    $0x0,%eax
  call   <mls_fatal_perror@plt>
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L53
```

tool_calls: name: disassemble_data
arguments: label: D29
type: string
name: disassemble_data
arguments: label: D296
type: string
name: disassemble_data
arguments: label: D67
type: string
name: disassemble_data
arguments: label: D258
type: string
name: disassemble_data
arguments: label: D450
type: string
name: disassemble_data
arguments: label: D75
type: string
name: disassemble_data
arguments: label: D426
type: string
name: disassemble_data
arguments: label: D89
type: string
name: disassemble_data
arguments: label: D17
type: string
name: disassemble_data
arguments: label: D238
type: string
name: disassemble_data
arguments: label: D148
type: string
name: disassemble_data
arguments: label: D74
type: string
name: disassemble_data
arguments: label: D377
type: string
name: disassemble_data
arguments: label: D46
type: string

tool: D29: ./test.ini

tool: D296: key1

tool: D67: NOTFOUND

tool: D258: GET: %s = %s


tool: D450: key2

tool: D75: ckey1

tool: D426: undef

tool: D89: keyX

tool: D17: modify-val2

tool: D238: SET: %s = %s


tool: D148: val3

tool: D74: key3

tool: D377: mls_conf_ini

tool: D46: Set error %s:%s

assistant: ```c
int main(int ac, char *argv[]) {
  struct mls_conf *conf;
  conf = mls_conf_ini("./test.ini");
  if (NULL == conf) {
    do {
      mls_fatal_perror("mls_conf_ini");
      abort();
    } while (0);
  }
  mls_conf_load(conf);
  {
    ({
      char *val;
      val = mls_conf_get((conf), ("key1"));
      printf("GET: %s = %s\n", ("key1"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key2"));
      printf("GET: %s = %s\n", ("key2"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("ckey1"));
      printf("GET: %s = %s\n", ("ckey1"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("undef"));
      printf("GET: %s = %s\n", ("undef"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("keyX"));
      printf("GET: %s = %s\n", ("keyX"), (NULL != val) ? val : "NOTFOUND");
    });
  }
  {
    ({
      int ret = 0;
      ret = mls_conf_set((conf), ("key2"), ("modify-val2"));
      if (0 != ret) {
        do {
          mls_fatal_perror("Set error %s:%s", ("key2"), ("modify-val2"));
          abort();
        } while (0);
      }
      printf("SET: %s = %s\n", ("key2"), ("modify-val2"));
    });
    ({
      int ret = 0;
      ret = mls_conf_set((conf), ("key3"), ("val3"));
      if (0 != ret) {
        do {
          mls_fatal_perror("Set error %s:%s", ("key3"), ("val3"));
          abort();
        } while (0);
      }
      printf("SET: %s = %s\n", ("key3"), ("val3"));
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key2"));
      printf("GET: %s = %s\n", ("key2"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key3"));
      printf("GET: %s = %s\n", ("key3"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("keyX"));
      printf("GET: %s = %s\n", ("keyX"), (NULL != val) ? val : "NOTFOUND");
    });
  }
  mls_conf_store(conf);
  mls_conf_fin(conf);
  return 0;
}
```