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

```asm
<singSongFor>:
  endbr64
  test   %edi,%edi
  jne    L23
  lea    D55(%rip),%rdi
  jmp    1060 <puts@plt>
  nopl   0x0(%rax)
L23:
  push   %r15
  mov    %edi,%esi
  mov    %edi,%edx
  xor    %eax,%eax
  push   %r14
  lea    D3(%rip),%r14
  push   %r13
  lea    D85(%rip),%r13
  push   %r12
  push   %rbp
  mov    %edi,%ebp
  mov    %r14,%rdi
  push   %rbx
  lea    -0x1(%rbp),%r12d
  sub    $0x8,%rsp
  call   <printf@plt>
  xor    %eax,%eax
  mov    %r12d,%esi
  mov    %r13,%rdi
  call   <printf@plt>
  test   %r12d,%r12d
  jne    L2
  lea    D55(%rip),%rdi
  lea    D61(%rip),%r13
  call   <puts@plt>
L9:
  add    $0x8,%rsp
  mov    %ebp,%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1070 <printf@plt>
  nopw   0x0(%rax,%rax,1)
L2:
  mov    %r12d,%esi
  mov    %r14,%rdi
  xor    %eax,%eax
  mov    %r12d,%edx
  call   <printf@plt>
  lea    -0x2(%rbp),%r15d
  xor    %eax,%eax
  mov    %r13,%rdi
  mov    %r15d,%esi
  call   <printf@plt>
  test   %r15d,%r15d
  je     L65
  mov    %r15d,%esi
  mov    %r14,%rdi
  xor    %eax,%eax
  mov    %r15d,%edx
  call   <printf@plt>
  lea    -0x3(%rbp),%ebx
  xor    %eax,%eax
  mov    %r13,%rdi
  mov    %ebx,%esi
  call   <printf@plt>
  test   %ebx,%ebx
  jne    L20
  lea    D55(%rip),%rdi
  lea    D61(%rip),%r13
  call   <puts@plt>
L53:
  mov    %r15d,%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <printf@plt>
L13:
  mov    %r12d,%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L9
  nopl   0x0(%rax,%rax,1)
L65:
  lea    D55(%rip),%rdi
  lea    D61(%rip),%r13
  call   <puts@plt>
  jmp    L13
  nopl   (%rax)
L20:
  mov    %ebx,%edx
  mov    %ebx,%esi
  mov    %r14,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    -0x4(%rbp),%r14d
  mov    %r13,%rdi
  xor    %eax,%eax
  mov    %r14d,%esi
  lea    D61(%rip),%r13
  call   <printf@plt>
  mov    %r14d,%edi
  call   <singSongFor>
  mov    %ebx,%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L53
```

tool_calls: name: read_data
arguments: data_tag: D55
data_type: string
name: read_data
arguments: data_tag: D3
data_type: string
name: read_data
arguments: data_tag: D85
data_type: string
name: read_data
arguments: data_tag: D61
data_type: string

tool: D55: There are simply no more bottles of coke on the wall.


tool: D3: %d bottles of coke on the wall. %d bottles of coke.


tool: D85: Take one down, pass it around, %d bottles of coke on the wall.



tool: D61: Put a bottle in the reclying, %d empty bottles in the bin.


assistant: ```c
void singSongFor(int numberOfBottles) {
  if (numberOfBottles == 0) {
    printf("There are simply no more bottles of coke on the wall.\n\n");
  } else {
    printf("%d bottles of coke on the wall. %d bottles of coke.\n", numberOfBottles, numberOfBottles);
    int oneFewer = numberOfBottles - 1;
    printf("Take one down, pass it around, %d bottles of coke on the wall.\n\n", oneFewer);
    singSongFor(oneFewer);
    printf("Put a bottle in the reclying, %d empty bottles in the bin.\n", numberOfBottles);
  }
}
```