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

```asm
<enc>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x4e0,%rsp
  mov    %edi,-0x4d4(%rbp)
  mov    %rsi,-0x4e0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x4e0(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  lea    D40(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x4a8(%rbp)
  mov    -0x4e0(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  lea    D61(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x4a0(%rbp)
  cmpq   $0x0,-0x4a8(%rbp)
  jne    L28
  lea    D19(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
  jmp    L172
L28:
  cmpq   $0x0,-0x4a0(%rbp)
  jne    L204
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  call   <error@plt>
  jmp    L172
L62:
  movl   $0x0,-0x4c8(%rbp)
  jmp    L209
L259:
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <fgetc@plt>
  mov    -0x4c8(%rbp),%edx
  movslq %edx,%rdx
  mov    %al,-0x90(%rbp,%rdx,1)
  addl   $0x1,-0x4c8(%rbp)
L209:
  cmpl   $0x7f,-0x4c8(%rbp)
  jle    L259
  movl   $0x0,-0x4c4(%rbp)
  jmp    L277
L232:
  mov    -0x4c4(%rbp),%eax
  shl    $0x2,%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  movzbl %al,%eax
  mov    %eax,-0x4c0(%rbp)
  mov    -0x4c4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x1,%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  movzbl %al,%eax
  and    $0x7f,%eax
  shl    $0x8,%eax
  add    %eax,-0x4c0(%rbp)
  mov    -0x4c4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x1,%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  test   %al,%al
  jns    L192
  subl   $0x8000,-0x4c0(%rbp)
L192:
  mov    -0x4c4(%rbp),%eax
  cltq
  mov    -0x4c0(%rbp),%edx
  mov    %edx,-0x390(%rbp,%rax,4)
  movl   $0x0,-0x4bc(%rbp)
  mov    -0x4c4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x2,%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  movzbl %al,%eax
  or     %eax,-0x4bc(%rbp)
  mov    -0x4c4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x3,%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  movzbl %al,%eax
  and    $0x7f,%eax
  shl    $0x8,%eax
  or     %eax,-0x4bc(%rbp)
  mov    -0x4c4(%rbp),%eax
  shl    $0x2,%eax
  add    $0x3,%eax
  cltq
  movzbl -0x90(%rbp,%rax,1),%eax
  test   %al,%al
  jns    L58
  subl   $0x8000,-0x4bc(%rbp)
L58:
  mov    -0x4c4(%rbp),%eax
  add    $0x20,%eax
  cltq
  mov    -0x4bc(%rbp),%edx
  mov    %edx,-0x390(%rbp,%rax,4)
  addl   $0x1,-0x4c4(%rbp)
L277:
  cmpl   $0x1f,-0x4c4(%rbp)
  jle    L232
  movl   $0x0,-0x4b8(%rbp)
  jmp    L168
L43:
  mov    -0x4b8(%rbp),%eax
  cltq
  mov    -0x390(%rbp,%rax,4),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  D48(%rip),%xmm1
  divss  %xmm1,%xmm0
  mov    -0x4b8(%rbp),%eax
  cltq
  movss  %xmm0,-0x290(%rbp,%rax,4)
  addl   $0x1,-0x4b8(%rbp)
L168:
  cmpl   $0x3f,-0x4b8(%rbp)
  jle    L43
  lea    -0x490(%rbp),%rdx
  lea    -0x290(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <edct@plt>
  lea    -0x290(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  mov    %rax,-0x498(%rbp)
  lea    -0x410(%rbp),%rdx
  mov    -0x498(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <edct@plt>
  movl   $0x0,-0x4b4(%rbp)
  jmp    L30
L52:
  mov    -0x4b4(%rbp),%eax
  cltq
  movss  -0x490(%rbp,%rax,4),%xmm1
  movss  D35(%rip),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x4b4(%rbp),%eax
  add    %eax,%eax
  cvttss2si %xmm0,%edx
  cltq
  mov    %edx,-0x190(%rbp,%rax,4)
  mov    -0x4b4(%rbp),%eax
  cltq
  movss  -0x410(%rbp,%rax,4),%xmm1
  movss  D35(%rip),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x4b4(%rbp),%eax
  add    %eax,%eax
  add    $0x1,%eax
  cvttss2si %xmm0,%edx
  cltq
  mov    %edx,-0x190(%rbp,%rax,4)
  addl   $0x1,-0x4b4(%rbp)
L30:
  cmpl   $0x1f,-0x4b4(%rbp)
  jle    L52
  movl   $0x0,-0x4b0(%rbp)
  jmp    L249
L193:
  movb   $0x0,-0x4c9(%rbp)
  mov    -0x4b0(%rbp),%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L131
  orb    $0x80,-0x4c9(%rbp)
L131:
  mov    -0x4b0(%rbp),%eax
  add    $0x1,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L257
  orb    $0x40,-0x4c9(%rbp)
L257:
  mov    -0x4b0(%rbp),%eax
  add    $0x2,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L190
  orb    $0x20,-0x4c9(%rbp)
L190:
  mov    -0x4b0(%rbp),%eax
  add    $0x3,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L82
  orb    $0x10,-0x4c9(%rbp)
L82:
  mov    -0x4b0(%rbp),%eax
  add    $0x4,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L6
  orb    $0x8,-0x4c9(%rbp)
L6:
  mov    -0x4b0(%rbp),%eax
  add    $0x5,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L151
  orb    $0x4,-0x4c9(%rbp)
L151:
  mov    -0x4b0(%rbp),%eax
  add    $0x6,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L96
  orb    $0x2,-0x4c9(%rbp)
L96:
  mov    -0x4b0(%rbp),%eax
  add    $0x7,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L215
  orb    $0x1,-0x4c9(%rbp)
L215:
  movsbl -0x4c9(%rbp),%eax
  mov    -0x4a0(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <fputc@plt>
  movl   $0x0,-0x4ac(%rbp)
  jmp    L49
L266:
  mov    -0x4b0(%rbp),%edx
  mov    -0x4ac(%rbp),%eax
  add    %edx,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L94
  mov    -0x4b0(%rbp),%edx
  mov    -0x4ac(%rbp),%eax
  add    %edx,%eax
  cltq
  mov    -0x190(%rbp,%rax,4),%eax
  movzbl %al,%eax
  mov    -0x4a0(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <fputc@plt>
L94:
  addl   $0x1,-0x4ac(%rbp)
L49:
  cmpl   $0x7,-0x4ac(%rbp)
  jle    L266
  addl   $0x8,-0x4b0(%rbp)
L249:
  cmpl   $0x3f,-0x4b0(%rbp)
  jle    L193
L204:
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <feof@plt>
  test   %eax,%eax
  je     L62
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  mov    -0x4a0(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
L172:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L126
  call   <__stack_chk_fail@plt>
L126:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D40
type: string
name: retrieve_data
arguments: data_label: D61
type: string
name: retrieve_data
arguments: data_label: D19
type: string
name: retrieve_data
arguments: data_label: D20
type: string
name: retrieve_data
arguments: data_label: D48
type: f32
name: retrieve_data
arguments: data_label: D35
type: byte[4]

tool: D40: r

tool: D61: w

tool: D19: Could not open input file

tool: D20: Could not open output file

tool: D48: 32768

tool: {"D35": [0x00,0x00,0x80,0x41]}

assistant: ```c
int enc(int argc, char *argv[]) {
  FILE *in;
  FILE *out;
  in = fopen(argv[2], "r");
  out = fopen(argv[3], "w");
  if (in == NULL)
    return error("Could not open input file");
  if (out == NULL)
    return error("Could not open output file");
  unsigned char buf[32 * 4];
  int iarr[32 * 2];
  float darr[32 * 2];
  float doutl[32];
  float doutr[32];
  int iout[32 * 2];
  while (!feof(in)) {
    for (int i = 0; i < 32 * 4; ++i) {
      buf[i] = fgetc(in);
    }
    for (int i = 0; i < 32; ++i) {
      int l = buf[i * 4];
      l += (buf[i * 4 + 1] & 0x7F) * 256;
      if (buf[i * 4 + 1] & 0x80)
        l = (0x8000 - l) * -1;
      iarr[i] = l;
      int r;
      r = 0;
      r |= buf[i * 4 + 2];
      r |= (buf[i * 4 + 3] & 0x7F) * 256;
      if (buf[i * 4 + 3] & 0x80) {
        r = (0x8000 - r) * -1;
      }
      iarr[i + 32] = r;
    }
    for (int i = 0; i < 32 * 2; ++i) {
      darr[i] = ((float)iarr[i]) / 32768.;
    }
    edct(darr, doutl);
    float *darrr = darr + 32;
    edct(darrr, doutr);
    for (int i = 0; i < 32; ++i) {
      iout[i * 2] = doutl[i] * 16;
      iout[i * 2 + 1] = doutr[i] * 16;
    }
    for (int i = 0; i < 32 * 2; i += 8) {
      char control = 0;
      if (iout[i] & 0xFF)
        control |= 128;
      if (iout[i + 1] & 0xFF)
        control |= 64;
      if (iout[i + 2] & 0xFF)
        control |= 32;
      if (iout[i + 3] & 0xFF)
        control |= 16;
      if (iout[i + 4] & 0xFF)
        control |= 8;
      if (iout[i + 5] & 0xFF)
        control |= 4;
      if (iout[i + 6] & 0xFF)
        control |= 2;
      if (iout[i + 7] & 0xFF)
        control |= 1;
      fputc(control, out);
      for (int j = 0; j < 8; ++j) {
        if (iout[i + j] & 0xFF)
          fputc(iout[i + j] & 0xFF, out);
      }
    }
  }
  fclose(in);
  fclose(out);
}
```