user: Please show me the C implementation that matches the assembly code listed below:

```asm
<op_skimp_usage>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    %rdx,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L0
  lea    D7(%rip),%rax
  mov    %rax,-0x18(%rbp)
L0:
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D16(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D36(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D56(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D48(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D73(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D71(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D72(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D21(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rdx
  mov    -0x10(%rbp),%rcx
  mov    -0x8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <op_clump_usage_args@plt>
  nop
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D7
type_guessed: string
name: unpack_data
arguments: data_label: D16
type_guessed: string
name: unpack_data
arguments: data_label: D36
type_guessed: string
name: unpack_data
arguments: data_label: D56
type_guessed: string
name: unpack_data
arguments: data_label: D48
type_guessed: string
name: unpack_data
arguments: data_label: D73
type_guessed: string
name: unpack_data
arguments: data_label: D71
type_guessed: string
name: unpack_data
arguments: data_label: D72
type_guessed: string
name: unpack_data
arguments: data_label: D21
type_guessed: string

tool: 

tool: D16: %sFind intervals with an average below some threshold. Bases in such


tool: D36: %sintervals are replaced with 1s; other bases with 0s.


tool: D56: %s


tool: D48: %sGiven length L and threshold T, we identify intervals with length at least L


tool: D73: %ssuch that the average over that interval is no more than T.  After


tool: D71: %sidentifying such intervals, the ends are then trimmed to remove signal higher


tool: D72: %sthan T (since these are only increasing the average).  Thus the resulting


tool: D21: %sintervals (actually runs of 1 rather than intervals) may be shorter than L.


assistant: ```c
void op_skimp_usage(char *name, FILE *f, char *indent) {
  if (indent == NULL)
    indent = "";
  fprintf(f, "%sFind intervals with an average below some threshold. Bases in such\n", indent);
  fprintf(f, "%sintervals are replaced with 1s; other bases with 0s.\n", indent);
  fprintf(f, "%s\n", indent);
  fprintf(f, "%sGiven length L and threshold T, we identify intervals with length at least L\n", indent);
  fprintf(f, "%ssuch that the average over that interval is no more than T.  After\n", indent);
  fprintf(f, "%sidentifying such intervals, the ends are then trimmed to remove signal higher\n", indent);
  fprintf(f, "%sthan T (since these are only increasing the average).  Thus the resulting\n", indent);
  fprintf(f, "%sintervals (actually runs of 1 rather than intervals) may be shorter than L.\n", indent);
  op_clump_usage_args(name, f, indent);
}
```