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

```asm
<extract2>:
  endbr64
  push   %r15
  mov    %rdi,%r15
  push   %r14
  mov    %edx,%r14d
  push   %r13
  push   %r12
  mov    %r9,%r12
  push   %rbp
  mov    %r8d,%ebp
  push   %rbx
  sub    $0x188,%rsp
  mov    0x1d0(%rsp),%rax
  mov    %rsi,0x8(%rsp)
  mov    %edx,0x44(%rsp)
  mov    0x1c8(%rsp),%r13d
  mov    %rax,0x50(%rsp)
  mov    0x1d8(%rsp),%rax
  mov    %r9,0x48(%rsp)
  mov    0x1e0(%rsp),%rbx
  mov    %rax,0x58(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x178(%rsp)
  xor    %eax,%eax
  call   <rewind@plt>
  test   %ebp,%ebp
  jle    L28
  lea    -0x1(%rbp),%eax
  mov    %rbx,0x18(%rsp)
  lea    (%rax,%rax,4),%rax
  lea    0x14(%rbx,%rax,4),%rax
  mov    %rax,0x38(%rsp)
  lea    -0x1(%r14),%eax
  lea    0x4(%r12,%rax,4),%rax
  mov    %rax,0x30(%rsp)
L35:
  mov    0x44(%rsp),%eax
  test   %eax,%eax
  jle    L224
  mov    0x50(%rsp),%rax
  mov    %rax,0x20(%rsp)
  mov    0x48(%rsp),%rax
  mov    %rax,0x28(%rsp)
L200:
  mov    0x58(%rsp),%rax
  movl   $0x0,0x40(%rsp)
  mov    %rax,0x10(%rsp)
  mov    0x28(%rsp),%rax
  mov    (%rax),%edx
  test   %edx,%edx
  jle    L98
  xchg   %ax,%ax
L123:
  cmpl   $0x1,0x208(%rsp)
  je     L192
L30:
  mov    0x10(%rsp),%rcx
  mov    0x20(%rsp),%rdx
  mov    %r15,%rdi
  mov    0x18(%rsp),%rsi
  call   <find_TSVL@plt>
  mov    %rax,%r15
  test   %rax,%rax
  je     L47
  mov    0x8(%rsp),%r12
  mov    $0xe,%ebx
  lea    0x70(%rsp),%rbp
L145:
  mov    $0xff,%esi
  mov    %rbp,%rdi
  mov    %r15,%rdx
  call   <fgets@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <fputs@plt>
  sub    $0x1,%ebx
  jne    L145
  mov    0x1c0(%rsp),%esi
  movl   $0x0,(%rsp)
  lea    D38(%rip),%r12
  movl   $0x1,0x4(%rsp)
  test   %esi,%esi
  jle    L117
  nopl   (%rax)
L152:
  test   %r13d,%r13d
  jle    L19
  mov    0x4(%rsp),%eax
  cmp    %eax,0x1f8(%rsp)
  mov    $0x1,%r14d
  lea    0x6c(%rsp),%rbp
  setle  %bl
  cmp    %eax,0x200(%rsp)
  setge  %al
  and    %eax,%ebx
  jmp    L15
  nopl   0x0(%rax,%rax,1)
L193:
  mov    0x8(%rsp),%rdi
  lea    D6(%rip),%rsi
  mov    $0x1,%eax
  call   <fprintf@plt>
  movl   $0x0,(%rsp)
  nopl   (%rax)
L207:
  add    $0x1,%r14d
  cmp    %r14d,%r13d
  jl     L19
L15:
  mov    %rbp,%rdx
  mov    %r12,%rsi
  mov    %r15,%rdi
  call   <fscanf@plt>
  test   %bl,%bl
  je     L207
  cmp    %r14d,0x1f0(%rsp)
  jg     L207
  cmp    %r14d,0x1e8(%rsp)
  jl     L207
  addl   $0x1,(%rsp)
  mov    (%rsp),%eax
  pxor   %xmm0,%xmm0
  cvtss2sd 0x6c(%rsp),%xmm0
  cmp    $0x7,%eax
  jg     L193
  mov    0x8(%rsp),%rdi
  lea    D3(%rip),%rsi
  mov    $0x1,%eax
  add    $0x1,%r14d
  call   <fprintf@plt>
  cmp    %r14d,%r13d
  jge    L15
  nopl   0x0(%rax)
L19:
  addl   $0x1,0x4(%rsp)
  mov    0x4(%rsp),%eax
  cmp    %eax,0x1c0(%rsp)
  jge    L152
  mov    (%rsp),%ecx
  test   %ecx,%ecx
  je     L117
  mov    0x8(%rsp),%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
L117:
  mov    0x28(%rsp),%rcx
  addl   $0x1,0x40(%rsp)
  addq   $0xa,0x10(%rsp)
  mov    0x40(%rsp),%eax
  cmp    %eax,(%rcx)
  jg     L123
L98:
  addq   $0x4,0x28(%rsp)
  mov    0x28(%rsp),%rax
  addq   $0xa,0x20(%rsp)
  cmp    %rax,0x30(%rsp)
  jne    L200
L224:
  addq   $0x14,0x18(%rsp)
  mov    0x18(%rsp),%rax
  cmp    0x38(%rsp),%rax
  jne    L35
L28:
  xor    %eax,%eax
  jmp    L79
  cs nopw 0x0(%rax,%rax,1)
L192:
  mov    0x10(%rsp),%rcx
  mov    0x20(%rsp),%rdx
  lea    D8(%rip),%rdi
  mov    0x18(%rsp),%rsi
  call   <printf@plt>
  jmp    L30
L47:
  mov    $0xffffffff,%eax
L79:
  mov    0x178(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L26
  add    $0x188,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L26:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D38
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D6
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D3
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D8
type_guessed: string

tool: D38:  %f

tool: D6: %.6e


tool: D3: %.6e 

tool: D8: [%s][%s][%s]


assistant: ```c
int extract2(FILE *fpin, FILE *fpout, int NumVars, int NumLev, int NumTimes, int Nl[], int Nr, int Nc, char VarName[][10], char LevName[][10], char TStepName[][20], int east_bound, int west_bound, int north_bound, int south_bound, int flag_i) {
  int it, iv, ir, ic, il, skip, val_cnt;
  float val;
  char inStr[255];
  rewind(fpin);
  for (it = 0; it < NumTimes; it++) {
    for (iv = 0; iv < NumVars; iv++) {
      for (il = 0; il < Nl[iv]; il++) {
        if (flag_i == 1)
          printf("[%s][%s][%s]\n", TStepName[it], VarName[iv], LevName[il]);
        fpin = find_TSVL(fpin, TStepName[it], VarName[iv], LevName[il]);
        if (fpin == NULL)
          goto err;
        for (skip = 1; skip <= 14; skip++) {
          fgets(inStr, 255, fpin);
          fprintf(fpout, "%s", inStr);
        }
        val_cnt = 0;
        for (ir = 1; ir <= Nr; ir++) {
          for (ic = 1; ic <= Nc; ic++) {
            fscanf(fpin, " %f", &val);
            if ((ir <= south_bound) && (ir >= north_bound) && (ic >= west_bound) && (ic <= east_bound)) {
              val_cnt++;
              if (val_cnt >= 8) {
                fprintf(fpout, "%.6e\n", val);
                val_cnt = 0;
              } else
                fprintf(fpout, "%.6e ", val);
            }
          }
        }
        if (val_cnt != 0) {
          fprintf(fpout, "\n");
          val_cnt = 0;
        }
      }
    }
  }
  return 0;
err:
  return -1;
}
```