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

```asm
<readNumOfBytes>:
  endbr64
  push   %r13
  xor    %eax,%eax
  mov    %rdi,%r13
  lea    D95(%rip),%rdi
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    D27(%rip),%edx
  call   <printf@plt>
  test   %r12d,%r12d
  jg     L28
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax,%rax,1)
L28:
  mov    %r12d,%edi
  call   <malloc@plt>
  mov    %rax,%rbp
  test   %r13,%r13
  je     L18
  mov    %rax,%rdi
  mov    %r13,%rcx
  mov    %r12d,%edx
  mov    $0x1,%esi
  call   <fread@plt>
  mov    %r13,%rdi
  call   <feof@plt>
  test   %rax,%rax
  jne    L76
L89:
  xor    %ebx,%ebx
  lea    D65(%rip),%r13
  jmp    L105
  nop
L41:
  add    $0x1,%rbp
  cmp    %r12d,%ebx
  jge    L46
L105:
  movzbl 0x0(%rbp),%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  add    $0x1,%ebx
  call   <printf@plt>
  imul   $0xcccccccd,%ebx,%edx
  ror    %edx
  cmp    $0x19999999,%edx
  ja     L41
  mov    $0xa,%edi
  add    $0x1,%rbp
  call   <putchar@plt>
  cmp    %r12d,%ebx
  jl     L105
L46:
  lea    D5(%rip),%rdi
  call   <puts@plt>
  add    %r12d,D87(%rip)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax,%rax,1)
L76:
  mov    %r13,%rdi
  call   <ftell@plt>
  cmp    %eax,D87(%rip)
  mov    %eax,%ebx
  jl     L20
  lea    D87(%rip),%rdi
  xor    %r12d,%r12d
  call   <puts@plt>
  jmp    L46
  nopl   0x0(%rax,%rax,1)
L18:
  add    $0x8,%rsp
  lea    D42(%rip),%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    10c0 <puts@plt>
  xchg   %ax,%ax
L20:
  mov    %r12d,%esi
  lea    D96(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D13(%rip),%rdi
  call   <puts@plt>
  sub    D87(%rip),%ebx
  mov    %ebx,%r12d
  test   %ebx,%ebx
  jg     L89
  jmp    L46
```

tool_calls: name: disassemble_data
arguments: label: D95
type_guessed: string
name: disassemble_data
arguments: label: D65
type_guessed: string
name: disassemble_data
arguments: label: D5
type_guessed: string
name: disassemble_data
arguments: label: D87
type_guessed: string
name: disassemble_data
arguments: label: D42
type_guessed: string
name: disassemble_data
arguments: label: D96
type_guessed: string
name: disassemble_data
arguments: label: D13
type_guessed: string

tool: D95: First entering funcall:
size = %d
bytesRead = %d


tool: D65: %02x 

tool: D5: 



tool: D87: 
Error: File ran out of data!

tool: D42: Sorry, file does not exist!


tool: D96: Sorry, there was less than %d bytes of data in the file!


tool: D13: The size was adjusted accordingly...


assistant: ```c
void readNumOfBytes(FILE *fp, int size, unsigned char *p_buffer) {
  static int bytesRead = 0;
  int flag = 0;
  int oldSize = 0;
  printf("First entering funcall:\nsize = %d\nbytesRead = %d\n", size, bytesRead);
  if (size > 0) {
    p_buffer = (unsigned char *)malloc(sizeof(unsigned char) * size);
    if (fp == NULL)
      printf("Sorry, file does not exist!\n\n");
    else {
      fread(p_buffer, 1, size, fp);
      if (feof(fp)) {
        oldSize = size;
        size = ftell(fp);
        flag = 1;
      }
      if (flag) {
        if (bytesRead >= size) {
          size = 0;
          printf("\nError: File ran out of data!\n");
        } else {
          printf("Sorry, there was less than %d bytes of data in the file!\n", oldSize);
          printf("The size was adjusted accordingly...\n\n");
          size -= bytesRead;
        }
      }
      for (int i = 0; i < size && i >= 0; i++) {
        printf("%02x ", p_buffer[i]);
        if (!((i + 1) % 10))
          printf("\n");
      }
      printf("\n\n\n");
      bytesRead += size;
    }
  }
}
```