user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    $0x23,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  lea    D382(%rip),%rbx
  lea    D3(%rip),%rax
  cmove  %rax,%rbx
  mov    $0x38,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  lea    D10(%rip),%rdx
  lea    D243(%rip),%rax
  cmove  %rax,%rdx
  lea    D116(%rip),%r9
  mov    %rbx,%r8
  mov    %r9,%rcx
  lea    D310(%rip),%rsi
  lea    D8(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x34,%edi
  call   <isalpha@plt>
  test   %rax,%rax
  lea    D386(%rip),%r12
  lea    D328(%rip),%rax
  cmove  %rax,%r12
  mov    $0x26,%edi
  call   <isalpha@plt>
  test   %rax,%rax
  lea    D62(%rip),%rbp
  lea    D377(%rip),%rax
  cmove  %rax,%rbp
  mov    $0x62,%edi
  call   <isalpha@plt>
  test   %rax,%rax
  lea    D106(%rip),%rbx
  lea    D342(%rip),%rax
  cmove  %rax,%rbx
  mov    $0x41,%edi
  call   <isalpha@plt>
  test   %rax,%rax
  lea    D175(%rip),%rdx
  lea    D317(%rip),%rax
  cmove  %rax,%rdx
  lea    D374(%rip),%rcx
  push   %rcx
  push   %r12
  push   %rcx
  push   %rbp
  mov    %rcx,%r9
  mov    %rbx,%r8
  lea    D168(%rip),%rsi
  lea    D355(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x20,%rsp
  mov    $0x23,%edi
  call   <isalnum@plt>
  test   %rax,%rax
  lea    D382(%rip),%rbp
  lea    D3(%rip),%rax
  cmove  %rax,%rbp
  mov    $0x38,%edi
  call   <isalnum@plt>
  test   %rax,%rax
  lea    D10(%rip),%rbx
  lea    D243(%rip),%rax
  cmove  %rax,%rbx
  mov    $0x41,%edi
  call   <isalnum@plt>
  test   %rax,%rax
  lea    D175(%rip),%rdx
  lea    D317(%rip),%rax
  cmove  %rax,%rdx
  lea    D336(%rip),%rcx
  push   %rcx
  push   %rbp
  mov    %rcx,%r9
  mov    %rbx,%r8
  lea    D197(%rip),%rsi
  lea    D86(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x66,%edi
  call   <isxdigit@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  lea    D253(%rip),%r13
  lea    D314(%rip),%rax
  cmove  %rax,%r13
  mov    $0x24,%edi
  call   <isxdigit@plt>
  test   %rax,%rax
  lea    D270(%rip),%r12
  lea    D323(%rip),%rax
  cmove  %rax,%r12
  mov    $0x37,%edi
  call   <isxdigit@plt>
  test   %rax,%rax
  lea    D358(%rip),%rbp
  lea    D366(%rip),%rax
  cmove  %rax,%rbp
  mov    $0x4a,%edi
  call   <isxdigit@plt>
  test   %rax,%rax
  lea    D204(%rip),%rbx
  lea    D80(%rip),%rax
  cmove  %rax,%rbx
  mov    $0x46,%edi
  call   <isxdigit@plt>
  test   %rax,%rax
  lea    D265(%rip),%rdx
  lea    D283(%rip),%rax
  cmove  %rax,%rdx
  lea    D125(%rip),%rcx
  push   %rcx
  push   %r13
  push   %rcx
  push   %r12
  push   %rcx
  push   %rbp
  mov    %rcx,%r9
  mov    %rbx,%r8
  lea    D255(%rip),%rsi
  lea    D321(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

tool_calls: name: read_data
arguments: data_tag: D382
type_infered: string
name: read_data
arguments: data_tag: D3
type_infered: string
name: read_data
arguments: data_tag: D10
type_infered: string
name: read_data
arguments: data_tag: D243
type_infered: string
name: read_data
arguments: data_tag: D116
type_infered: string
name: read_data
arguments: data_tag: D310
type_infered: string
name: read_data
arguments: data_tag: D8
type_infered: string
name: read_data
arguments: data_tag: D386
type_infered: string
name: read_data
arguments: data_tag: D328
type_infered: string
name: read_data
arguments: data_tag: D62
type_infered: string
name: read_data
arguments: data_tag: D377
type_infered: string
name: read_data
arguments: data_tag: D106
type_infered: string
name: read_data
arguments: data_tag: D342
type_infered: string
name: read_data
arguments: data_tag: D175
type_infered: string
name: read_data
arguments: data_tag: D317
type_infered: string
name: read_data
arguments: data_tag: D374
type_infered: string
name: read_data
arguments: data_tag: D168
type_infered: string
name: read_data
arguments: data_tag: D355
type_infered: string
name: read_data
arguments: data_tag: D336
type_infered: string
name: read_data
arguments: data_tag: D197
type_infered: string
name: read_data
arguments: data_tag: D86
type_infered: string
name: read_data
arguments: data_tag: D253
type_infered: string
name: read_data
arguments: data_tag: D314
type_infered: string
name: read_data
arguments: data_tag: D270
type_infered: string
name: read_data
arguments: data_tag: D323
type_infered: string
name: read_data
arguments: data_tag: D358
type_infered: string
name: read_data
arguments: data_tag: D366
type_infered: string
name: read_data
arguments: data_tag: D204
type_infered: string
name: read_data
arguments: data_tag: D80
type_infered: string
name: read_data
arguments: data_tag: D265
type_infered: string
name: read_data
arguments: data_tag: D283
type_infered: string
name: read_data
arguments: data_tag: D125
type_infered: string
name: read_data
arguments: data_tag: D255
type_infered: string
name: read_data
arguments: data_tag: D321
type_infered: string

tool: D382: # is a 

tool: D3: # is not a 

tool: D10: 8 is a 

tool: D243: 8 is not a 

tool: D116: digit

tool: D310: According to isdigit: 

tool: D8: %s
%s%s
%s%s



tool: D386: 4 is a 

tool: D328: 4 is not a 

tool: D62: & is a 

tool: D377: & is not a 

tool: D106: b is a 

tool: D342: b is not a 

tool: D175: A is a 

tool: D317: A is not a 

tool: D374: letter

tool: D168: According to isalpha:

tool: D355: %s
%s%s
%s%s
%s%s
%s%s



tool: D336: digit or a letter

tool: D197: According to isalnum:

tool: D86: %s
%s%s
%s%s
%s%s



tool: D253: f is a 

tool: D314: f is not a 

tool: D270: $ is a 

tool: D323: $ is not a 

tool: D358: 7 is a 

tool: D366: 7 is not a 

tool: D204: J is a 

tool: D80: J is not a 

tool: D265: F is a 

tool: D283: F is not a 

tool: D125: hexadecimal digit

tool: D255: According to isxdigit:

tool: D321: %s
%s%s
%s%s
%s%s
%s%s
%s%s


assistant: ```c
int main(void) {
  printf("%s\n%s%s\n%s%s\n\n", "According to isdigit: ", isdigit('8') ? "8 is a " : "8 is not a ", "digit", isdigit('#') ? "# is a " : "# is not a ", "digit");
  printf("%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n", "According to isalpha:", isalpha('A') ? "A is a " : "A is not a ", "letter", isalpha('b') ? "b is a " : "b is not a ", "letter", isalpha('&') ? "& is a " : "& is not a ", "letter", isalpha('4') ? "4 is a " : "4 is not a ", "letter");
  printf("%s\n%s%s\n%s%s\n%s%s\n\n", "According to isalnum:", isalnum('A') ? "A is a " : "A is not a ", "digit or a letter", isalnum('8') ? "8 is a " : "8 is not a ", "digit or a letter", isalnum('#') ? "# is a " : "# is not a ", "digit or a letter");
  printf("%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n", "According to isxdigit:", isxdigit('F') ? "F is a " : "F is not a ", "hexadecimal digit", isxdigit('J') ? "J is a " : "J is not a ", "hexadecimal digit", isxdigit('7') ? "7 is a " : "7 is not a ", "hexadecimal digit", isxdigit('$') ? "$ is a " : "$ is not a ", "hexadecimal digit", isxdigit('f') ? "f is a " : "f is not a ", "hexadecimal digit");
  return 0;
}
```