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

```asm
<strip_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x10(%rbp)
L61:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L14
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x5d,%eax
  jg     L132
  cmp    $0x28,%eax
  jge    L8
  cmp    $0x23,%eax
  je     L120
  cmp    $0x23,%eax
  jg     L132
  cmp    $0xa,%eax
  je     L291
  cmp    $0x21,%eax
  je     L291
  jmp    L132
L8:
  sub    $0x28,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  movabs $0x280000008c0003,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L291
  movabs $0x10000000000010,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L166
  and    $0x20,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  jne    L30
  jmp    L132
L166:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x20,(%rax)
  jmp    L285
L120:
  addq   $0x1,-0x10(%rbp)
  jmp    L86
L254:
  addq   $0x1,-0x10(%rbp)
L86:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x23,%al
  je     L162
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L254
L162:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x23,%al
  jne    L177
  addq   $0x1,-0x10(%rbp)
  jmp    L177
L30:
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  je     L158
  nop
L182:
  mov    -0x8(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  je     L180
  subq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  je     L182
L180:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x20,(%rax)
  jmp    L285
L158:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  mov    -0x10(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  jmp    L285
L132:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <islower@plt>
  test   %eax,%eax
  je     L165
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,%edx
  jmp    L3
L165:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%edx
L3:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  mov    %dl,(%rax)
  jmp    L285
L291:
  nop
  jmp    L285
L177:
  nop
L285:
  cmpq   $0x0,-0x10(%rbp)
  je     L101
  addq   $0x1,-0x10(%rbp)
  jmp    L61
L14:
  nop
  jmp    L55
L101:
  nop
L55:
  mov    -0x8(%rbp),%rax
  movb   $0x0,(%rax)
  nop
  leave
  ret
```

assistant: ```c
void strip_line(line) char *line;
{
  char *from, *to;
  for (from = to = line;; from++) {
    if (!(*from))
      break;
    switch (*from) {
    case '(':
    case ')':
    case '[':
    case ']':
    case ':':
    case ';':
    case '?':
    case '!':
    case '\n':
      break;
    case ',':
    case '\\':
      *to++ = ' ';
      break;
    case '#':
      for (++from; *from != '#' && *from; from++)
        ;
      if (*from == '#')
        from++;
      break;
    case '-':
      if (isspace((int)*(from + 1))) {
        while ((to != line) && !isspace((int)*(--to)))
          ;
        *to++ = ' ';
      } else {
        *to++ = *from;
      }
      break;
    default:
      *to++ = (islower((int)*from)) ? (char)toupper((int)*from) : *from;
    }
    if (!from)
      break;
  }
  *to = 0;
}
```