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

```asm
<_pst_debug_hexdump>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%r12
  mov    %rsi,%r13
  mov    %rdx,%r14
  cmp    $0xffffffff,%ecx
  mov    $0x1e,%eax
  cmovne %ecx,%eax
  mov    %eax,%ebx
  mov    %eax,0x8(%rsp)
  mov    %rdi,%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
  test   %r14,%r14
  je     L147
  movl   $0x0,0x4(%rsp)
  mov    %ebx,%eax
  sub    $0x1,%eax
  mov    %eax,0xc(%rsp)
  jmp    L9
L16:
  mov    %r12,%rsi
  call   <fputc@plt>
  lea    0x0(%rbp,%rbx,1),%eax
  cmp    %r15,%rbx
  je     L30
  add    $0x1,%rbx
  cmp    %r14,%rbx
  jae    L10
L37:
  movzbl 0x0(%r13,%rbx,1),%edi
  call   <isgraph@plt>
  mov    $0x2e,%edi
  test   %rax,%rax
  je     L16
  movzbl 0x0(%r13,%rbx,1),%edi
  jmp    L16
L30:
  mov    %eax,0x4(%rsp)
L43:
  mov    %r12,%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
  movslq 0x4(%rsp),%rax
  cmp    %r14,%rax
  jae    L147
L9:
  mov    0x4(%rsp),%ebx
  mov    %ebx,%edx
  lea    D22(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  cmpl   $0x0,0x8(%rsp)
  jle    L131
  mov    %ebx,%eax
  cltq
  cmp    %rax,%r14
  jbe    L56
  mov    0xc(%rsp),%r15d
  add    %rax,%r15
  mov    %rax,%rbx
  mov    $0x1,%edx
  sub    %eax,%edx
  mov    %edx,%ebp
L17:
  movzbl 0x0(%r13,%rbx,1),%edx
  lea    D14(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  lea    0x0(%rbp,%rbx,1),%eax
  cmp    %r15,%rbx
  je     L59
  add    $0x1,%rbx
  cmp    %rbx,%r14
  ja     L17
  mov    %eax,%ebp
L25:
  mov    0x8(%rsp),%ebx
L173:
  mov    %r12,%rcx
  mov    $0x3,%edx
  mov    $0x1,%esi
  lea    D17(%rip),%rdi
  call   <fwrite@plt>
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  jg     L173
  mov    %r12,%rsi
  mov    $0x3a,%edi
  call   <fputc@plt>
L26:
  mov    0x4(%rsp),%ecx
  movslq %ecx,%rax
  cmp    %rax,%r14
  jbe    L114
  mov    0xc(%rsp),%r15d
  add    %rax,%r15
  mov    %rax,%rbx
  add    $0x1,%ecx
  mov    %ecx,%ebp
  sub    %eax,%ebp
  jmp    L37
L10:
  mov    %r12,%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
L147:
  mov    %r12,%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L56:
  mov    $0x0,%ebp
  jmp    L25
L114:
  mov    %r12,%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
  jmp    L147
L131:
  mov    %r12,%rsi
  mov    $0x3a,%edi
  call   <fputc@plt>
  jmp    L43
L59:
  mov    %r12,%rsi
  mov    $0x3a,%edi
  call   <fputc@plt>
  jmp    L26
```

tool_calls: name: unpack_data
arguments: data_label: D22
data_type: string
name: unpack_data
arguments: data_label: D14
data_type: string
name: unpack_data
arguments: data_label: D17
data_type: string

tool: D22: %X	:

tool: D14: %02hhx 

tool: D17:    

assistant: ```c
void _pst_debug_hexdump(FILE *out, unsigned char *buf, size_t size, int col) {
  int off = 0, toff;
  int count = 0;
  if (col == -1) {
    col = 30;
  }
  fprintf(out, "\n");
  while (off < size) {
    fprintf(out, "%X\t:", off);
    toff = off;
    while (count < col && off < size) {
      fprintf(out, "%02hhx ", buf[off]);
      off++;
      count++;
    }
    off = toff;
    while (count < col) {
      fprintf(out, "   ");
      count++;
    }
    count = 0;
    fprintf(out, ":");
    while (count < col && off < size) {
      fprintf(out, "%c", isgraph(buf[off]) ? buf[off] : '.');
      off++;
      count++;
    }
    fprintf(out, "\n");
    count = 0;
  }
  fprintf(out, "\n");
}
```