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

```asm
<print_data>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,0x10(%rsp)
  test   %esi,%esi
  jle    L178
  mov    %esi,%r13d
  mov    %rdi,%rbp
  mov    $0x0,%ebx
  lea    D0(%rip),%r14
  lea    -0x1(%rsi),%r15d
  jmp    L117
L52:
  mov    $0x2e,%edi
  call   <putchar@plt>
L141:
  add    $0x1,%r12
  cmp    %rbp,%r12
  je     L139
L38:
  movzbl (%r12),%edi
  lea    -0x20(%rdi),%eax
  cmp    $0x60,%al
  ja     L52
  movzbl %dil,%edi
  call   <putchar@plt>
  jmp    L141
L139:
  mov    $0xa,%edi
  call   <putchar@plt>
L109:
  mov    %r14,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L2:
  movzbl 0x0(%rbp),%esi
  lea    D17(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  cmp    %ebx,%r15d
  je     L88
L160:
  add    $0x1,%ebx
  add    $0x1,%rbp
  cmp    %ebx,%r13d
  je     L178
L117:
  test   %ebx,%ebx
  je     L109
  test   $0xf,%bl
  jne    L2
  lea    D24(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x10(%rbp),%r12
  jmp    L38
L88:
  mov    %ebx,%eax
  sar    $0x1f,%eax
  shr    $0x1c,%eax
  lea    (%rbx,%rax,1),%edx
  and    $0xf,%edx
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    %ecx,0x1c(%rsp)
  mov    $0xf,%eax
  sub    %ecx,%eax
  mov    %eax,0x8(%rsp)
  test   %eax,%eax
  jle    L114
  mov    $0x0,%r12d
L48:
  mov    %r14,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x1,%r12d
  cmp    0x8(%rsp),%r12d
  jne    L48
L114:
  lea    D24(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebx,%eax
  mov    0x1c(%rsp),%ecx
  sub    %ecx,%eax
  cmp    %ebx,%eax
  jg     L82
  cltq
  mov    0x10(%rsp),%rdx
  lea    (%rdx,%rax,1),%r12
  lea    0x1(%rdx,%rax,1),%rdx
  mov    %ecx,%eax
  add    %rdx,%rax
  mov    %rax,0x8(%rsp)
  jmp    L15
L149:
  mov    $0x2e,%edi
  call   <putchar@plt>
L56:
  add    $0x1,%r12
  cmp    %r12,0x8(%rsp)
  je     L82
L15:
  movzbl (%r12),%edi
  lea    -0x20(%rdi),%eax
  cmp    $0x60,%al
  ja     L149
  movzbl %dil,%edi
  call   <putchar@plt>
  jmp    L56
L82:
  mov    $0xa,%edi
  call   <putchar@plt>
  jmp    L160
L178:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D0
data_type: string
name: disassemble_data
arguments: data_tag: D17
data_type: string
name: disassemble_data
arguments: data_tag: D24
data_type: string

tool: D0:    

tool: D17:  %02x

tool: D24:          

assistant: ```c
void print_data(unsigned char *data, int size) {
  int i, j;
  for (i = 0; i < size; i++) {
    if ((i != 0) && (i % 16 == 0)) {
      printf("         ");
      for (j = i - 16; j < i; j++) {
        if (data[j] >= 32 && data[j] <= 128)
          printf("%c", (unsigned char)data[j]);
        else
          printf(".");
      }
      printf("\n");
    }
    if (i % 16 == 0)
      printf("   ");
    printf(" %02x", (unsigned int)data[i]);
    if (i == size - 1) {
      for (j = 0; j < 15 - i % 16; j++)
        printf("   ");
      printf("         ");
      for (j = i - i % 16; j <= i; j++) {
        if (data[j] >= 32 && data[j] <= 128)
          printf("%c", (unsigned char)data[j]);
        else
          printf(".");
      }
      printf("\n");
    }
  }
}
```