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

```asm
<print_elf_arm_attrs>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  test   %esi,%esi
  jle    L25
  lea    0x10(%rsp),%rax
  movslq %esi,%r12
  xor    %r14d,%r14d
  xor    %r15d,%r15d
  mov    %rax,0x8(%rsp)
  lea    D35(%rip),%r13
  nopw   0x0(%rax,%rax,1)
L60:
  test   $0xf,%r14b
  je     L27
L9:
  movslq %r15d,%rbx
  add    $0x1,%r15d
L108:
  movzbl 0x0(%rbp,%r14,1),%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  movzbl 0x0(%rbp,%r14,1),%eax
  lea    -0x30(%rax),%esi
  cmp    $0x47,%sil
  ja     L71
  add    $0x1,%r14
  mov    %al,0x10(%rsp,%rbx,1)
  cmp    %r12,%r14
  jne    L60
L36:
  mov    0x8(%rsp),%rsi
  movslq %r15d,%rcx
  lea    D10(%rip),%rdi
  xor    %eax,%eax
  movb   $0x0,0x10(%rsp,%rcx,1)
  call   <printf@plt>
  movzbl 0x0(%rbp),%esi
  lea    D57(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x1(%rbp),%esi
  lea    D45(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D5(%rip),%rdi
  xor    %eax,%eax
  lea    0x5(%rbp),%rsi
  call   <printf@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L37
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L71:
  add    $0x1,%r14
  movb   $0x2e,0x10(%rsp,%rbx,1)
  cmp    %r12,%r14
  je     L36
  test   $0xf,%r14b
  jne    L9
L27:
  test   %r15d,%r15d
  jne    L24
L4:
  mov    $0xa,%edi
  mov    $0x1,%r15d
  xor    %ebx,%ebx
  call   <putchar@plt>
  jmp    L108
  nopl   0x0(%rax,%rax,1)
L24:
  mov    0x8(%rsp),%rsi
  movslq %r15d,%rcx
  lea    D48(%rip),%rdi
  xor    %eax,%eax
  movb   $0x0,0x10(%rsp,%rcx,1)
  call   <printf@plt>
  jmp    L4
  nopl   (%rax)
L25:
  lea    0x10(%rsp),%rax
  xor    %r15d,%r15d
  mov    %rax,0x8(%rsp)
  jmp    L36
L37:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D35
datatype: string
name: disassemble_data
arguments: tag: D10
datatype: string
name: disassemble_data
arguments: tag: D57
datatype: string
name: disassemble_data
arguments: tag: D45
datatype: string
name: disassemble_data
arguments: tag: D5
datatype: string
name: disassemble_data
arguments: tag: D48
datatype: string

tool: D35:  %02x

tool: D10:   %s



tool: D57:    Version: %c


tool: D45:       Size: %d


tool: D5: VendorName: %s


tool: D48:   %s

assistant: ```c
void print_elf_arm_attrs(unsigned char *attrs, int sh_size) {
  int n;
  char text[17];
  int ptr;
  ptr = 0;
  for (n = 0; n < sh_size; n++) {
    if ((n % 16) == 0) {
      if (ptr != 0) {
        text[ptr] = 0;
        printf("  %s", text);
        ptr = 0;
      }
      printf("\n");
    }
    printf(" %02x", attrs[n]);
    if (attrs[n] >= 48 && attrs[n] < 120) {
      text[ptr++] = attrs[n];
    } else {
      text[ptr++] = '.';
    }
  }
  text[ptr] = 0;
  printf("  %s\n\n", text);
  printf("   Version: %c\n", attrs[0]);
  printf("      Size: %d\n", attrs[1] | (attrs[2] << 8) | (attrs[3] << 16) | (attrs[4] << 24));
  printf("VendorName: %s\n", attrs + 5);
  printf("\n");
}
```