user: 请将以下的汇编代码转换成C语言代码：

```asm
<purify_special_char>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbp
  mov    %rsi,%rbx
  mov    %rdx,%r13
  movslq (%rsi),%rax
  mov    $0x0,%edi
  cmpb   $0x7b,0x0(%rbp,%rax,1)
  je     L101
L76:
  call   <assert@plt>
  mov    (%rbx),%eax
  lea    0x2(%rax),%r12d
  mov    %r12d,(%rbx)
  movslq %r12d,%r12
L94:
  mov    %r12d,%r14d
  movsbl 0x0(%rbp,%r12,1),%edi
  call   <isalpha@plt>
  add    $0x1,%r12
  test   %rax,%rax
  jne    L94
  mov    (%rbx),%esi
  cmp    %r14d,%esi
  sete   %al
  movzbl %al,%eax
  add    %eax,%r14d
  mov    $0x0,%ecx
  mov    %r14d,%edx
  mov    %rbp,%rdi
  call   <foreign_letter@plt>
  test   %rax,%rax
  jne    L0
  mov    %r14d,(%rbx)
L86:
  mov    (%rbx),%eax
  movslq %eax,%rdx
  movzbl 0x0(%rbp,%rdx,1),%edi
  test   %dil,%dil
  je     L39
  mov    $0x1,%r12d
  jmp    L157
L101:
  cmpb   $0x5c,0x1(%rbp,%rax,1)
  sete   %dil
  movzbl %dil,%edi
  jmp    L76
L0:
  mov    %r14d,%eax
  sub    (%rbx),%eax
  sub    $0x1,%eax
  cmp    $0x1,%eax
  setbe  %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    (%rbx),%edx
  lea    0x1(%rdx),%eax
  mov    %eax,(%rbx)
  mov    0x0(%r13),%eax
  lea    0x1(%rax),%ecx
  mov    %ecx,0x0(%r13)
  movslq %edx,%rdx
  movzbl 0x0(%rbp,%rdx,1),%edx
  cltq
  mov    %dl,0x0(%rbp,%rax,1)
  mov    (%rbx),%eax
  cmp    %r14d,%eax
  jge    L86
  lea    0x1(%rax),%edx
  mov    %edx,(%rbx)
  cltq
  movsbl 0x0(%rbp,%rax,1),%edi
  mov    0x0(%r13),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x0(%r13)
  cltq
  lea    0x0(%rbp,%rax,1),%r12
  call   <tolower@plt>
  mov    %al,(%r12)
  jmp    L86
L14:
  add    $0x1,%r12d
  add    $0x1,%eax
  mov    %eax,(%rbx)
L11:
  mov    (%rbx),%eax
  movslq %eax,%rdx
  movzbl 0x0(%rbp,%rdx,1),%edi
  test   %dil,%dil
  je     L39
L157:
  cmp    $0x7b,%dil
  je     L14
  cmp    $0x7d,%dil
  je     L64
  movsbl %dil,%edi
  call   <isalpha@plt>
  test   %rax,%rax
  je     L31
  mov    (%rbx),%edx
  lea    0x1(%rdx),%eax
  mov    %eax,(%rbx)
  mov    0x0(%r13),%eax
  lea    0x1(%rax),%ecx
  mov    %ecx,0x0(%r13)
  movslq %edx,%rdx
  movzbl 0x0(%rbp,%rdx,1),%edx
  cltq
  mov    %dl,0x0(%rbp,%rax,1)
  jmp    L11
L64:
  sub    $0x1,%r12d
  je     L39
  add    $0x1,%eax
  mov    %eax,(%rbx)
  jmp    L11
L31:
  addl   $0x1,(%rbx)
  jmp    L11
L39:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

assistant: ```c
void purify_special_char(char *str, int *src, int *dst) {
  int depth;
  int peek;
  assert(str[*src] == '{' && str[*src + 1] == '\\');
  depth = 1;
  *src += 2;
  peek = *src;
  while (isalpha(str[peek]))
    peek++;
  if (peek == *src)
    peek++;
  if (foreign_letter(str, *src, peek, NULL)) {
    assert(peek - *src == 1 || peek - *src == 2);
    str[(*dst)++] = str[(*src)++];
    if (*src < peek)
      str[(*dst)++] = tolower(str[(*src)++]);
  } else {
    *src = peek;
  }
  while (str[*src]) {
    switch (str[*src]) {
    case '{':
      depth++;
      (*src)++;
      break;
    case '}':
      depth--;
      if (depth == 0)
        return;
      (*src)++;
      break;
    default:
      if (isalpha(str[*src]))
        str[(*dst)++] = str[(*src)++];
      else
        (*src)++;
    }
  }
}
```