user: Converte this assembly snippet into its equivalent C code:

```asm
<fig08_04>:
  endbr64
  push   %r15
  mov    $0x25,%edi
  push   %r14
  lea    D95(%rip),%r14
  push   %r13
  mov    %r14,%r15
  push   %r12
  lea    D295(%rip),%r12
  push   %rbp
  lea    D255(%rip),%rbp
  push   %rbx
  mov    %rbp,%r13
  lea    D254(%rip),%rbx
  sub    $0x8,%rsp
  call   <isspace@plt>
  mov    $0x9,%edi
  test   %rax,%rax
  lea    D16(%rip),%rax
  cmove  %rax,%r12
  call   <isspace@plt>
  mov    $0xa,%edi
  test   %rax,%rax
  cmovne %rbx,%r13
  call   <isspace@plt>
  lea    D267(%rip),%r8
  mov    %rbp,%rcx
  push   %r8
  test   %rax,%rax
  lea    D104(%rip),%r9
  lea    D205(%rip),%rsi
  push   %r12
  cmovne %rbx,%rcx
  lea    D48(%rip),%rdi
  xor    %eax,%eax
  push   %r8
  lea    D83(%rip),%r12
  push   %r13
  lea    D53(%rip),%r13
  mov    %r13,%rdx
  call   <printf@plt>
  add    $0x20,%rsp
  mov    $0x24,%edi
  call   <iscntrl@plt>
  mov    $0xa,%edi
  test   %rax,%rax
  cmovne %r12,%r15
  call   <iscntrl@plt>
  mov    %rbp,%rcx
  lea    D45(%rip),%r8
  mov    %r13,%rdx
  test   %rax,%rax
  mov    %r15,%r9
  lea    D143(%rip),%rsi
  cmovne %rbx,%rcx
  sub    $0x8,%rsp
  xor    %eax,%eax
  push   %r8
  lea    D213(%rip),%rdi
  lea    D154(%rip),%r15
  lea    D127(%rip),%r13
  call   <printf@plt>
  mov    $0x23,%edi
  call   <ispunct@plt>
  pop    %rdx
  mov    $0x59,%edi
  pop    %rcx
  test   %rax,%rax
  lea    D92(%rip),%rax
  cmove  %rax,%r15
  call   <ispunct@plt>
  mov    $0x3b,%edi
  test   %rax,%rax
  lea    D0(%rip),%rax
  cmove  %rax,%r13
  call   <ispunct@plt>
  lea    D193(%rip),%rcx
  lea    D124(%rip),%rdx
  push   %rcx
  test   %rax,%rax
  lea    D230(%rip),%rax
  mov    %rcx,%r9
  push   %r15
  cmove  %rax,%rdx
  mov    %r13,%r8
  lea    D87(%rip),%rsi
  lea    D62(%rip),%rdi
  xor    %eax,%eax
  mov    %rbp,%r13
  call   <printf@plt>
  mov    $0x7,%edi
  call   <isprint@plt>
  pop    %rsi
  pop    %rdi
  mov    $0x24,%edi
  test   %rax,%rax
  cmovne %rbx,%r13
  call   <isprint@plt>
  mov    %r14,%rdx
  lea    D314(%rip),%rcx
  test   %rax,%rax
  mov    %r13,%r9
  lea    D222(%rip),%rsi
  cmovne %r12,%rdx
  sub    $0x8,%rsp
  lea    D156(%rip),%r8
  xor    %eax,%eax
  push   %rcx
  lea    D107(%rip),%rdi
  call   <printf@plt>
  mov    $0x20,%edi
  call   <isgraph@plt>
  pop    %r8
  mov    $0x51,%edi
  pop    %r9
  test   %rax,%rax
  cmove  %rbp,%rbx
  call   <isgraph@plt>
  lea    D152(%rip),%rdx
  lea    D114(%rip),%rcx
  test   %rax,%rax
  lea    D180(%rip),%rax
  mov    %rbx,%r9
  cmove  %rax,%rdx
  sub    $0x8,%rsp
  xor    %eax,%eax
  push   %rcx
  lea    D60(%rip),%r8
  lea    D169(%rip),%rsi
  lea    D301(%rip),%rdi
  call   <printf@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: retrieve_data
arguments: data_tag: D95
type_infered: string
name: retrieve_data
arguments: data_tag: D295
type_infered: string
name: retrieve_data
arguments: data_tag: D255
type_infered: string
name: retrieve_data
arguments: data_tag: D254
type_infered: string
name: retrieve_data
arguments: data_tag: D16
type_infered: string
name: retrieve_data
arguments: data_tag: D267
type_infered: string
name: retrieve_data
arguments: data_tag: D104
type_infered: string
name: retrieve_data
arguments: data_tag: D205
type_infered: string
name: retrieve_data
arguments: data_tag: D48
type_infered: string
name: retrieve_data
arguments: data_tag: D83
type_infered: string
name: retrieve_data
arguments: data_tag: D53
type_infered: string
name: retrieve_data
arguments: data_tag: D45
type_infered: string
name: retrieve_data
arguments: data_tag: D143
type_infered: string
name: retrieve_data
arguments: data_tag: D213
type_infered: string
name: retrieve_data
arguments: data_tag: D154
type_infered: string
name: retrieve_data
arguments: data_tag: D127
type_infered: string
name: retrieve_data
arguments: data_tag: D92
type_infered: string
name: retrieve_data
arguments: data_tag: D0
type_infered: string
name: retrieve_data
arguments: data_tag: D193
type_infered: string
name: retrieve_data
arguments: data_tag: D124
type_infered: string
name: retrieve_data
arguments: data_tag: D230
type_infered: string
name: retrieve_data
arguments: data_tag: D87
type_infered: string
name: retrieve_data
arguments: data_tag: D62
type_infered: string
name: retrieve_data
arguments: data_tag: D314
type_infered: string
name: retrieve_data
arguments: data_tag: D222
type_infered: string
name: retrieve_data
arguments: data_tag: D156
type_infered: string
name: retrieve_data
arguments: data_tag: D107
type_infered: string
name: retrieve_data
arguments: data_tag: D152
type_infered: string
name: retrieve_data
arguments: data_tag: D114
type_infered: string
name: retrieve_data
arguments: data_tag: D180
type_infered: string
name: retrieve_data
arguments: data_tag: D60
type_infered: string
name: retrieve_data
arguments: data_tag: D169
type_infered: string
name: retrieve_data
arguments: data_tag: D301
type_infered: string

tool: D95: $ is not a 

tool: D295: % is a 

tool: D255:  is not a 

tool: D254:  is a 

tool: D16: % is not a 

tool: D267: whitespace character

tool: D104: Horizontal tab

tool: D205: According to isspace:

tool: D48: %s
%s%s%s
%s%s%s
%s%s



tool: D83: $ is a 

tool: D53: Newline

tool: D45: control character

tool: D143: According to iscntrl:

tool: D213: %s
%s%s%s
%s%s



tool: D154: # is a 

tool: D127: Y is a 

tool: D92: # is not a 

tool: D0: Y is not a 

tool: D193: punctuation character

tool: D124: ; is a 

tool: D230: ; is not a 

tool: D87: According to ispunct:

tool: D62: %s
%s%s
%s%s
%s%s



tool: D314: printing character

tool: D222: According to isprint:

tool: D156: Alert

tool: D107: %s
%s%s
%s%s%s



tool: D152: Q is a 

tool: D114: printing character other than a space

tool: D180: Q is not a 

tool: D60: Space

tool: D169: According to isgraph:

tool: D301: %s
%s%s
%s%s%s


assistant: ```c
void fig08_04() {
  printf("%s\n%s%s%s\n%s%s%s\n%s%s\n\n", "According to isspace:", "Newline", isspace('\n') ? " is a " : " is not a ", "whitespace character", "Horizontal tab", isspace('\t') ? " is a " : " is not a ", "whitespace character", isspace('%') ? "% is a " : "% is not a ", "whitespace character");
  printf("%s\n%s%s%s\n%s%s\n\n", "According to iscntrl:", "Newline", iscntrl('\n') ? " is a " : " is not a ", "control character", iscntrl('$') ? "$ is a " : "$ is not a ", "control character");
  printf("%s\n%s%s\n%s%s\n%s%s\n\n", "According to ispunct:", ispunct(';') ? "; is a " : "; is not a ", "punctuation character", ispunct('Y') ? "Y is a " : "Y is not a ", "punctuation character", ispunct('#') ? "# is a " : "# is not a ", "punctuation character");
  printf("%s\n%s%s\n%s%s%s\n\n", "According to isprint:", isprint('$') ? "$ is a " : "$ is not a ", "printing character", "Alert", isprint('\a') ? " is a " : " is not a ", "printing character");
  printf("%s\n%s%s\n%s%s%s\n", "According to isgraph:", isgraph('Q') ? "Q is a " : "Q is not a ", "printing character other than a space", "Space", isgraph(' ') ? " is a " : " is not a ", "printing character other than a space");
}
```