user: What would the C source look like for the assembly code provided here?

```asm
<lnp_hexdump>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %edx,0x4(%rsp)
  test   %edx,%edx
  je     L489
  mov    %edx,(%rsp)
  mov    %rsi,%rbx
  lea    D36(%rip),%r15
  lea    D14(%rip),%r14
  nopw   0x0(%rax,%rax,1)
L371:
  mov    (%rsp),%eax
  mov    0x4(%rsp),%r12d
  mov    $0x10,%ebp
  sub    %eax,%r12d
  cmp    %ebp,%eax
  cmovbe %rax,%rbp
  mov    0x8(%rsp),%rax
  test   %rax,%rax
  je     L119
  mov    %rax,%rsi
  lea    D35(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L119:
  mov    %r12d,%esi
  lea    D19(%rip),%rdi
  xor    %eax,%eax
  xor    %r13d,%r13d
  call   <printf@plt>
  jmp    L306
  nopw   0x0(%rax,%rax,1)
L514:
  movzbl (%rbx),%esi
  mov    %r14,%rdi
  xor    %eax,%eax
  lea    0x1(%rbx),%r12
  mov    %r12,%rbx
  call   <printf@plt>
  mov    %r13d,%eax
  and    $0x7,%eax
  cmp    $0x7,%eax
  je     L387
L237:
  add    $0x1,%r13d
  cmp    $0x10,%r13d
  je     L223
L306:
  cmp    %r13d,%ebp
  ja     L514
  mov    %r15,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r13d,%eax
  and    $0x7,%eax
  cmp    $0x7,%eax
  jne    L237
L387:
  mov    $0x20,%edi
  add    $0x1,%r13d
  call   <putchar@plt>
  cmp    $0x10,%r13d
  jne    L306
L223:
  mov    $0x20,%edi
  sub    %rbp,%rbx
  call   <putchar@plt>
  movzbl (%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  je     L123
  movzbl (%rbx),%edi
  call   <putchar@plt>
  cmpl   $0x1,(%rsp)
  jne    L457
  nop
L182:
  mov    $0xa,%edi
  add    $0x10,%rbx
  call   <putchar@plt>
  mov    0x4(%rsp),%ecx
  subl   $0x10,(%rsp)
  mov    (%rsp),%eax
  mov    %ecx,%edx
  sub    %eax,%edx
  cmp    %edx,%ecx
  ja     L371
L489:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L123:
  mov    $0x2e,%edi
  call   <putchar@plt>
  cmpl   $0x1,(%rsp)
  je     L182
L457:
  movzbl 0x1(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L295
  mov    $0x2e,%edi
L381:
  call   <putchar@plt>
  cmpl   $0x2,(%rsp)
  je     L182
  movzbl 0x2(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L561
  mov    $0x2e,%edi
L548:
  call   <putchar@plt>
  cmpl   $0x3,(%rsp)
  je     L182
  movzbl 0x3(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L366
  mov    $0x2e,%edi
L158:
  call   <putchar@plt>
  cmpl   $0x4,(%rsp)
  je     L182
  movzbl 0x4(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L241
  mov    $0x2e,%edi
L533:
  call   <putchar@plt>
  cmpl   $0x5,(%rsp)
  je     L182
  movzbl 0x5(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L28
  mov    $0x2e,%edi
L462:
  call   <putchar@plt>
  cmpl   $0x6,(%rsp)
  je     L182
  movzbl 0x6(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L197
  mov    $0x2e,%edi
L558:
  call   <putchar@plt>
  cmpl   $0x7,(%rsp)
  je     L182
  movzbl 0x7(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L109
  mov    $0x2e,%edi
L497:
  call   <putchar@plt>
  cmpl   $0x8,(%rsp)
  je     L182
  movzbl 0x8(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L231
  mov    $0x2e,%edi
L564:
  call   <putchar@plt>
  cmpl   $0x9,(%rsp)
  je     L182
  movzbl 0x9(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L526
  mov    $0x2e,%edi
L81:
  call   <putchar@plt>
  cmpl   $0xa,(%rsp)
  je     L182
  movzbl 0xa(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L13
  mov    $0x2e,%edi
L216:
  call   <putchar@plt>
  cmpl   $0xb,(%rsp)
  je     L182
  movzbl 0xb(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L412
  mov    $0x2e,%edi
L27:
  call   <putchar@plt>
  cmpl   $0xc,(%rsp)
  je     L182
  movzbl 0xc(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L7
  mov    $0x2e,%edi
L257:
  call   <putchar@plt>
  cmpl   $0xd,(%rsp)
  je     L182
  movzbl 0xd(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L195
  mov    $0x2e,%edi
L292:
  call   <putchar@plt>
  cmpl   $0xe,(%rsp)
  je     L182
  movzbl 0xe(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L464
  mov    $0x2e,%edi
L501:
  call   <putchar@plt>
  cmpl   $0xf,(%rsp)
  je     L182
  movzbl 0xf(%rbx),%edi
  call   <isprint@plt>
  test   %rax,%rax
  jne    L433
  mov    $0x2e,%edi
L541:
  call   <putchar@plt>
  jmp    L182
L295:
  movzbl 0x1(%rbx),%edi
  jmp    L381
L433:
  movzbl 0xf(%rbx),%edi
  jmp    L541
L464:
  movzbl 0xe(%rbx),%edi
  jmp    L501
L195:
  movzbl 0xd(%rbx),%edi
  jmp    L292
L7:
  movzbl 0xc(%rbx),%edi
  jmp    L257
L412:
  movzbl 0xb(%rbx),%edi
  jmp    L27
L13:
  movzbl 0xa(%rbx),%edi
  jmp    L216
L526:
  movzbl 0x9(%rbx),%edi
  jmp    L81
L231:
  movzbl 0x8(%rbx),%edi
  jmp    L564
L109:
  movzbl 0x7(%rbx),%edi
  jmp    L497
L197:
  movzbl 0x6(%rbx),%edi
  jmp    L558
L28:
  movzbl 0x5(%rbx),%edi
  jmp    L462
L241:
  movzbl 0x4(%rbx),%edi
  jmp    L533
L366:
  movzbl 0x3(%rbx),%edi
  jmp    L158
L561:
  movzbl 0x2(%rbx),%edi
  jmp    L548
```

tool_calls: name: parse_data
arguments: label: D36
data_type: string
name: parse_data
arguments: label: D14
data_type: string
name: parse_data
arguments: label: D35
data_type: string
name: parse_data
arguments: label: D19
data_type: string

tool: D36:    

tool: D14:  %d

tool: D35: %s 

tool: D19: %04d 

assistant: ```c
void lnp_hexdump(char *prefix, void *data, unsigned length) {
  unsigned offset;
  unsigned char *dataptr = (unsigned char *)data;
  unsigned linesize, lineindex;
  for (offset = 0; offset < length; offset += 16) {
    linesize = (length - offset < 16) ? (length - offset) : 16;
    if (prefix)
      printf("%s ", prefix);
    printf("%04d ", offset);
    for (lineindex = 0; lineindex < 16; lineindex++) {
      if (lineindex < linesize)
        printf(" %d", *(dataptr++));
      else if (1)
        printf("   ");
      if ((lineindex % 8) == (8 - 1))
        printf(" ");
    }
    if (1) {
      printf(" ");
      dataptr -= linesize;
      for (lineindex = 0; lineindex < 16; lineindex++) {
        if (lineindex < linesize)
          printf("%c", (isprint(*dataptr)) ? (*dataptr) : '.');
        dataptr++;
      }
    }
    printf("\n");
  }
}
```