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

```asm
<make_wav_header>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    %ecx,-0x24(%rbp)
  mov    -0x1c(%rbp),%eax
  imul   -0x24(%rbp),%eax
  add    %eax,%eax
  cltq
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    $0x4,%edx
  lea    D15(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x8(%rbp),%rax
  add    $0x24,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <put_32bitLE@plt>
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  mov    $0x4,%edx
  lea    D10(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x18(%rbp),%rax
  add    $0x30,%rax
  mov    $0x4,%edx
  lea    D1(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x18(%rbp),%rax
  add    $0x40,%rax
  mov    $0x10,%esi
  mov    %rax,%rdi
  call   <put_32bitLE@plt>
  mov    -0x18(%rbp),%rax
  add    $0x50,%rax
  mov    $0x1,%esi
  mov    %rax,%rdi
  call   <put_16bitLE@plt>
  mov    -0x18(%rbp),%rax
  lea    0x58(%rax),%rdx
  mov    -0x24(%rbp),%eax
  mov    %eax,%esi
  mov    %rdx,%rdi
  call   <put_16bitLE@plt>
  mov    -0x18(%rbp),%rax
  lea    0x60(%rax),%rdx
  mov    -0x20(%rbp),%eax
  mov    %eax,%esi
  mov    %rdx,%rdi
  call   <put_32bitLE@plt>
  mov    -0x20(%rbp),%eax
  imul   -0x24(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x18(%rbp),%rax
  add    $0x70,%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <put_32bitLE@plt>
  mov    -0x24(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x18(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <put_16bitLE@plt>
  mov    -0x18(%rbp),%rax
  add    $0x88,%rax
  mov    $0x10,%esi
  mov    %rax,%rdi
  call   <put_16bitLE@plt>
  mov    -0x18(%rbp),%rax
  add    $0x90,%rax
  mov    $0x4,%edx
  lea    D20(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x8(%rbp),%rax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xa0,%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <put_32bitLE@plt>
  nop
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D15
datatype: string
name: disassemble_data
arguments: label: D10
datatype: string
name: disassemble_data
arguments: label: D1
datatype: string
name: disassemble_data
arguments: label: D20
datatype: string

tool: D15: RIFF

tool: D10: WAVE

tool: D1: fmt 

tool: D20: data

assistant: ```c
void make_wav_header(uint8_t *buf, int32_t sample_count, int32_t sample_rate, int channels) {
  size_t bytecount;
  bytecount = sample_count * channels * 2;
  memcpy(buf + 0, "RIFF", 4);
  put_32bitLE(buf + 4, (int32_t)(bytecount + 0x2c - 8));
  memcpy(buf + 8, "WAVE", 4);
  memcpy(buf + 0xc, "fmt ", 4);
  put_32bitLE(buf + 0x10, 0x10);
  put_16bitLE(buf + 0x14, 1);
  put_16bitLE(buf + 0x16, channels);
  put_32bitLE(buf + 0x18, sample_rate);
  put_32bitLE(buf + 0x1c, sample_rate * channels * 2);
  put_16bitLE(buf + 0x20, (int16_t)(channels * 2));
  put_16bitLE(buf + 0x22, 2 * 8);
  memcpy(buf + 0x24, "data", 4);
  put_32bitLE(buf + 0x28, (int32_t)bytecount);
}
```