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

```asm
<line_match>:
  endbr64
  push   %r14
  mov    %rdi,%rax
  push   %r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x20,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %fs:0x28,%rdx
  mov    %rdx,0x18(%rsp)
  xor    %edx,%edx
  cmpb   $0x20,(%rdi)
  jne    L57
L114:
  add    $0x1,%rax
  nopl   0x0(%rax,%rax,1)
L495:
  mov    %rax,0x8(%rsp)
  movzbl (%rax),%edx
  add    $0x1,%rax
  cmp    $0x20,%dl
  je     L495
L225:
  cmp    $0x29,%dl
  ja     L361
  movabs $0xfffffdffffffdbfe,%rax
  bt     %rdx,%rax
  jb     L361
  lea    D41(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L361:
  mov    0x8(%rsp),%rdx
  movzbl (%rdx),%eax
  cmp    $0xa,%al
  je     L349
  cmp    $0x20,%al
  je     L349
  add    $0x1,%rdx
  jmp    L254
  nopw   0x0(%rax,%rax,1)
L491:
  test   %al,%al
  je     L205
  cmp    $0x29,%al
  je     L144
  mov    %rdx,0x8(%rsp)
  movzbl (%rdx),%eax
  add    $0x1,%rdx
  cmp    $0x20,%al
  je     L349
  cmp    $0xa,%al
  je     L349
L254:
  cmp    $0xd,%al
  jne    L491
L205:
  lea    D41(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L387:
  mov    0x8(%rsp),%rax
  movzbl (%rax),%edx
  cmp    $0x20,%dl
  jne    L245
  add    $0x1,%rax
  nopl   0x0(%rax,%rax,1)
L46:
  mov    %rax,0x8(%rsp)
  movzbl (%rax),%edx
  add    $0x1,%rax
  cmp    $0x20,%dl
  je     L46
L245:
  cmp    $0xd,%dl
  ja     L247
  mov    $0xffffffffffffdbfe,%rax
  bt     %rdx,%rax
  jb     L247
  lea    D41(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L247:
  mov    0x8(%rsp),%rax
  movzbl (%rax),%edx
  mov    %rax,%r14
  cmp    $0x29,%dl
  je     L144
  lea    D53(%rip),%rbx
  test   %dl,%dl
  jne    L348
  jmp    L496
  nopw   0x0(%rax,%rax,1)
L297:
  mov    %rax,%rdx
  add    $0x1,%rax
  mov    %rax,0x8(%rsp)
  movzbl 0x1(%rdx),%edx
  cmp    $0x29,%dl
  je     L143
  test   %dl,%dl
  je     L83
L348:
  cmp    $0x28,%dl
  jne    L297
  mov    %rbx,%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  mov    0x8(%rsp),%rax
  jmp    L297
L83:
  cmp    $0x29,%dl
  je     L143
L496:
  lea    D41(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L143:
  mov    0x0(%rbp),%r13
  mov    %r14,0x8(%rsp)
  mov    $0x1,%r12d
  mov    %r13,0x10(%rsp)
  movzbl 0x0(%r13),%eax
  cmp    $0xd,%al
  ja     L102
  mov    $0xffffffffffffdbfe,%rdx
  bt     %rax,%rdx
  jae    L474
L102:
  lea    0x10(%rsp),%rbx
  nopl   (%rax)
L191:
  movzbl (%r14),%eax
  mov    %r14,%rdx
  cmp    $0x29,%al
  jne    L353
  jmp    L366
L118:
  cmp    $0x5b,%al
  je     L238
  mov    0x10(%rsp),%r8
  cmp    %al,(%r8)
  jne    L418
  add    $0x1,%rdx
  add    $0x1,%r8
  mov    %rdx,0x8(%rsp)
  mov    %r8,0x10(%rsp)
L486:
  movzbl (%rdx),%eax
  cmp    $0x29,%al
  je     L366
L353:
  cmp    $0x3c,%al
  jne    L118
  lea    0x8(%rsp),%rdi
  mov    %rbx,%rsi
  call   <lt_match@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  jne    L430
  mov    %r14,0x8(%rsp)
  mov    %r13,0x10(%rsp)
  cmpb   $0x29,(%r14)
  je     L64
L461:
  xor    %r12d,%r12d
L64:
  add    $0x1,%r13
  mov    %r14,0x8(%rsp)
  mov    %r13,0x10(%rsp)
  movzbl 0x0(%r13),%eax
  cmp    $0xd,%al
  ja     L191
  mov    $0xffffffffffffdbfe,%rdx
  bt     %rax,%rdx
  jb     L191
  xor    %r8d,%r8d
  test   %r12d,%r12d
  jne    L101
L279:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L14
  add    $0x20,%rsp
  mov    %r8,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  xchg   %ax,%ax
L238:
  lea    0x8(%rsp),%rdi
  mov    %rbx,%rsi
  call   <sb_match@plt>
  mov    0x8(%rsp),%rdx
  movzbl (%rdx),%eax
  cmp    $0x29,%al
  jne    L353
  nopl   (%rax)
L366:
  mov    0x10(%rsp),%r8
L437:
  cmp    %r13,%r8
  jbe    L64
  mov    %r13,0x0(%rbp)
  jmp    L279
  nopl   0x0(%rax)
L430:
  mov    0x8(%rsp),%rdx
  xor    %r12d,%r12d
  jmp    L486
  nopl   (%rax)
L418:
  mov    0x8(%rsp),%rax
  cmpb   $0x29,(%rax)
  jne    L461
  xor    %r12d,%r12d
  jmp    L437
  nopl   0x0(%rax,%rax,1)
L57:
  lea    D41(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  mov    0x8(%rsp),%rax
  movzbl (%rax),%edx
  cmp    $0x20,%dl
  je     L114
  jmp    L225
L349:
  cmp    $0x29,%al
  je     L144
  cmp    $0x20,%al
  je     L387
  jmp    L205
  nopl   (%rax)
L144:
  mov    0x0(%rbp),%rbx
  mov    %rbx,%rdi
  call   <strlen@plt>
  cltq
  lea    (%rbx,%rax,1),%r8
  mov    %r8,0x0(%rbp)
  jmp    L279
L101:
  mov    0x0(%rbp),%r13
L474:
  mov    %r13,%rdi
  call   <strlen@plt>
  movslq %eax,%r8
  add    %r13,%r8
  mov    %r8,0x0(%rbp)
  jmp    L279
L14:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D41
data_type: string
name: disassemble_data
arguments: data_tag: D53
data_type: string

tool: D41: Incorrect syntax in line_match!


tool: D53: Not allowed, no variables in an end-expression!


assistant: ```c
char *line_match(char *buf, char **tmpSpeech) {
  if (*buf != ' ') {
    printf("Incorrect syntax in line_match!\n");
    exit(1);
  }
  while (*buf == ' ') {
    ++buf;
  }
  if (*buf == ')' || *buf == '\n' || *buf == '\r' || *buf == '\0') {
    printf("Incorrect syntax in line_match!\n");
    exit(1);
  }
  while (*buf != ' ' && *buf != '\n' && *buf != '\r' && *buf != '\0' && *buf != ')') {
    ++buf;
  }
  if (*buf == ')') {
    *tmpSpeech = *tmpSpeech + strlen(*tmpSpeech);
    return *tmpSpeech;
  }
  if (*buf != ' ') {
    printf("Incorrect syntax in line_match!\n");
    exit(1);
  }
  while (*buf == ' ') {
    ++buf;
  }
  if (*buf == '\n' || *buf == '\0' || *buf == '\r') {
    printf("Incorrect syntax in line_match!\n");
    exit(1);
  }
  if (*buf == ')') {
    *tmpSpeech = *tmpSpeech + strlen(*tmpSpeech);
    return *tmpSpeech;
  }
  char *matchExpression;
  matchExpression = buf;
  while (*buf != ')' && *buf != '\0') {
    if (*buf == '(') {
      printf("Not allowed, no variables in an end-expression!\n");
      exit(1);
    }
    ++buf;
  }
  if (*buf != ')') {
    printf("Incorrect syntax in line_match!\n");
    exit(1);
  }
  buf = matchExpression;
  char *speechChecker = *tmpSpeech;
  char *speechWalker = *tmpSpeech;
  int only_sb = 1;
  while (*speechWalker != '\0' && *speechWalker != '\n' && *speechWalker != '\r') {
    while (*buf != ')') {
      if (*buf == '<') {
        only_sb = 0;
        if (!lt_match(&buf, &speechChecker)) {
          buf = matchExpression;
          speechChecker = speechWalker;
          break;
        }
        continue;
      } else if (*buf == '[') {
        sb_match(&buf, &speechChecker);
        continue;
      }
      if (*buf != *speechChecker) {
        only_sb = 0;
        break;
      }
      ++buf;
      ++speechChecker;
    }
    if (*buf != ')') {
      buf = matchExpression;
      speechChecker = speechWalker;
    } else {
      if (speechChecker > speechWalker) {
        *tmpSpeech = speechWalker;
        return speechChecker;
      } else {
        buf = matchExpression;
        speechChecker = speechWalker;
      }
    }
    ++speechWalker;
    ++speechChecker;
  }
  if (only_sb) {
    *tmpSpeech = *tmpSpeech + strlen(*tmpSpeech);
    return *tmpSpeech;
  }
  return NULL;
}
```