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

```asm
<main>:
  endbr64
  push   %r14
  lea    D44(%rip),%rdi
  push   %r13
  movabs $0x8000400200000000,%r13
  push   %r12
  push   %rbp
  push   %rbx
  xor    %ebx,%ebx
  sub    $0xd0,%rsp
  movdqa D4(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0xc8(%rsp)
  xor    %eax,%eax
  mov    %rsp,%r12
  movabs $0xa0a0a0a0a0a0a0a,%rax
  mov    %rax,0xc0(%rsp)
  xor    %eax,%eax
  movaps %xmm0,(%rsp)
  movaps %xmm0,0x10(%rsp)
  movaps %xmm0,0x20(%rsp)
  movaps %xmm0,0x30(%rsp)
  movaps %xmm0,0x40(%rsp)
  movaps %xmm0,0x50(%rsp)
  movaps %xmm0,0x60(%rsp)
  movaps %xmm0,0x70(%rsp)
  movaps %xmm0,0x80(%rsp)
  movaps %xmm0,0x90(%rsp)
  movaps %xmm0,0xa0(%rsp)
  movaps %xmm0,0xb0(%rsp)
  call   <printf@plt>
  jmp    L109
  cs nopw 0x0(%rax,%rax,1)
L67:
  add    $0x1,%rbx
  cmp    $0xc8,%rbx
  je     L84
L109:
  xor    %eax,%eax
  movslq %ebx,%rbp
  call   <getchar@plt>
  mov    %al,(%r12,%rbx,1)
  mov    %eax,%r14d
  cmp    $0x3f,%al
  ja     L67
  bt     %rax,%r13
  jae    L67
  lea    -0x1(%rbp),%ebx
  xor    %eax,%eax
  lea    D7(%rip),%rdi
  movb   $0xa,(%rsp,%rbp,1)
  call   <printf@plt>
  cmp    $0xffffffff,%ebx
  je     L20
L168:
  movslq %ebx,%rbp
  add    $0x1,%ebx
  add    %r12,%rbp
  jmp    L28
  nopl   (%rax)
L79:
  sub    $0x1,%rbp
  sub    $0x1,%ebx
  je     L7
L28:
  cmpb   $0x20,0x0(%rbp)
  jne    L79
  mov    $0x20,%edi
  call   <putchar@plt>
  movslq %ebx,%rax
  movsbl (%rsp,%rax,1),%edi
  cmp    $0xa,%dil
  je     L79
  cmp    $0x20,%dil
  je     L79
  mov    %rbp,%r12
  nopw   0x0(%rax,%rax,1)
L123:
  call   <putchar@plt>
  movsbl 0x2(%r12),%edi
  add    $0x1,%r12
  cmp    $0xa,%dil
  je     L79
  cmp    $0x20,%dil
  jne    L123
  jmp    L79
L7:
  mov    $0x20,%edi
  call   <putchar@plt>
  movsbl (%rsp),%edi
  cmp    $0x20,%dil
  je     L20
  lea    0x1(%rsp),%rbx
  cs nopw 0x0(%rax,%rax,1)
L161:
  call   <putchar@plt>
  movsbl (%rbx),%edi
  add    $0x1,%rbx
  cmp    $0x20,%dil
  jne    L161
L20:
  xor    %eax,%eax
  movsbl %r14b,%esi
  lea    D39(%rip),%rdi
  call   <printf@plt>
  mov    0xc8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L65
  add    $0xd0,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L84:
  lea    D7(%rip),%rdi
  xor    %eax,%eax
  mov    $0x20,%r14d
  mov    $0xc8,%ebx
  call   <printf@plt>
  jmp    L168
L65:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: label: D44
type: string
name: read_data
arguments: label: D4
type: byte[16]
name: read_data
arguments: label: D7
type: string
name: read_data
arguments: label: D39
type: string

tool: D44: Enter a sentence: 

tool: {"D4": [0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a]}

tool: D7: Reversal of sentence:

tool: D39: %c


assistant: ```c
int main(void) {
  char end_char = ' ', a[200] = {[0 ... 200 - 1] = '\n'};
  int i, n, effective_size = 200;
  printf("Enter a sentence: ");
  for (i = 0; i < 200; i++) {
    a[i] = getchar();
    switch (a[i]) {
    case '.':
    case '!':
    case '?':
      end_char = a[i];
      effective_size = i - 1;
      break;
    default:
      break;
    }
    if (end_char != ' ') {
      a[i] = '\n';
      break;
    }
  }
  printf("Reversal of sentence:");
  for (i = effective_size; i >= 0; --i) {
    if (a[i] == ' ') {
      putchar(' ');
      for (n = i + 1; (a[n] != '\n') && (a[n] != ' '); n++)
        putchar(a[n]);
    }
    if (i == 0) {
      putchar(' ');
      for (n = 0; a[n] != ' '; n++)
        putchar(a[n]);
      break;
    }
  }
  printf("%c\n", end_char);
  return 0;
}
```