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

```asm
<conv_cmor_table>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    $0x0,%eax
  call   <kvlParseFile@plt>
  movslq %eax,%r15
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <kvlGetNumLists@plt>
  mov    %eax,0x10(%rsp)
  test   %eax,%eax
  jle    L398
  movl   $0x0,0x14(%rsp)
  mov    $0x0,%r13d
  jmp    L239
L173:
  mov    0x4(%rsp),%r12d
  test   %r12d,%r12d
  jle    L281
  lea    D241(%rip),%r14
  jmp    L407
L364:
  add    $0x1,%ebx
  cmp    %ebx,%r12d
  je     L281
L407:
  mov    %ebx,%edx
  mov    %r13d,%esi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <kvlGetListElementName@plt>
  movslq %eax,%rbp
  mov    %ebx,%edx
  mov    %r13d,%esi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <kvlGetListElementValue@plt>
  mov    %eax,0x4(%rsp)
  mov    %rbp,%rdi
  call   <strlen@plt>
  movslq %eax,%rdx
  mov    $0xe,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  mov    %r14,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L364
  movslq 0x4(%rsp),%rdi
  call   <atof@plt>
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movsd  %xmm1,0x18(%rsp)
  movl   $0x1,0x14(%rsp)
  jmp    L364
L386:
  movslq %eax,%rdx
  cmpb   $0x22,-0x1(%r12,%rdx,1)
  jne    L320
  lea    -0x2(%rax),%ebx
  lea    0x1(%r12),%rdi
  call   <strdup@plt>
  mov    %rax,%r12
  cmp    $0x1,%ebx
  jg     L346
  jmp    L372
L112:
  sub    $0x1,%ebx
L33:
  add    $0x1,%edx
  add    $0x1,%rsi
  add    $0x1,%rax
  cmp    %edx,%ebx
  jle    L372
L201:
  cmpb   $0x22,-0x1(%rax)
  jne    L33
  cmpb   $0x22,(%rax)
  jne    L33
  movb   $0x27,-0x1(%rax)
  cmp    %esi,%ebx
  jle    L112
  movslq %esi,%rcx
  add    %r12,%rcx
  lea    -0x2(%rbx),%edi
  sub    %edx,%edi
  lea    0x2(%rax,%rdi,1),%r8
L303:
  movzbl (%rcx),%edi
  mov    %dil,-0x1(%rcx)
  add    $0x1,%rcx
  cmp    %r8,%rcx
  jne    L303
  jmp    L112
L104:
  movslq %r15d,%rdx
  mov    $0xa,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D228(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L42
  movslq %r15d,%rdx
  mov    $0x6,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D51(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L42
  movslq %r15d,%rdx
  mov    $0xd,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D106(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L42
  movslq %r15d,%rdx
  mov    $0xe,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D184(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L42
  movslq %r15d,%rdx
  mov    $0x8,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D37(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L86
L42:
  mov    %r12,%rcx
  mov    %ebx,%edx
  mov    %rbp,%rsi
  lea    D166(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L86
L124:
  mov    0x8(%rsp),%r15
L4:
  cmpl   $0x0,0x14(%rsp)
  jne    L214
L143:
  lea    D186(%rip),%rdi
  call   <puts@plt>
L281:
  add    $0x1,%r13d
  cmp    %r13d,0x10(%rsp)
  je     L398
L239:
  mov    %r13d,%esi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <kvlGetListName@plt>
  movslq %eax,%r12
  mov    %r13d,%esi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <kvlGetListNumElements@plt>
  mov    %eax,0x4(%rsp)
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %rax,%rbp
  mov    $0x7,%edx
  cmp    %rdx,%rax
  cmovbe %rax,%rdx
  mov    %r12,%rsi
  lea    D157(%rip),%rdi
  call   <strncmp@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L173
  mov    $0x9,%eax
  cmp    %rax,%rbp
  cmovbe %rbp,%rax
  mov    %rax,%rdx
  mov    %r12,%rsi
  lea    D159(%rip),%rdi
  call   <strncmp@plt>
  mov    %eax,%r14d
  test   %eax,%eax
  jne    L281
  lea    D194(%rip),%rsi
  lea    D78(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  cmpl   $0x0,0x4(%rsp)
  jle    L4
  mov    %r15,0x8(%rsp)
  jmp    L167
L214:
  movsd  0x18(%rsp),%xmm0
  lea    D241(%rip),%rsi
  lea    D29(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  jmp    L143
L20:
  mov    %r12,%rdi
  call   <strdup@plt>
  mov    %rax,%r12
L372:
  movslq %r15d,%rdx
  mov    $0x5,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D76(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L279
  movslq %r15d,%rdx
  mov    $0xe,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D222(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L279
  movslq %r15d,%rdx
  mov    $0x9,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D174(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L279
  movslq %r15d,%rdx
  mov    $0x5,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D134(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L279
  movslq %r15d,%rdx
  mov    $0xa,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D118(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L279
  movslq %r15d,%rdx
  mov    $0xa,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D109(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L279
  movslq %r15d,%rdx
  mov    $0x10,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D67(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L279
  movslq %r15d,%rdx
  mov    $0x10,%eax
  cmp    %rax,%rdx
  cmova  %rax,%rdx
  mov    %rbp,%rsi
  lea    D121(%rip),%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L104
L279:
  mov    %r12,%rdx
  mov    %rbp,%rsi
  lea    D77(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L86:
  mov    %r12,%rcx
  mov    $0x8e,%edx
  lea    D130(%rip),%rsi
  lea    D80(%rip),%rdi
  mov    $0x0,%eax
  call   <Free@plt>
  add    $0x1,%r14d
  cmp    %r14d,0x4(%rsp)
  je     L124
L167:
  mov    %r14d,%edx
  mov    %r13d,%esi
  mov    0x8(%rsp),%rbx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <kvlGetListElementName@plt>
  movslq %eax,%rbp
  mov    %r14d,%edx
  mov    %r13d,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <kvlGetListElementValue@plt>
  movslq %eax,%r12
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %rax,%r15
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebx
  cmp    $0x1,%eax
  jle    L20
  cmpb   $0x22,(%r12)
  je     L386
L320:
  mov    %r12,%rdi
  call   <strdup@plt>
  mov    %rax,%r12
L346:
  lea    0x1(%r12),%rax
  mov    $0x2,%esi
  mov    $0x1,%edx
  jmp    L201
L398:
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <kvlDelete@plt>
  mov    $0x0,%eax
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D241
type_guessed: string
name: extract_symbolic_data
arguments: label: D228
type_guessed: string
name: extract_symbolic_data
arguments: label: D51
type_guessed: string
name: extract_symbolic_data
arguments: label: D106
type_guessed: string
name: extract_symbolic_data
arguments: label: D184
type_guessed: string
name: extract_symbolic_data
arguments: label: D37
type_guessed: string
name: extract_symbolic_data
arguments: label: D166
type_guessed: string
name: extract_symbolic_data
arguments: label: D186
type_guessed: string
name: extract_symbolic_data
arguments: label: D157
type_guessed: string
name: extract_symbolic_data
arguments: label: D159
type_guessed: string
name: extract_symbolic_data
arguments: label: D194
type_guessed: string
name: extract_symbolic_data
arguments: label: D78
type_guessed: string
name: extract_symbolic_data
arguments: label: D29
type_guessed: string
name: extract_symbolic_data
arguments: label: D76
type_guessed: string
name: extract_symbolic_data
arguments: label: D222
type_guessed: string
name: extract_symbolic_data
arguments: label: D174
type_guessed: string
name: extract_symbolic_data
arguments: label: D134
type_guessed: string
name: extract_symbolic_data
arguments: label: D118
type_guessed: string
name: extract_symbolic_data
arguments: label: D109
type_guessed: string
name: extract_symbolic_data
arguments: label: D67
type_guessed: string
name: extract_symbolic_data
arguments: label: D121
type_guessed: string
name: extract_symbolic_data
arguments: label: D77
type_guessed: string
name: extract_symbolic_data
arguments: label: D130
type_guessed: string
name: extract_symbolic_data
arguments: label: D80
type_guessed: string

tool: D241: missing_value

tool: D228: long_name

tool: D51: units

tool: D106: cell_methods

tool: D184: cell_measures

tool: D37: comment

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


tool: D186: /

tool: D157: global

tool: D159: variable

tool: D194: parameter

tool: D78: &%s


tool: D29:   %-15s = %g


tool: D76: name

tool: D222: standard_name

tool: D174: out_name

tool: D134: type

tool: D118: valid_min

tool: D109: valid_max

tool: D67: ok_min_mean_abs

tool: D121: ok_max_mean_abs

tool: D77:   %-15s = %s


tool: D130: /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: D80: conv_cmor_table

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);
}
```