user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<process_filter>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x4d0,%rsp
  mov    %rdi,-0x4b8(%rbp)
  mov    %rsi,-0x4c0(%rbp)
  mov    %rdx,-0x4c8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x4b0(%rbp)
  mov    -0x4b8(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x4a8(%rbp)
  mov    -0x4b8(%rbp),%rax
  mov    %rax,-0x4a0(%rbp)
  mov    -0x4a0(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x26,%al
  je     L286
  mov    -0x4a0(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7c,%al
  je     L286
  mov    -0x4a0(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L2
L286:
  mov    -0x4a0(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x26,%al
  jne    L84
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  movb   $0xa0,(%rax)
  jmp    L164
L84:
  mov    -0x4a0(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7c,%al
  jne    L210
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  movb   $0xa1,(%rax)
  jmp    L164
L210:
  mov    -0x4a0(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L164
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  movb   $0xa2,(%rax)
L164:
  addq   $0x1,-0x4a0(%rbp)
  subl   $0x1,-0x4a8(%rbp)
  jmp    L261
L83:
  addq   $0x1,-0x4a0(%rbp)
  subl   $0x1,-0x4a8(%rbp)
  mov    -0x4a0(%rbp),%rax
  mov    %rax,-0x498(%rbp)
  movl   $0x0,-0x4a4(%rbp)
  jmp    L41
L123:
  mov    -0x498(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L273
  addl   $0x1,-0x4a4(%rbp)
  jmp    L225
L273:
  mov    -0x498(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x29,%al
  jne    L244
  cmpl   $0x0,-0x4a4(%rbp)
  jle    L244
  subl   $0x1,-0x4a4(%rbp)
  jmp    L225
L244:
  mov    -0x498(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x29,%al
  jne    L225
  addq   $0x1,-0x498(%rbp)
  jmp    L153
L225:
  addq   $0x1,-0x498(%rbp)
L41:
  mov    -0x498(%rbp),%rax
  sub    -0x4a0(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x4a8(%rbp),%eax
  cltq
  cmp    %rax,%rdx
  jle    L123
L153:
  mov    -0x498(%rbp),%rax
  sub    -0x4a0(%rbp),%rax
  sub    $0x1,%eax
  mov    %eax,-0x4ac(%rbp)
  mov    -0x4ac(%rbp),%edx
  mov    -0x4a0(%rbp),%rcx
  lea    -0x490(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x4ac(%rbp),%eax
  cltq
  movb   $0x0,-0x490(%rbp,%rax,1)
  lea    -0x4b0(%rbp),%rdx
  lea    -0x410(%rbp),%rcx
  lea    -0x490(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <process_filter>
  mov    -0x4a8(%rbp),%edx
  mov    -0x498(%rbp),%rax
  sub    -0x4a0(%rbp),%rax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x4a8(%rbp)
  mov    -0x498(%rbp),%rax
  mov    %rax,-0x4a0(%rbp)
L261:
  cmpl   $0x0,-0x4a8(%rbp)
  jg     L83
  mov    -0x4b0(%rbp),%eax
  cmp    $0x7f,%eax
  jg     L288
  mov    -0x4b0(%rbp),%esi
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  mov    %esi,%edx
  mov    %dl,(%rax)
  jmp    L160
L288:
  mov    -0x4b0(%rbp),%eax
  cmp    $0xff,%eax
  jg     L118
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  movb   $0x81,(%rax)
  mov    -0x4b0(%rbp),%esi
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  mov    %esi,%edx
  mov    %dl,(%rax)
  jmp    L160
L118:
  movl   $0x0,-0x4ac(%rbp)
  jmp    L132
L20:
  addl   $0x1,-0x4ac(%rbp)
L132:
  mov    -0x4b0(%rbp),%edx
  mov    -0x4ac(%rbp),%eax
  shl    $0x3,%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  test   %eax,%eax
  jg     L20
  mov    -0x4ac(%rbp),%eax
  lea    -0x80(%rax),%esi
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  mov    %esi,%edx
  mov    %dl,(%rax)
  jmp    L223
L78:
  subl   $0x1,-0x4ac(%rbp)
  mov    -0x4b0(%rbp),%edx
  mov    -0x4ac(%rbp),%eax
  shl    $0x3,%eax
  mov    %edx,%esi
  mov    %eax,%ecx
  sar    %cl,%esi
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x4c8(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x4c0(%rbp),%rax
  add    %rdx,%rax
  mov    %esi,%edx
  mov    %dl,(%rax)
L223:
  cmpl   $0x0,-0x4ac(%rbp)
  jg     L78
L160:
  mov    -0x4b0(%rbp),%edx
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rcx
  mov    -0x4c0(%rbp),%rax
  add    %rax,%rcx
  lea    -0x410(%rbp),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <memcpy@plt>
  mov    -0x4c8(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x4b0(%rbp),%eax
  add    %eax,%edx
  mov    -0x4c8(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L63
L2:
  mov    -0x4a8(%rbp),%edx
  mov    -0x4a0(%rbp),%rcx
  lea    -0x490(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x4a8(%rbp),%eax
  cltq
  movb   $0x0,-0x490(%rbp,%rax,1)
  mov    -0x4c8(%rbp),%rdx
  mov    -0x4c0(%rbp),%rcx
  lea    -0x490(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <create_ber_filter@plt>
L63:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L48
  call   <__stack_chk_fail@plt>
L48:
  leave
  ret
```

assistant: ```c
void process_filter(char *expression, char *b_filt, int *filt_len) {
  char *filt_p, *end_p, buff[128], b_buff[1024];
  int r, object_len, buff_len = 0;
  int count;
  object_len = (int)strlen(expression);
  filt_p = expression;
  if ((*filt_p == '&') || (*filt_p == '|') || (*filt_p == '!')) {
    if (*filt_p == '&')
      b_filt[(*filt_len)++] = 0xa0;
    else if (*filt_p == '|')
      b_filt[(*filt_len)++] = 0xa1;
    else if (*filt_p == '!')
      b_filt[(*filt_len)++] = 0xa2;
    ++filt_p;
    --object_len;
    while (object_len > 0) {
      ++filt_p;
      --object_len;
      end_p = filt_p;
      count = 0;
      while (end_p - filt_p - 1 < object_len) {
        if (*end_p == '(')
          ++count;
        else if (*end_p == ')' && count > 0)
          --count;
        else if (*end_p == ')') {
          ++end_p;
          break;
        }
        ++end_p;
      }
      r = (int)(end_p - filt_p - 1);
      memcpy(buff, filt_p, r);
      buff[r] = 0;
      process_filter(buff, b_buff, &buff_len);
      object_len -= (end_p - filt_p);
      filt_p = end_p;
    }
    {
      if (buff_len < 128) {
        b_filt[(*filt_len)++] = buff_len;
      } else {
        if (buff_len < 256) {
          b_filt[(*filt_len)++] = 0x80 + 1;
          b_filt[(*filt_len)++] = buff_len;
        } else {
          r = 0;
          while ((buff_len >> (r * 8)) > 0)
            r++;
          b_filt[(*filt_len)++] = 0x80 + r;
          while (r > 0) {
            r--;
            b_filt[(*filt_len)++] = (char)(buff_len >> (r * 8));
          }
        }
      }
    }
    memcpy(&b_filt[*filt_len], b_buff, buff_len);
    *filt_len += buff_len;
  } else {
    memcpy(buff, filt_p, object_len);
    buff[object_len] = 0;
    create_ber_filter(buff, b_filt, filt_len);
  }
}
```