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

```asm
<regexp_infx2postfx>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x658,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x648(%rsp)
  xor    %eax,%eax
  call   <strlen@plt>
  cmp    $0xfff,%eax
  jle    L48
L28:
  xor    %eax,%eax
L136:
  mov    0x648(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L121
  add    $0x658,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L48:
  movzbl 0x0(%r13),%eax
  test   %al,%al
  je     L180
  mov    %rsp,%rbp
  lea    D30(%rip),%rcx
  xor    %edx,%edx
  xor    %r15d,%r15d
  mov    %rbp,%r14
  lea    0x640(%rsp),%r12
  jmp    L270
  nopl   0x0(%rax)
L200:
  cmp    $0x29,%al
  jg     L261
  cmp    $0x28,%al
  je     L222
  cmp    $0x29,%al
  jne    L274
  test   %rdx,%rdx
  je     L28
  cmp    %rbp,%r14
  je     L28
  mov    %rdx,%rbx
  sub    $0x1,%rbx
  je     L128
  mov    %rcx,%rdi
  mov    %rbx,%rdx
  mov    $0x10,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %rbx,%rcx
L128:
  test   %r15,%r15
  je     L295
  mov    %rcx,%rdi
  mov    %r15,%rdx
  mov    $0x7c,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %r15,%rcx
L295:
  mov    -0x8(%r14),%rax
  mov    -0x10(%r14),%r15
  sub    $0x10,%r14
  lea    0x1(%rax),%rdx
L201:
  movzbl 0x1(%r13),%eax
  add    $0x1,%r13
  test   %al,%al
  je     L55
L270:
  cmp    $0x2b,%al
  jle    L200
  cmp    $0x3f,%al
  je     L261
  cmp    $0x7c,%al
  jne    L274
  test   %rdx,%rdx
  je     L28
  mov    %rdx,%rbx
  sub    $0x1,%rbx
  je     L284
  mov    %rcx,%rdi
  mov    %rbx,%rdx
  mov    $0x10,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %rbx,%rcx
L284:
  movzbl 0x1(%r13),%eax
  add    $0x1,%r13
  add    $0x1,%r15
  xor    %edx,%edx
  test   %al,%al
  jne    L270
  nopl   0x0(%rax,%rax,1)
L55:
  cmp    %rbp,%r14
  jne    L28
  mov    %rdx,%rbx
  sub    $0x1,%rbx
  je     L78
  mov    %rcx,%rdi
  mov    %rbx,%rdx
  mov    $0x10,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %rbx,%rcx
L78:
  test   %r15,%r15
  je     L67
  mov    %rcx,%rdi
  mov    %r15,%rdx
  mov    $0x7c,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %r15,%rcx
L67:
  movb   $0x0,(%rcx)
  lea    D30(%rip),%rax
  jmp    L136
  nopw   0x0(%rax,%rax,1)
L274:
  cmp    $0x1,%rdx
  jbe    L131
  movb   $0x10,(%rcx)
  lea    0x1(%rcx),%rax
L181:
  movzbl 0x0(%r13),%esi
  lea    0x1(%rax),%rcx
  mov    %sil,(%rax)
  jmp    L201
  cs nopw 0x0(%rax,%rax,1)
L222:
  cmp    $0x1,%rdx
  jbe    L163
  movb   $0x10,(%rcx)
  sub    $0x1,%rdx
  add    $0x1,%rcx
L163:
  cmp    %r12,%r14
  jae    L28
  mov    %r15,(%r14)
  add    $0x10,%r14
  xor    %r15d,%r15d
  mov    %rdx,-0x8(%r14)
  xor    %edx,%edx
  jmp    L201
  nop
L261:
  test   %rdx,%rdx
  je     L28
  mov    %al,(%rcx)
  add    $0x1,%rcx
  jmp    L201
  nopl   0x0(%rax)
L131:
  add    $0x1,%rdx
  mov    %rcx,%rax
  jmp    L181
L180:
  mov    $0xffffffffffffffff,%rdx
  mov    $0x10,%esi
  lea    D30(%rip),%rdi
  call   <memset@plt>
  lea    D1(%rip),%rcx
  jmp    L67
L121:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
char *regexp_infx2postfx(char *infx) {
  size_t alternate_cnt = 0, atomic_cnt = 0;
  static char buffer[8192];
  char *dest = buffer;
  struct {
    size_t alternate_cnt;
    size_t atomic_cnt;
  } subexpr_stack[100], *stack_ptr;
  stack_ptr = subexpr_stack;
  if (strlen(infx) >= 8192 / 2) {
    return NULL;
  }
  for (; *infx; infx++) {
    switch (*infx) {
    case '(':
      if (atomic_cnt > 1) {
        atomic_cnt--;
        *dest++ = 16;
      }
      if (stack_ptr >= subexpr_stack + 100) {
        return NULL;
      }
      stack_ptr->alternate_cnt = alternate_cnt;
      stack_ptr->atomic_cnt = atomic_cnt;
      stack_ptr++;
      alternate_cnt = 0;
      atomic_cnt = 0;
      break;
    case ')':
      if (stack_ptr == subexpr_stack) {
        return NULL;
      }
      if (atomic_cnt == 0) {
        return NULL;
      }
      while (--atomic_cnt > 0) {
        *dest++ = 16;
      }
      for (; alternate_cnt > 0; alternate_cnt--) {
        *dest++ = '|';
      }
      stack_ptr--;
      alternate_cnt = stack_ptr->alternate_cnt;
      atomic_cnt = stack_ptr->atomic_cnt;
      atomic_cnt++;
      break;
    case '|':
      if (atomic_cnt == 0) {
        return NULL;
      }
      while (--atomic_cnt > 0) {
        *dest++ = 16;
      }
      alternate_cnt++;
      break;
    case '*':
    case '+':
    case '?':
      if (atomic_cnt == 0) {
        return NULL;
      }
      *dest++ = *infx;
      break;
    default:
      if (atomic_cnt > 1) {
        atomic_cnt--;
        *dest++ = 16;
      }
      *dest++ = *infx;
      atomic_cnt++;
      break;
    }
  }
  if (stack_ptr != subexpr_stack) {
    return NULL;
  }
  while (--atomic_cnt > 0) {
    *dest++ = 16;
  }
  for (; alternate_cnt > 0; alternate_cnt--) {
    *dest++ = '|';
  }
  *dest = 0;
  return buffer;
}
```