user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<fftrec>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x80(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jle    L160
  mov    -0x80(%rbp),%rax
  mov    (%rax),%eax
  jmp    L69
L160:
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0x68(%rbp)
  movq   $0x8,-0x70(%rbp)
  jmp    L77
L216:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x1f,%al
  jle    L168
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7f,%al
  jne    L70
L168:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x70(%rbp),%rax
  add    $0x1,%eax
  mov    %eax,%ecx
  lea    -0x60(%rbp),%rax
  mov    %edx,%r8d
  lea    D84(%rip),%rdx
  mov    $0x51,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L2
  lea    -0x60(%rbp),%rax
  lea    D11(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L122
L2:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  jne    L5
  lea    -0x60(%rbp),%rax
  lea    D60(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L122
L5:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  jne    L41
  lea    -0x60(%rbp),%rax
  lea    D88(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L122
L41:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xb,%al
  jne    L20
  lea    -0x60(%rbp),%rax
  lea    D24(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L122
L20:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xc,%al
  jne    L89
  lea    -0x60(%rbp),%rax
  lea    D28(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L122
L89:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  jne    L65
  lea    -0x60(%rbp),%rax
  lea    D22(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L122
L65:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x1b,%al
  jne    L173
  lea    -0x60(%rbp),%rax
  lea    D33(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L122
L173:
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7f,%al
  jne    L122
  lea    -0x60(%rbp),%rax
  lea    D45(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
L122:
  lea    -0x60(%rbp),%rax
  mov    %rax,%rdi
  call   <ffpmsg@plt>
  mov    -0x78(%rbp),%rcx
  lea    -0x60(%rbp),%rax
  mov    $0x50,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x10(%rbp)
  lea    -0x60(%rbp),%rax
  mov    %rax,%rdi
  call   <ffpmsg@plt>
  mov    -0x80(%rbp),%rax
  movl   $0xcf,(%rax)
  mov    -0x80(%rbp),%rax
  mov    (%rax),%eax
  jmp    L69
L70:
  addq   $0x1,-0x70(%rbp)
L77:
  mov    -0x70(%rbp),%rax
  cmp    -0x68(%rbp),%rax
  jb     L216
  mov    -0x80(%rbp),%rax
  mov    (%rax),%eax
L69:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L83
  call   <__stack_chk_fail@plt>
L83:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D84
type: string
name: disassemble_data
arguments: tag: D11
type: string
name: disassemble_data
arguments: tag: D60
type: string
name: disassemble_data
arguments: tag: D88
type: string
name: disassemble_data
arguments: tag: D24
type: string
name: disassemble_data
arguments: tag: D28
type: string
name: disassemble_data
arguments: tag: D22
type: string
name: disassemble_data
arguments: tag: D33
type: string
name: disassemble_data
arguments: tag: D45
type: string

tool: D84: Character %d in this keyword is illegal. Hex Value = %X

tool: D11:  (NULL char.)

tool: D60:  (TAB char.)

tool: D88:  (Line Feed char.)

tool: D24:  (Vertical Tab)

tool: D28:  (Form Feed char.)

tool: D22:  (Carriage Return)

tool: D33:  (Escape char.)

tool: D45:  (Delete char.)

assistant: ```c
int fftrec(char *card, int *status) {
  size_t ii, maxchr;
  char msg[81];
  if (*status > 0)
    return (*status);
  maxchr = strlen(card);
  for (ii = 8; ii < maxchr; ii++) {
    if (card[ii] < 32 || card[ii] > 126) {
      snprintf(msg, 81, "Character %d in this keyword is illegal. Hex Value = %X", (int)(ii + 1), (int)card[ii]);
      if (card[ii] == 0)
        strcat(msg, " (NULL char.)");
      else if (card[ii] == 9)
        strcat(msg, " (TAB char.)");
      else if (card[ii] == 10)
        strcat(msg, " (Line Feed char.)");
      else if (card[ii] == 11)
        strcat(msg, " (Vertical Tab)");
      else if (card[ii] == 12)
        strcat(msg, " (Form Feed char.)");
      else if (card[ii] == 13)
        strcat(msg, " (Carriage Return)");
      else if (card[ii] == 27)
        strcat(msg, " (Escape char.)");
      else if (card[ii] == 127)
        strcat(msg, " (Delete char.)");
      ffpmsg(msg);
      strncpy(msg, card, 80);
      msg[80] = '\0';
      ffpmsg(msg);
      return (*status = 207);
    }
  }
  return (*status);
}
```