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

```asm
<print_device>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbp
  mov    %rdi,%rsi
  lea    D84(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <udev_device_get_action@plt>
  test   %rax,%rax
  je     L128
  mov    %rax,%rsi
  lea    D128(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L128:
  mov    %rbp,%rdi
  call   <udev_device_get_syspath@plt>
  mov    %rax,%rsi
  lea    D7(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <udev_device_get_sysname@plt>
  mov    %rax,%rsi
  lea    D19(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <udev_device_get_sysnum@plt>
  test   %rax,%rax
  je     L165
  mov    %rax,%rsi
  lea    D109(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L165:
  mov    %rbp,%rdi
  call   <udev_device_get_devpath@plt>
  mov    %rax,%rsi
  lea    D130(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <udev_device_get_subsystem@plt>
  test   %rax,%rax
  je     L20
  mov    %rax,%rsi
  lea    D165(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L20:
  mov    %rbp,%rdi
  call   <udev_device_get_devtype@plt>
  test   %rax,%rax
  je     L162
  mov    %rax,%rsi
  lea    D3(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L162:
  mov    %rbp,%rdi
  call   <udev_device_get_driver@plt>
  test   %rax,%rax
  je     L113
  mov    %rax,%rsi
  lea    D26(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L113:
  mov    %rbp,%rdi
  call   <udev_device_get_devnode@plt>
  test   %rax,%rax
  je     L156
  mov    %rax,%rsi
  lea    D58(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L156:
  mov    %rbp,%rdi
  call   <udev_device_get_devnum@plt>
  mov    %eax,%ebx
  mov    %eax,%edi
  call   <major@plt>
  test   %eax,%eax
  jg     L59
L109:
  mov    %rbp,%rdi
  call   <udev_device_get_devlinks_list_entry@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L87
  mov    $0x0,%r12d
  lea    D95(%rip),%r13
L95:
  mov    %rbx,%rdi
  call   <udev_list_entry_get_name@plt>
  mov    %rax,%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x1,%r12d
  mov    %rbx,%rdi
  call   <udev_list_entry_get_next@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  jne    L95
  test   %r12d,%r12d
  jg     L64
L87:
  mov    %rbp,%rdi
  call   <udev_device_get_properties_list_entry@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L157
  mov    $0x0,%r13d
  lea    D44(%rip),%r14
L54:
  mov    %rbx,%rdi
  call   <udev_list_entry_get_value@plt>
  mov    %rax,%r12
  mov    %rbx,%rdi
  call   <udev_list_entry_get_name@plt>
  mov    %rax,%rsi
  mov    %r12,%rdx
  mov    %r14,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x1,%r13d
  mov    %rbx,%rdi
  call   <udev_list_entry_get_next@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  jne    L54
  test   %r13d,%r13d
  jg     L108
L157:
  lea    D183(%rip),%rsi
  mov    %rbp,%rdi
  call   <udev_device_get_property_value@plt>
  test   %rax,%rax
  je     L139
  mov    %rax,%rsi
  lea    D24(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L139:
  lea    D11(%rip),%rsi
  mov    %rbp,%rdi
  call   <udev_device_get_sysattr_value@plt>
  test   %rax,%rax
  je     L52
  mov    %rax,%rsi
  lea    D35(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L52:
  mov    $0xa,%edi
  call   <putchar@plt>
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L59:
  mov    %ebx,%edi
  call   <minor@plt>
  mov    %eax,%r12d
  mov    %ebx,%edi
  call   <major@plt>
  mov    %eax,%esi
  mov    %r12d,%edx
  lea    D1(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L109
L64:
  mov    %r12d,%esi
  lea    D162(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L87
L108:
  mov    %r13d,%esi
  lea    D142(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L157
```

tool_calls: name: disassemble_data
arguments: tag: D84
type_infered: string
name: disassemble_data
arguments: tag: D128
type_infered: string
name: disassemble_data
arguments: tag: D7
type_infered: string
name: disassemble_data
arguments: tag: D19
type_infered: string
name: disassemble_data
arguments: tag: D109
type_infered: string
name: disassemble_data
arguments: tag: D130
type_infered: string
name: disassemble_data
arguments: tag: D165
type_infered: string
name: disassemble_data
arguments: tag: D3
type_infered: string
name: disassemble_data
arguments: tag: D26
type_infered: string
name: disassemble_data
arguments: tag: D58
type_infered: string
name: disassemble_data
arguments: tag: D95
type_infered: string
name: disassemble_data
arguments: tag: D44
type_infered: string
name: disassemble_data
arguments: tag: D183
type_infered: string
name: disassemble_data
arguments: tag: D24
type_infered: string
name: disassemble_data
arguments: tag: D11
type_infered: string
name: disassemble_data
arguments: tag: D35
type_infered: string
name: disassemble_data
arguments: tag: D1
type_infered: string
name: disassemble_data
arguments: tag: D162
type_infered: string
name: disassemble_data
arguments: tag: D142
type_infered: string

tool: D84: *** device: %p ***


tool: D128: action:    '%s'


tool: D7: syspath:   '%s'


tool: D19: sysname:   '%s'


tool: D109: sysnum:    '%s'


tool: D130: devpath:   '%s'


tool: D165: subsystem: '%s'


tool: D3: devtype:   '%s'


tool: D26: driver:    '%s'


tool: D58: devname:   '%s'


tool: D95: link:      '%s'


tool: D44: property:  '%s=%s'


tool: D183: MAJOR

tool: D24: MAJOR: '%s'


tool: D11: dev

tool: D35: attr{dev}: '%s'


tool: D1: devnum:    %u:%u


tool: D162: found %i links


tool: D142: found %i properties


assistant: ```c
void print_device(struct udev_device *device) {
  const char *str;
  dev_t devnum;
  int count;
  struct udev_list_entry *list_entry;
  printf("*** device: %p ***\n", device);
  str = udev_device_get_action(device);
  if (str != NULL)
    printf("action:    '%s'\n", str);
  str = udev_device_get_syspath(device);
  printf("syspath:   '%s'\n", str);
  str = udev_device_get_sysname(device);
  printf("sysname:   '%s'\n", str);
  str = udev_device_get_sysnum(device);
  if (str != NULL)
    printf("sysnum:    '%s'\n", str);
  str = udev_device_get_devpath(device);
  printf("devpath:   '%s'\n", str);
  str = udev_device_get_subsystem(device);
  if (str != NULL)
    printf("subsystem: '%s'\n", str);
  str = udev_device_get_devtype(device);
  if (str != NULL)
    printf("devtype:   '%s'\n", str);
  str = udev_device_get_driver(device);
  if (str != NULL)
    printf("driver:    '%s'\n", str);
  str = udev_device_get_devnode(device);
  if (str != NULL)
    printf("devname:   '%s'\n", str);
  devnum = udev_device_get_devnum(device);
  if (major(devnum) > 0)
    printf("devnum:    %u:%u\n", major(devnum), minor(devnum));
  count = 0;
  for (list_entry = udev_device_get_devlinks_list_entry(device); list_entry != NULL; list_entry = udev_list_entry_get_next(list_entry)) {
    printf("link:      '%s'\n", udev_list_entry_get_name(list_entry));
    count++;
  }
  if (count > 0)
    printf("found %i links\n", count);
  count = 0;
  for (list_entry = udev_device_get_properties_list_entry(device); list_entry != NULL; list_entry = udev_list_entry_get_next(list_entry)) {
    printf("property:  '%s=%s'\n", udev_list_entry_get_name(list_entry), udev_list_entry_get_value(list_entry));
    count++;
  }
  if (count > 0)
    printf("found %i properties\n", count);
  str = udev_device_get_property_value(device, "MAJOR");
  if (str != NULL)
    printf("MAJOR: '%s'\n", str);
  str = udev_device_get_sysattr_value(device, "dev");
  if (str != NULL)
    printf("attr{dev}: '%s'\n", str);
  printf("\n");
}
```