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

```asm
<count_5>:
  endbr64
  push   %r15
  mov    $0x32,%ecx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  xor    %ebx,%ebx
  sub    $0x1b8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x1a8(%rsp)
  xor    %eax,%eax
  lea    0x10(%rsp),%rdi
  mov    %rdi,0x8(%rsp)
  rep stos %rax,%es:(%rdi)
  lea    D68(%rip),%rdi
  call   <puts@plt>
  lea    D40(%rip),%rdi
  call   <puts@plt>
  movl   $0x0,0x4(%rsp)
  xchg   %ax,%ax
L53:
  xor    %eax,%eax
  call   <getchar@plt>
  cmp    $0x7e,%al
  je     L217
L141:
  lea    -0x30(%rax),%edx
  cmp    $0x9,%dl
  mov    %ebx,%edx
  setbe  %cl
  xor    $0x1,%dl
  je     L398
  test   %cl,%cl
  jne    L56
L398:
  cmp    $0x60,%al
  setg   %sil
  test   %dl,%dl
  je     L297
  test   %sil,%sil
  je     L297
  cmp    $0x7a,%al
  jle    L56
L49:
  mov    %ebx,%edx
  mov    $0x1,%r8d
  and    $0x1,%edx
L142:
  test   %sil,%sil
  je     L25
L426:
  test   %dl,%dl
  je     L32
  cmp    $0x7a,%al
  jg     L53
L327:
  movslq %ebp,%rax
  addl   $0x1,0x10(%rsp,%rax,4)
  xor    %eax,%eax
  call   <getchar@plt>
  cmp    $0x7e,%al
  jne    L141
L217:
  mov    0x4(%rsp),%ebx
  xor    %eax,%eax
  lea    D39(%rip),%rdi
  mov    %ebx,%esi
  call   <printf@plt>
  test   %ebx,%ebx
  je     L1
  mov    0x4(%rsp),%ecx
  cmp    $0x1,%ecx
  je     L224
  lea    -0x1(%rcx),%eax
  cmp    $0x2,%eax
  jbe    L392
  shr    $0x2,%ecx
  mov    0x8(%rsp),%rax
  pxor   %xmm0,%xmm0
  mov    %ecx,%edx
  sub    $0x1,%edx
  shl    $0x4,%rdx
  lea    0x20(%rsp,%rdx,1),%rdx
  nopl   0x0(%rax)
L339:
  movdqa %xmm0,%xmm1
  add    $0x10,%rax
  pcmpgtd -0x10(%rax),%xmm1
  pand   %xmm1,%xmm0
  pandn  -0x10(%rax),%xmm1
  por    %xmm1,%xmm0
  cmp    %rax,%rdx
  jne    L339
  movdqa %xmm0,%xmm2
  mov    0x4(%rsp),%ecx
  psrldq $0x8,%xmm2
  movdqa %xmm2,%xmm1
  mov    %ecx,%eax
  pcmpgtd %xmm0,%xmm1
  and    $0xfffffffc,%eax
  pand   %xmm1,%xmm2
  pandn  %xmm0,%xmm1
  movdqa %xmm1,%xmm0
  por    %xmm2,%xmm0
  movdqa %xmm0,%xmm2
  psrldq $0x4,%xmm2
  movdqa %xmm2,%xmm1
  pcmpgtd %xmm0,%xmm1
  pand   %xmm1,%xmm2
  pandn  %xmm0,%xmm1
  por    %xmm2,%xmm1
  movd   %xmm1,%ebx
  test   $0x3,%cl
  je     L71
  movslq %eax,%rdx
  mov    0x10(%rsp,%rdx,4),%edx
  cmp    %edx,%ebx
  cmovl  %edx,%ebx
  add    $0x1,%eax
  cmp    %ecx,%eax
  jge    L71
L405:
  movslq %eax,%rdx
  mov    0x10(%rsp,%rdx,4),%edx
  cmp    %edx,%ebx
  cmovl  %edx,%ebx
  add    $0x1,%eax
  cmp    %eax,0x4(%rsp)
  jle    L71
  cltq
  mov    0x10(%rsp,%rax,4),%eax
  cmp    %eax,%ebx
  cmovl  %eax,%ebx
  jmp    L71
  nopl   0x0(%rax,%rax,1)
L287:
  cmp    $0x5a,%al
  jg     L49
L56:
  movslq %ebp,%rax
  addl   $0x1,0x4(%rsp)
  mov    $0x1,%ebx
  addl   $0x1,0x10(%rsp,%rax,4)
  jmp    L53
  nop
L297:
  cmp    $0x40,%al
  setg   %dil
  mov    %edi,%r8d
  test   %dl,%dl
  je     L143
  test   %dil,%dil
  jne    L287
L143:
  mov    %ebx,%edx
  and    $0x1,%edx
  je     L142
  test   %cl,%cl
  jne    L327
  test   %sil,%sil
  jne    L426
L25:
  test   %dl,%dl
  je     L32
  test   %r8b,%r8b
  jne    L205
L32:
  cmp    $0x20,%al
  je     L183
  cmp    $0x9,%al
  jne    L38
L183:
  add    $0x1,%ebp
  xor    %ebx,%ebx
  jmp    L53
L224:
  mov    0x10(%rsp),%ebx
L71:
  test   %ebx,%ebx
  jle    L97
  mov    0x4(%rsp),%eax
  lea    D74(%rip),%r14
  lea    D25(%rip),%r13
  lea    0xe(%rax,%rax,2),%r12d
  sub    $0x1,%eax
  lea    0x14(%rsp,%rax,4),%rbp
  nopl   0x0(%rax)
L54:
  mov    %ebx,%esi
  lea    D38(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x8(%rsp),%r15
  jmp    L266
  nopw   0x0(%rax,%rax,1)
L201:
  mov    %r13,%rdi
  xor    %eax,%eax
  add    $0x4,%r15
  call   <printf@plt>
  cmp    %r15,%rbp
  je     L257
L266:
  cmp    %ebx,(%r15)
  jge    L201
  mov    %r14,%rdi
  xor    %eax,%eax
  add    $0x4,%r15
  call   <printf@plt>
  cmp    %r15,%rbp
  jne    L266
L257:
  mov    $0xa,%edi
  xor    %r15d,%r15d
  call   <putchar@plt>
  nopl   0x0(%rax,%rax,1)
L420:
  mov    $0x2d,%edi
  add    $0x1,%r15d
  call   <putchar@plt>
  cmp    %r15d,%r12d
  jge    L420
  mov    $0xa,%edi
  call   <putchar@plt>
  sub    $0x1,%ebx
  jne    L54
L97:
  lea    D59(%rip),%rdi
  xor    %eax,%eax
  mov    $0x1,%ebx
  call   <printf@plt>
  lea    D64(%rip),%rbp
L60:
  mov    %ebx,%esi
  mov    %rbp,%rdi
  xor    %eax,%eax
  add    $0x1,%ebx
  call   <printf@plt>
  cmp    %ebx,0x4(%rsp)
  jge    L60
  mov    0x1a8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L87
  add    $0x1b8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L205:
  cmp    $0x5a,%al
  jle    L327
L38:
  cmp    $0xa,%al
  jne    L53
  add    $0x1,%ebp
  xor    %ebx,%ebx
  jmp    L53
L1:
  lea    D88(%rip),%rdi
  call   <puts@plt>
  mov    0x1a8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L87
  add    $0x1b8,%rsp
  lea    D16(%rip),%rdi
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10c0 <printf@plt>
L392:
  mov    0x10(%rsp),%ebx
  xor    %eax,%eax
  test   %ebx,%ebx
  cmovs  %eax,%ebx
  mov    $0x1,%eax
  jmp    L405
L87:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D68
datatype: string
name: parse_data
arguments: data_label: D40
datatype: string
name: parse_data
arguments: data_label: D39
datatype: string
name: parse_data
arguments: data_label: D74
datatype: string
name: parse_data
arguments: data_label: D25
datatype: string
name: parse_data
arguments: data_label: D38
datatype: string
name: parse_data
arguments: data_label: D59
datatype: string
name: parse_data
arguments: data_label: D64
datatype: string
name: parse_data
arguments: data_label: D88
datatype: string
name: parse_data
arguments: data_label: D16
datatype: string

tool: D68: 		 THE GREAT WORD COUNTER PROGRAM



tool: D40: Say what you wanna say & then press " ~ ".

tool: D39: 
In total you said.. %i words



tool: D74:  - 

tool: D25:  * 

tool: D38: Letters x %2d |

tool: D59:    Word no.  |

tool: D64:  %d 

tool: D88: So you've got nothing to say, huh?

tool: D16: 
	Ok..
		Bye then!

assistant: ```c
void count_5(void) {
  char c;
  int x, i, state, words, nr_maxim;
  x = state = words = nr_maxim = 0;
  int words_lenght[100] = {0};
  puts("\t\t THE GREAT WORD COUNTER PROGRAM\n\n");
  puts("Say what you wanna say & then press \" ~ \".");
  while ((c = getchar()) != '~') {
    if ((state == 0 && c >= '0' && c <= '9') || (state == 0 && c >= 'a' && c <= 'z') || (state == 0 && c >= 'A' && c <= 'Z')) {
      state = 1;
      words++;
      words_lenght[x]++;
    } else if ((state == 1 && c >= '0' && c <= '9') || (state == 1 && c >= 'a' && c <= 'z') || (state == 1 && c >= 'A' && c <= 'Z'))
      words_lenght[x]++;
    else if (c == ' ' || c == '\t' || c == '\n') {
      state = 0;
      x++;
    } else
      continue;
  }
  printf("\nIn total you said.. %i words\n\n", words);
  if (words == 0) {
    printf("So you've got nothing to say, huh?\n");
    printf("\n\tOk..\n\t\tBye then!");
    goto tambalau;
  }
  x = 0;
  nr_maxim = 0;
  while (x < words) {
    if (words == 1)
      nr_maxim = words_lenght[0];
    else if (nr_maxim <= words_lenght[x])
      nr_maxim = words_lenght[x];
    x++;
  }
  for (x = nr_maxim; x > 0; x--) {
    while (x <= nr_maxim) {
      printf("Letters x %2d |", x);
      break;
    }
    for (i = 0; i < words; i++) {
      if (words_lenght[i] >= x)
        printf(" * ");
      else
        printf(" - ");
    }
    putchar('\n');
    for (i = 0; i < (words * 3 + 15); i++)
      printf("-");
    putchar('\n');
  }
  x = 1;
  printf("   Word no.  |");
  for (x >= 1; x <= words; x++)
    printf(" %d ", x);
tambalau:;
}
```