user: What is the c source code of the assembly code below:

```asm
<conv_cmor_table>:
  endbr64
  push   %r15
  xor    %eax,%eax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  call   <kvlParseFile@plt>
  movslq %eax,%r13
  xor    %eax,%eax
  mov    %r13,%rdi
  call   <kvlGetNumLists@plt>
  movl   $0x0,0x1c(%rsp)
  mov    %eax,0xc(%rsp)
  test   %eax,%eax
  jle    L137
  xor    %ebx,%ebx
  jmp    L50
  xchg   %ax,%ax
L213:
  mov    $0x9,%eax
  mov    %rbp,%rsi
  lea    D52(%rip),%rdi
  cmp    %rax,%r12
  cmovbe %r12,%rax
  mov    %rax,%rdx
  call   <strncmp@plt>
  mov    %eax,%r15d
  test   %eax,%eax
  je     L321
L283:
  add    $0x1,%ebx
  cmp    %ebx,0xc(%rsp)
  je     L137
L50:
  mov    %ebx,%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <kvlGetListName@plt>
  mov    %ebx,%esi
  mov    %r13,%rdi
  movslq %eax,%rbp
  xor    %eax,%eax
  call   <kvlGetListNumElements@plt>
  mov    %rbp,%rdi
  mov    %eax,0x8(%rsp)
  call   <strlen@plt>
  mov    $0x7,%edx
  mov    %rbp,%rsi
  lea    D151(%rip),%rdi
  cmp    %rdx,%rax
  mov    %rax,%r12
  cmovbe %rax,%rdx
  call   <strncmp@plt>
  mov    %eax,%r14d
  test   %eax,%eax
  jne    L213
  mov    0x8(%rsp),%ecx
  test   %ecx,%ecx
  jle    L283
  lea    D38(%rip),%r12
  jmp    L43
  nopw   0x0(%rax,%rax,1)
L172:
  add    $0x1,%r14d
  cmp    %r14d,0x8(%rsp)
  je     L283
L43:
  mov    %r14d,%edx
  mov    %ebx,%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <kvlGetListElementName@plt>
  mov    %r14d,%edx
  mov    %ebx,%esi
  mov    %r13,%rdi
  movslq %eax,%r15
  xor    %eax,%eax
  call   <kvlGetListElementValue@plt>
  mov    %r15,%rdi
  mov    %eax,%ebp
  call   <strlen@plt>
  mov    %r15,%rsi
  mov    %r12,%rdi
  movslq %eax,%rdx
  mov    $0xe,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L172
  movslq %ebp,%rdi
  call   <atof@plt>
  pxor   %xmm1,%xmm1
  movl   $0x1,0x1c(%rsp)
  cvtsi2sd %eax,%xmm1
  movsd  %xmm1,0x20(%rsp)
  jmp    L172
  nopl   0x0(%rax,%rax,1)
L137:
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <kvlDelete@plt>
  add    $0x38,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L321:
  lea    D109(%rip),%rsi
  lea    D88(%rip),%rdi
  call   <printf@plt>
  mov    0x8(%rsp),%edx
  test   %edx,%edx
  jle    L358
  mov    %r13,0x10(%rsp)
  mov    %ebx,0x18(%rsp)
  nopl   0x0(%rax,%rax,1)
L175:
  mov    0x10(%rsp),%rbx
  mov    0x18(%rsp),%r14d
  mov    %r15d,%edx
  xor    %eax,%eax
  mov    %rbx,%rdi
  mov    %r14d,%esi
  call   <kvlGetListElementName@plt>
  mov    %r15d,%edx
  mov    %r14d,%esi
  mov    %rbx,%rdi
  movslq %eax,%r12
  xor    %eax,%eax
  call   <kvlGetListElementValue@plt>
  mov    %r12,%rdi
  movslq %eax,%r13
  call   <strlen@plt>
  mov    %r13,%rdi
  mov    %rax,%rbp
  call   <strlen@plt>
  mov    %eax,%ebx
  cmp    $0x1,%eax
  jle    L382
  cmpb   $0x22,0x0(%r13)
  je     L335
L177:
  mov    %r13,%rdi
  call   <strdup@plt>
  mov    %rax,%r13
L154:
  mov    %rbp,%rcx
  lea    0x1(%r13),%rdi
  mov    $0x1,%r14d
  mov    %ebx,%ebp
  jmp    L182
  nopl   (%rax)
L95:
  mov    %rbx,%rdi
  cmp    %r14d,%ebp
  jle    L101
L182:
  mov    %r14d,%eax
  add    $0x1,%r14d
  lea    0x1(%rdi),%rbx
  cmpb   $0x22,-0x1(%rdi)
  jne    L95
  cmpb   $0x22,(%rdi)
  jne    L95
  movb   $0x27,-0x1(%rdi)
  cmp    %ebp,%r14d
  jge    L111
  mov    $0xfffffffe,%edx
  mov    %rbx,%rsi
  mov    %rcx,0x28(%rsp)
  sub    %eax,%edx
  add    %ebp,%edx
  mov    %edx,%edx
  add    $0x1,%rdx
  call   <memmove@plt>
  mov    0x28(%rsp),%rcx
L111:
  sub    $0x1,%ebp
  mov    %rbx,%rdi
  cmp    %r14d,%ebp
  jg     L182
  nopl   0x0(%rax,%rax,1)
L101:
  mov    %ebp,%ebx
  mov    %rcx,%rbp
L251:
  movslq %ebp,%rbp
  mov    $0x5,%r14d
  mov    %r12,%rsi
  cmp    %r14,%rbp
  lea    D156(%rip),%rdi
  cmovbe %rbp,%r14
  mov    %r14,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  je     L32
  mov    $0xe,%edx
  mov    %r12,%rsi
  lea    D127(%rip),%rdi
  cmp    %rdx,%rbp
  cmovbe %rbp,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  je     L32
  mov    $0x9,%edx
  mov    %r12,%rsi
  lea    D91(%rip),%rdi
  cmp    %rdx,%rbp
  cmovbe %rbp,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  je     L32
  mov    %r14,%rdx
  mov    %r12,%rsi
  lea    D235(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L32
  mov    $0xa,%eax
  mov    %r12,%rsi
  lea    D236(%rip),%rdi
  cmp    %rax,%rbp
  cmovbe %rbp,%rax
  mov    %rax,%rdx
  mov    %rax,%r14
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L238
  nopl   0x0(%rax)
L32:
  mov    %r13,%rdx
  mov    %r12,%rsi
  lea    D150(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L266:
  mov    %r13,%rcx
  mov    $0x8e,%edx
  xor    %eax,%eax
  add    $0x1,%r15d
  lea    D22(%rip),%rsi
  lea    D136(%rip),%rdi
  call   <Free@plt>
  cmp    %r15d,0x8(%rsp)
  jne    L175
  mov    0x10(%rsp),%r13
  mov    0x18(%rsp),%ebx
L358:
  mov    0x1c(%rsp),%eax
  test   %eax,%eax
  jne    L161
L4:
  lea    D216(%rip),%rdi
  call   <puts@plt>
  jmp    L283
  cs nopw 0x0(%rax,%rax,1)
L335:
  movslq %eax,%rdx
  cmpb   $0x22,-0x1(%r13,%rdx,1)
  jne    L177
  lea    0x1(%r13),%rdi
  lea    -0x2(%rax),%ebx
  call   <strdup@plt>
  mov    %rax,%r13
  cmp    $0x1,%ebx
  jg     L154
  jmp    L251
  nopl   0x0(%rax)
L382:
  mov    %r13,%rdi
  call   <strdup@plt>
  mov    %rax,%r13
  jmp    L251
L238:
  mov    %r14,%rdx
  mov    %r12,%rsi
  lea    D0(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L32
  mov    $0x10,%eax
  mov    %r12,%rsi
  lea    D197(%rip),%rdi
  cmp    %rax,%rbp
  cmovbe %rbp,%rax
  mov    %rax,%rdx
  mov    %rax,0x28(%rsp)
  call   <strncmp@plt>
  test   %eax,%eax
  je     L32
  mov    0x28(%rsp),%rdx
  mov    %r12,%rsi
  lea    D123(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L32
  mov    %r14,%rdx
  mov    %r12,%rsi
  lea    D78(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L109
  mov    $0x6,%eax
  mov    %r12,%rsi
  lea    D44(%rip),%rdi
  cmp    %rax,%rbp
  cmovbe %rbp,%rax
  mov    %rax,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  je     L109
  mov    $0xd,%eax
  mov    %r12,%rsi
  lea    D116(%rip),%rdi
  cmp    %rax,%rbp
  cmovbe %rbp,%rax
  mov    %rax,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  je     L109
  mov    $0xe,%eax
  mov    %r12,%rsi
  lea    D247(%rip),%rdi
  cmp    %rax,%rbp
  cmovbe %rbp,%rax
  mov    %rax,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  je     L109
  mov    $0x8,%eax
  mov    %r12,%rsi
  lea    D180(%rip),%rdi
  cmp    %rax,%rbp
  cmovbe %rbp,%rax
  mov    %rax,%rdx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L266
L109:
  mov    %r13,%rcx
  mov    %ebx,%edx
  mov    %r12,%rsi
  xor    %eax,%eax
  lea    D169(%rip),%rdi
  call   <printf@plt>
  jmp    L266
L161:
  lea    D38(%rip),%r12
  movsd  0x20(%rsp),%xmm0
  mov    $0x1,%eax
  lea    D35(%rip),%rdi
  mov    %r12,%rsi
  call   <printf@plt>
  jmp    L4
```

tool_calls: name: read_data
arguments: data_label: D52
type_guessed: string
name: read_data
arguments: data_label: D151
type_guessed: string
name: read_data
arguments: data_label: D38
type_guessed: string
name: read_data
arguments: data_label: D109
type_guessed: string
name: read_data
arguments: data_label: D88
type_guessed: string
name: read_data
arguments: data_label: D156
type_guessed: string
name: read_data
arguments: data_label: D127
type_guessed: string
name: read_data
arguments: data_label: D91
type_guessed: string
name: read_data
arguments: data_label: D235
type_guessed: string
name: read_data
arguments: data_label: D236
type_guessed: string
name: read_data
arguments: data_label: D150
type_guessed: string
name: read_data
arguments: data_label: D22
type_guessed: string
name: read_data
arguments: data_label: D136
type_guessed: string
name: read_data
arguments: data_label: D216
type_guessed: string
name: read_data
arguments: data_label: D0
type_guessed: string
name: read_data
arguments: data_label: D197
type_guessed: string
name: read_data
arguments: data_label: D123
type_guessed: string
name: read_data
arguments: data_label: D78
type_guessed: string
name: read_data
arguments: data_label: D44
type_guessed: string
name: read_data
arguments: data_label: D116
type_guessed: string
name: read_data
arguments: data_label: D247
type_guessed: string
name: read_data
arguments: data_label: D180
type_guessed: string
name: read_data
arguments: data_label: D169
type_guessed: string
name: read_data
arguments: data_label: D35
type_guessed: string

tool: D52: variable

tool: D151: global

tool: D38: missing_value

tool: D109: parameter

tool: D88: &%s


tool: D156: name

tool: D127: standard_name

tool: D91: out_name

tool: D235: type

tool: D236: valid_min

tool: D150:   %-15s = %s


tool: D22: /scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AZed/cdo/refs/heads/master/src/Kvl.c

tool: D136: conv_cmor_table

tool: D216: /

tool: D0: valid_max

tool: D197: ok_min_mean_abs

tool: D123: ok_max_mean_abs

tool: D78: long_name

tool: D44: units

tool: D116: cell_methods

tool: D247: cell_measures

tool: D180: comment

tool: D169:   %-15s = "%.*s"


tool: D35:   %-15s = %g


assistant: ```c
int conv_cmor_table(const char *filename) {
  void *kvlist;
  int nlists, listID;
  int nelements, elemID;
  int len;
  int hasmissval = 0;
  double missval;
  const char *listname;
  const char *ename;
  const char *evalue;
  char *ovalue;
  kvlist = kvlParseFile(filename);
  nlists = kvlGetNumLists(kvlist);
  for (listID = 0; listID < nlists; ++listID) {
    listname = kvlGetListName(kvlist, listID);
    nelements = kvlGetListNumElements(kvlist, listID);
    if (strncmp("global", listname, strlen(listname)) == 0) {
      for (elemID = 0; elemID < nelements; ++elemID) {
        ename = kvlGetListElementName(kvlist, listID, elemID);
        evalue = kvlGetListElementValue(kvlist, listID, elemID);
        len = strlen(ename);
        if (strncmp("missing_value", ename, len) == 0) {
          missval = atof(evalue);
          hasmissval = 1;
        }
      }
    } else if (strncmp("variable", listname, strlen(listname)) == 0) {
      int vlen;
      printf("&%s\n", "parameter");
      for (elemID = 0; elemID < nelements; ++elemID) {
        ename = kvlGetListElementName(kvlist, listID, elemID);
        evalue = kvlGetListElementValue(kvlist, listID, elemID);
        len = strlen(ename);
        vlen = strlen(evalue);
        if (vlen > 1 && evalue[0] == '"' && evalue[vlen - 1] == '"') {
          vlen -= 2;
          evalue++;
        }
        ovalue = strdup(evalue);
        for (int i = 1; i < vlen; ++i) {
          if (ovalue[i - 1] == '"' && ovalue[i] == '"') {
            ovalue[i - 1] = '\'';
            for (int j = i + 1; j < vlen; ++j)
              ovalue[j - 1] = ovalue[j];
            vlen -= 1;
          }
        }
        if (strncmp("name", ename, len) == 0 || strncmp("standard_name", ename, len) == 0 || strncmp("out_name", ename, len) == 0 || strncmp("type", ename, len) == 0 || strncmp("valid_min", ename, len) == 0 || strncmp("valid_max", ename, len) == 0 || strncmp("ok_min_mean_abs", ename, len) == 0 || strncmp("ok_max_mean_abs", ename, len) == 0)
          printf("  %-15s = %s\n", ename, ovalue);
        else if (strncmp("long_name", ename, len) == 0 || strncmp("units", ename, len) == 0 || strncmp("cell_methods", ename, len) == 0 || strncmp("cell_measures", ename, len) == 0 || strncmp("comment", ename, len) == 0)
          printf("  %-15s = \"%.*s\"\n", ename, vlen, ovalue);
        Free(__func__, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AZed/cdo/refs/heads/master/src/Kvl.c", 142, (ovalue));
      }
      if (hasmissval)
        printf("  %-15s = %g\n", "missing_value", missval);
      printf("/\n");
    }
  }
  kvlDelete(kvlist);
  return (0);
}
```