user: Translate the below assembly code into C programming language:

```asm
<str_stats>:
  endbr64
  push   %r13
  mov    %rdi,%rcx
  push   %r12
  push   %rbp
  sub    $0x60,%rsp
  movdqa D52(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  movl   $0x5a,0x50(%rsp)
  movaps %xmm0,(%rsp)
  movdqa D26(%rip),%xmm0
  movaps %xmm0,0x10(%rsp)
  movdqa D59(%rip),%xmm0
  movaps %xmm0,0x20(%rsp)
  movdqa D68(%rip),%xmm0
  movaps %xmm0,0x30(%rsp)
  movdqa D16(%rip),%xmm0
  movaps %xmm0,0x40(%rsp)
  nopl   0x0(%rax,%rax,1)
L201:
  mov    %rax,%rdx
  add    $0x1,%rax
  cmpb   $0x0,(%rcx,%rax,1)
  jne    L201
  lea    0x1(%rcx,%rdx,1),%r9
  xor    %r13d,%r13d
  xor    %ebp,%ebp
  xor    %r12d,%r12d
  xor    %r10d,%r10d
  xor    %esi,%esi
  lea    0x54(%rsp),%r8
  jmp    L181
  cs nopw 0x0(%rax,%rax,1)
L29:
  lea    -0x7b(%rdx),%eax
  cmp    $0x4,%eax
  jbe    L99
  lea    -0x5b(%rdx),%eax
  cmp    $0x5,%eax
  jbe    L99
  lea    -0x30(%rdx),%eax
  cmp    $0x2a,%eax
  jbe    L220
  lea    -0x61(%rdx),%eax
  cmp    $0x19,%eax
  jbe    L220
L300:
  add    $0x1,%rcx
  cmp    %rcx,%r9
  je     L409
L181:
  movsbl (%rcx),%edx
  lea    -0x20(%rdx),%eax
  cmp    $0xf,%eax
  ja     L29
L99:
  add    $0x1,%rcx
  xor    %esi,%esi
  cmp    %rcx,%r9
  jne    L181
L409:
  mov    %r10d,%esi
  lea    D72(%rip),%rdi
  call   <printf@plt>
  mov    %ebp,%esi
  lea    D85(%rip),%rdi
  call   <printf@plt>
  mov    %r12d,%esi
  lea    D9(%rip),%rdi
  call   <printf@plt>
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L274
  add    $0x60,%rsp
  mov    %r13d,%esi
  lea    D4(%rip),%rdi
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    1070 <printf@plt>
  nopl   0x0(%rax,%rax,1)
L220:
  cmp    $0x1,%esi
  adc    $0x0,%r10d
  cmp    $0x41,%edx
  je     L260
  cmp    $0x61,%edx
  jne    L339
  nopl   0x0(%rax)
L260:
  add    $0x1,%r12d
L17:
  mov    %rsp,%rsi
  nop
L49:
  mov    (%rsi),%eax
  xor    %edi,%edi
  cmp    %eax,%edx
  sete   %dil
  add    $0x20,%eax
  add    %edi,%ebp
  cmp    %eax,%edx
  sete   %al
  add    $0x4,%rsi
  movzbl %al,%eax
  add    %eax,%ebp
  cmp    %rsi,%r8
  jne    L49
  cmp    $0x30,%edx
  je     L284
  cmp    $0x31,%edx
  jne    L122
  nopl   0x0(%rax)
L284:
  add    $0x1,%r13d
L238:
  mov    $0x1,%esi
  jmp    L300
  xchg   %ax,%ax
L339:
  cmp    $0x45,%edx
  je     L260
  cmp    $0x65,%edx
  je     L260
  cmp    $0x49,%edx
  je     L260
  cmp    $0x69,%edx
  je     L260
  cmp    $0x4f,%edx
  je     L260
  cmp    $0x6f,%edx
  je     L260
  cmp    $0x55,%edx
  je     L260
  cmp    $0x75,%edx
  je     L260
  cmp    $0x59,%edx
  je     L260
  cmp    $0x79,%edx
  je     L260
  test   %edx,%edx
  jne    L148
  add    $0x1,%r12d
L31:
  add    $0x5,%r12d
  jmp    L17
  nopl   0x0(%rax,%rax,1)
L122:
  cmp    $0x32,%edx
  je     L284
  cmp    $0x33,%edx
  je     L284
  cmp    $0x34,%edx
  je     L284
  cmp    $0x35,%edx
  je     L284
  cmp    $0x36,%edx
  je     L284
  cmp    $0x37,%edx
  je     L284
  cmp    $0x38,%edx
  je     L284
  cmp    $0x39,%edx
  je     L284
  jmp    L238
  nopw   0x0(%rax,%rax,1)
L148:
  cmp    $0x20,%edx
  jne    L408
  add    $0x6,%r12d
  jmp    L17
L408:
  test   %edx,%edx
  jne    L17
  jmp    L31
L274:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: data_label: D52
type_guessed: byte[16]
name: read_data
arguments: data_label: D26
type_guessed: byte[16]
name: read_data
arguments: data_label: D59
type_guessed: byte[16]
name: read_data
arguments: data_label: D68
type_guessed: byte[16]
name: read_data
arguments: data_label: D16
type_guessed: byte[16]
name: read_data
arguments: data_label: D72
type_guessed: string
name: read_data
arguments: data_label: D85
type_guessed: string
name: read_data
arguments: data_label: D9
type_guessed: string
name: read_data
arguments: data_label: D4
type_guessed: string

tool: {"D52": [0x42,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x46,0x00,0x00,0x00]}

tool: {"D26": [0x47,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4b,0x00,0x00,0x00]}

tool: {"D59": [0x4c,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x50,0x00,0x00,0x00]}

tool: {"D68": [0x51,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x54,0x00,0x00,0x00]}

tool: {"D16": [0x56,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x59,0x00,0x00,0x00]}

tool: D72: %d mot(s)


tool: D85: %d consonnes(s)


tool: D9: %d voyelle(s)


tool: D4: %d chiffre(s)

assistant: ```c
void str_stats(char *arg) {
  const DEHORS = 0;
  const DEDANS = 1;
  enum voyellesMaj { A = 65, E = 69, I = 73, O = 79, U = 85, Y = 89 };
  enum chiffres { ZERO, UN, DEUX, TROIS, QUATRE, CINQ, SIX, SEPT, HUIT, NEUF };
  enum consonnes { B = 66, C = 67, D = 68, F = 70, G = 71, H = 72, J = 74, K = 75, L = 76, M = 77, N = 78, P = 80, Q = 81, R = 82, S = 83, T = 84, V = 86, W = 87, X = 88, Z = 90 };
  int i, j, g, taille, tailleV, tailleCo, tailleCh, etat, mots, voyelles, consonnes, chiffres;
  etat = mots = voyelles = consonnes = chiffres = 0;
  taille = tailleCo = tailleCh = 0;
  int tabv[12] = {A, E, I, O, U, Y};
  int tabco[21] = {B, C, D, F, G, H, J, K, L, M, N, P, Q, R, S, T, V, W, X, Y, Z};
  int tabch[10] = {ZERO, UN, DEUX, TROIS, QUATRE, CINQ, SIX, SEPT, HUIT, NEUF};
  do {
    taille++;
  } while (arg[taille] != '\0');
  for (i = 0; i < taille; i++) {
    int c = arg[i];
    if ((c >= ' ' && c <= '/') || (c >= '{' && c < 128 || c >= '[' && c <= 96)) {
      etat = DEHORS;
    } else if (c >= '0' && c <= 'Z' || c >= 'a' && c <= 'z') {
      if (etat == DEHORS)
        mots++;
      etat = DEDANS;
      for (j = 0; j < 12; j++) {
        (c == tabv[j]) ? voyelles++ : 0;
        (c == (tabv[j] + 32)) ? voyelles++ : 0;
      }
      for (j = 0; j < 21; j++) {
        (c == tabco[j]) ? consonnes++ : 0;
        (c == (tabco[j] + 32)) ? consonnes++ : 0;
      }
      for (j = 0; j < 10; j++) {
        (c == (tabch[j] + 48)) ? chiffres++ : 0;
      }
    }
  }
  printf("%d mot(s)\n", mots);
  printf("%d consonnes(s)\n", consonnes);
  printf("%d voyelle(s)\n", voyelles);
  printf("%d chiffre(s)", chiffres);
}
```