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

```asm
<ReadSentence>:
  endbr64
  push   %r15
  mov    %rsi,%r15
  mov    %rcx,%rsi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rcx,%rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,0x8(%rsp)
  lea    0x20(%rsp),%r12
  mov    %rdx,0x10(%rsp)
  mov    %r12,%rdi
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  call   <ReadWord@plt>
  mov    %rbp,%rdi
  call   <feof@plt>
  test   %rax,%rax
  je     L152
L120:
  xor    %r13d,%r13d
L114:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L130
  add    $0x98,%rsp
  mov    %r13d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L152:
  mov    %r12,%rdi
  xor    %r14d,%r14d
  xor    %r13d,%r13d
  call   <SearchCategory@plt>
  mov    0x8(%rsp),%rcx
  mov    %eax,(%rcx)
  nopl   (%rax)
L77:
  mov    %r12,%rdi
  mov    %rbp,%rsi
  call   <ReadWord@plt>
  mov    %rbp,%rdi
  mov    %eax,%ebx
  call   <feof@plt>
  test   %rax,%rax
  jne    L120
  mov    %r12,%rdi
  add    $0x1,%r13d
  call   <SearchVocab@plt>
  cmp    $0xffffffff,%eax
  je     L126
  cmp    $0x12b,%r14d
  jg     L126
  movslq %r14d,%rdx
  add    $0x1,%r14d
  mov    %eax,(%r15,%rdx,4)
L126:
  sub    $0x9,%ebx
  cmp    $0x1,%ebx
  ja     L77
  movslq %r14d,%rax
  movl   $0xffffffff,(%r15,%rax,4)
  test   %r14d,%r14d
  je     L93
L59:
  movl   $0x0,0x8(%rsp)
L21:
  movslq 0x8(%rsp),%rax
  mov    0x10(%rsp),%r15
  xor    %r14d,%r14d
  imul   $0x4b4,%rax,%rax
  mov    %rax,0x18(%rsp)
  add    %rax,%r15
  nop
L110:
  mov    %r12,%rdi
  mov    %rbp,%rsi
  call   <ReadWord@plt>
  mov    %rbp,%rdi
  mov    %eax,%ebx
  call   <feof@plt>
  test   %rax,%rax
  jne    L120
  mov    %r12,%rdi
  add    $0x1,%r13d
  call   <SearchVocab@plt>
  cmp    $0xffffffff,%eax
  je     L5
  cmp    $0x12b,%r14d
  jg     L5
  movslq %r14d,%rdx
  add    $0x1,%r14d
  mov    %eax,(%r15,%rdx,4)
L5:
  lea    -0x9(%rbx),%eax
  cmp    $0x1,%eax
  ja     L110
  movslq %r14d,%rax
  movl   $0xffffffff,(%r15,%rax,4)
  test   %r14d,%r14d
  je     L116
  mov    0x8(%rsp),%eax
  cmp    $0x13,%eax
  jg     L116
  add    $0x1,%eax
  mov    0x18(%rsp),%rcx
  mov    %eax,0x8(%rsp)
  mov    0x10(%rsp),%rax
  lea    0x4b4(%rax,%rcx,1),%r15
L116:
  cmp    $0xa,%ebx
  jne    L21
  movl   $0xffffffff,(%r15)
  jmp    L114
  nopw   0x0(%rax,%rax,1)
L93:
  mov    0x8(%rsp),%rax
  movl   $0xffffffff,(%rax)
  jmp    L59
L130:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int ReadSentence(int *category, int *que, int ans[][300 + 1], FILE *fin) {
  char word[100];
  int a = 0, b = 0, c = 0, id = -1, ch;
  ReadWord(word, fin);
  if (feof(fin))
    return 0;
  c = SearchCategory(word);
  *category = c;
  c = 0;
  while (1) {
    ch = ReadWord(word, fin);
    if (feof(fin))
      return 0;
    a++;
    id = SearchVocab(word);
    if (id != -1 && c < 300) {
      que[c] = id;
      c++;
    }
    if (ch == '\t' || ch == '\n')
      break;
  }
  que[c] = -1;
  if (c == 0)
    *category = -1;
  b = 0;
  while (1) {
    c = 0;
    while (1) {
      ch = ReadWord(word, fin);
      if (feof(fin))
        return 0;
      a++;
      id = SearchVocab(word);
      if (id != -1 && c < 300) {
        ans[b][c] = id;
        c++;
      }
      if (ch == '\t' || ch == '\n')
        break;
    }
    ans[b][c] = -1;
    if (c != 0 && b < 20)
      b++;
    if (ch == '\n')
      break;
  }
  ans[b][0] = -1;
  return a;
}
```