user: 请从给定的汇编指令推导出C源代码：

```asm
<inf>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    D93(%rip),%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    D93(%rip),%rax
  mov    (%rax),%rax
  mov    %rax,-0x18(%rbp)
  mov    D93(%rip),%rax
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  movq   $0x0,-0x40(%rbp)
  mov    D93(%rip),%rax
  mov    (%rax),%rax
  mov    %rax,-0x38(%rbp)
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <inflateInit@plt>
  mov    %eax,-0x44(%rbp)
  mov    D17(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x44(%rbp)
  je     L132
  mov    -0x44(%rbp),%eax
  jmp    L64
L132:
  mov    -0x58(%rbp),%rax
  mov    %rax,%rcx
  mov    $0x8000,%edx
  mov    $0x1,%esi
  lea    D70(%rip),%rax
  mov    %rax,%rdi
  call   <fread@plt>
  mov    %rax,-0x40(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  call   <ferror@plt>
  test   %rax,%rax
  je     L32
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <inflateEnd@plt>
  mov    D31(%rip),%rax
  mov    (%rax),%eax
  jmp    L64
L32:
  mov    -0x40(%rbp),%rax
  test   %rax,%rax
  je     L121
  lea    D70(%rip),%rax
  mov    %rax,-0x38(%rbp)
L92:
  movl   $0x8000,-0x30(%rbp)
  lea    D64(%rip),%rax
  mov    %rax,-0x28(%rbp)
  mov    D24(%rip),%rax
  mov    (%rax),%edx
  lea    -0x40(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <inflate@plt>
  mov    %eax,-0x44(%rbp)
  cmpl   $0x80,-0x44(%rbp)
  je     L75
  cmpl   $0x80,-0x44(%rbp)
  jl     L144
  mov    -0x44(%rbp),%eax
  sub    $0x81,%eax
  cmp    $0x1,%eax
  ja     L144
  jmp    L128
L75:
  movl   $0x82,-0x44(%rbp)
L128:
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <inflateEnd@plt>
  mov    -0x44(%rbp),%eax
  jmp    L64
L144:
  mov    -0x30(%rbp),%eax
  test   %eax,%eax
  je     L92
  mov    D44(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x44(%rbp)
  jne    L132
  jmp    L113
L121:
  nop
L113:
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <inflateEnd@plt>
  mov    D44(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x44(%rbp)
  jne    L97
  mov    D17(%rip),%rax
  mov    (%rax),%eax
  jmp    L64
L97:
  mov    $0x82,%eax
L64:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L98
  call   <__stack_chk_fail@plt>
L98:
  leave
  ret
```

assistant: ```c
int inf(FILE *source) {
  int ret;
  unsigned have;
  z_stream strm;
  static unsigned char in[32768];
  static unsigned char out[32768];
  strm.zalloc = Z_NULL;
  strm.zfree = Z_NULL;
  strm.opaque = Z_NULL;
  strm.avail_in = 0;
  strm.next_in = Z_NULL;
  ret = inflateInit(&strm);
  if (ret != Z_OK)
    return ret;
  do {
    strm.avail_in = fread(in, 1, 32768, source);
    if (ferror(source)) {
      (void)inflateEnd(&strm);
      return Z_ERRNO;
    }
    if (strm.avail_in == 0)
      break;
    strm.next_in = in;
    do {
      strm.avail_out = 32768;
      strm.next_out = out;
      ret = inflate(&strm, Z_NO_FLUSH);
      switch (ret) {
      case Z_NEED_DICT:
        ret = Z_DATA_ERROR;
      case Z_DATA_ERROR:
      case Z_MEM_ERROR:
        (void)inflateEnd(&strm);
        return ret;
      }
    } while (strm.avail_out == 0);
  } while (ret != Z_STREAM_END);
  (void)inflateEnd(&strm);
  return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}
```