user: Demonstrate the C code that generates the assembly output below:

```asm
<test_enumerate>:
  endbr64
  push   %r14
  push   %r13
  mov    %rsi,%r13
  push   %r12
  mov    %rdi,%r12
  lea    D132(%rip),%rdi
  push   %rbp
  sub    $0x8,%rsp
  test   %rsi,%rsi
  lea    D81(%rip),%rsi
  cmovne %r13,%rsi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdi
  call   <udev_enumerate_new@plt>
  test   %rax,%rax
  je     L76
  mov    %r13,%rsi
  mov    %rax,%rbp
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  call   <test_enumerate_print_list@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D126(%rip),%rdi
  call   <puts@plt>
  mov    %r12,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L76
  lea    D43(%rip),%rsi
  mov    %rax,%rdi
  lea    D7(%rip),%r13
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    %rbp,%rdi
  lea    D55(%rip),%r14
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  mov    %r13,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  mov    %r14,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  mov    %r13,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  mov    %r14,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  mov    %r13,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  mov    %r14,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  mov    %r14,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  mov    %r13,%rsi
  call   <udev_enumerate_add_syspath@plt>
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <udev_enumerate_add_syspath@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  call   <test_enumerate_print_list@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D57(%rip),%rdi
  call   <puts@plt>
  mov    %r12,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L76
  lea    D93(%rip),%r13
  mov    %rax,%rdi
  mov    %r13,%rsi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_add_match_is_initialized@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  call   <test_enumerate_print_list@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D0(%rip),%rdi
  call   <puts@plt>
  mov    %r12,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L76
  mov    %r13,%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_nomatch_subsystem@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  call   <test_enumerate_print_list@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D160(%rip),%rdi
  call   <puts@plt>
  mov    %r12,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L76
  lea    D112(%rip),%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    %rbp,%rdi
  lea    D58(%rip),%rsi
  call   <udev_enumerate_add_match_subsystem@plt>
  lea    D89(%rip),%rsi
  mov    %rbp,%rdi
  call   <udev_enumerate_add_match_subsystem@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  call   <test_enumerate_print_list@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D129(%rip),%rdi
  call   <puts@plt>
  mov    %r12,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L76
  mov    %rax,%rdi
  call   <udev_enumerate_scan_subsystems@plt>
  mov    %rbp,%rdi
  call   <test_enumerate_print_list@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_unref@plt>
  lea    D118(%rip),%rdi
  call   <puts@plt>
  mov    %r12,%rdi
  call   <udev_enumerate_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L76
  lea    D91(%rip),%rdx
  lea    D145(%rip),%rsi
  mov    %rax,%rdi
  call   <udev_enumerate_add_match_property@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_scan_devices@plt>
  mov    %rbp,%rdi
  call   <test_enumerate_print_list@plt>
  mov    %rbp,%rdi
  call   <udev_enumerate_unref@plt>
  xor    %eax,%eax
L35:
  add    $0x8,%rsp
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  cs nopw 0x0(%rax,%rax,1)
L76:
  mov    $0xffffffff,%eax
  jmp    L35
```

tool_calls: name: parse_data
arguments: label: D132
type: string
name: parse_data
arguments: label: D81
type: string
name: parse_data
arguments: label: D126
type: string
name: parse_data
arguments: label: D43
type: string
name: parse_data
arguments: label: D7
type: string
name: parse_data
arguments: label: D55
type: string
name: parse_data
arguments: label: D57
type: string
name: parse_data
arguments: label: D93
type: string
name: parse_data
arguments: label: D0
type: string
name: parse_data
arguments: label: D160
type: string
name: parse_data
arguments: label: D112
type: string
name: parse_data
arguments: label: D58
type: string
name: parse_data
arguments: label: D89
type: string
name: parse_data
arguments: label: D129
type: string
name: parse_data
arguments: label: D118
type: string
name: parse_data
arguments: label: D91
type: string
name: parse_data
arguments: label: D145
type: string

tool: D132: enumerate '%s'


tool: D81: <all>

tool: D126: enumerate 'net' + duplicated scan + null + zero

tool: D43: net

tool: D7: /sys/class/mem/zero

tool: D55: /sys/class/mem/null

tool: D57: enumerate 'block'

tool: D93: block

tool: D0: enumerate 'not block'

tool: D160: enumerate 'pci, mem, vc'

tool: D112: pci

tool: D58: mem

tool: D89: vc

tool: D129: enumerate 'subsystem'

tool: D118: enumerate 'property IF_FS_*=filesystem'

tool: D91: filesystem

tool: D145: ID_FS*

assistant: ```c
int test_enumerate(struct udev *udev, const char *subsystem) {
  struct udev_enumerate *udev_enumerate;
  printf("enumerate '%s'\n", subsystem == NULL ? "<all>" : subsystem);
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, subsystem);
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'net' + duplicated scan + null + zero\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, "net");
  udev_enumerate_scan_devices(udev_enumerate);
  udev_enumerate_scan_devices(udev_enumerate);
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'block'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, "block");
  udev_enumerate_add_match_is_initialized(udev_enumerate);
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'not block'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_nomatch_subsystem(udev_enumerate, "block");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'pci, mem, vc'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_subsystem(udev_enumerate, "pci");
  udev_enumerate_add_match_subsystem(udev_enumerate, "mem");
  udev_enumerate_add_match_subsystem(udev_enumerate, "vc");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'subsystem'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_scan_subsystems(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  printf("enumerate 'property IF_FS_*=filesystem'\n");
  udev_enumerate = udev_enumerate_new(udev);
  if (udev_enumerate == NULL)
    return -1;
  udev_enumerate_add_match_property(udev_enumerate, "ID_FS*", "filesystem");
  udev_enumerate_scan_devices(udev_enumerate);
  test_enumerate_print_list(udev_enumerate);
  udev_enumerate_unref(udev_enumerate);
  return 0;
}
```