user: 下面的汇编指令对应的C源代码是什么:

```asm
<ASAPInfo_ParseTmcTitle>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %ecx,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  add    $0x1d,%eax
  mov    %eax,-0x8(%rbp)
  jmp    L51
L67:
  subl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jge    L51
  mov    -0x1c(%rbp),%eax
  jmp    L10
L51:
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L67
  cmpl   $0x0,-0x1c(%rbp)
  jle    L73
  mov    -0x1c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x1c(%rbp)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x20,(%rax)
  mov    -0x1c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x1c(%rbp)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x7c,(%rax)
  mov    -0x1c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x1c(%rbp)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x20,(%rax)
  jmp    L73
L93:
  mov    -0x20(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x20(%rbp)
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x7f,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  cmp    $0x1a,%eax
  seta   %dl
  test   %dl,%dl
  jne    L42
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  mov    %rax,%rdx
  and    $0x8d02a,%edx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L101
  mov    %rax,%rdx
  and    $0x5000000,%edx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L24
  and    $0x100000,%eax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  je     L42
  movl   $0x2a,-0x4(%rbp)
  jmp    L29
L101:
  addl   $0x60,-0x4(%rbp)
  jmp    L29
L24:
  movl   $0x7a,-0x4(%rbp)
  jmp    L29
L42:
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <ASAPInfo_IsValidChar@plt>
  test   %eax,%eax
  jne    L8
  movl   $0x20,-0x4(%rbp)
L8:
  nop
L29:
  mov    -0x1c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x1c(%rbp)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    -0x4(%rbp),%edx
  mov    %dl,(%rax)
L73:
  mov    -0x20(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jle    L93
  mov    -0x1c(%rbp),%eax
L10:
  leave
  ret
```

assistant: ```c
int ASAPInfo_ParseTmcTitle(unsigned char *title, int titleLen, unsigned char const *module, int moduleOffset) {
  int lastOffset = moduleOffset + 29;
  while (module[lastOffset] == 32) {
    if (--lastOffset < moduleOffset)
      return titleLen;
  }
  if (titleLen > 0) {
    title[titleLen++] = 32;
    title[titleLen++] = 124;
    title[titleLen++] = 32;
  }
  while (moduleOffset <= lastOffset) {
    int c = module[moduleOffset++] & 127;
    switch (c) {
    case 20:
      c = 42;
      break;
    case 1:
    case 3:
    case 5:
    case 12:
    case 14:
    case 15:
    case 19:
      c += 96;
      break;
    case 24:
    case 26:
      c = 122;
      break;
    default:
      if (!ASAPInfo_IsValidChar(c))
        c = 32;
      break;
    }
    title[titleLen++] = c;
  }
  return titleLen;
}
```