user: What is the c source code of the assembly code below?

```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    L184
L176:
  xor    %eax,%eax
L101:
  mov    0x648(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L240
  add    $0x658,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L184:
  movzbl 0x0(%r13),%eax
  test   %al,%al
  je     L160
  mov    %rsp,%rbp
  lea    D8(%rip),%rcx
  xor    %edx,%edx
  xor    %r14d,%r14d
  mov    %rbp,%r15
  lea    0x640(%rsp),%r12
  jmp    L3
  nopl   0x0(%rax)
L140:
  cmp    $0x29,%al
  jg     L223
  cmp    $0x28,%al
  je     L279
  cmp    $0x29,%al
  jne    L118
  test   %rdx,%rdx
  je     L176
  cmp    %rbp,%r15
  je     L176
  mov    %rdx,%rbx
  sub    $0x1,%rbx
  je     L229
  mov    %rcx,%rdi
  mov    %rbx,%rdx
  mov    $0x10,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %rbx,%rcx
L229:
  test   %r14,%r14
  je     L93
  mov    %rcx,%rdi
  mov    %r14,%rdx
  mov    $0x7c,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %r14,%rcx
L93:
  mov    -0x8(%r15),%rax
  mov    -0x10(%r15),%r14
  sub    $0x10,%r15
  lea    0x1(%rax),%rdx
L262:
  movzbl 0x1(%r13),%eax
  add    $0x1,%r13
  test   %al,%al
  je     L182
L3:
  cmp    $0x2b,%al
  jle    L140
  cmp    $0x3f,%al
  je     L223
  cmp    $0x7c,%al
  jne    L118
  test   %rdx,%rdx
  je     L176
  mov    %rdx,%rbx
  sub    $0x1,%rbx
  je     L103
  mov    %rcx,%rdi
  mov    %rbx,%rdx
  mov    $0x10,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %rbx,%rcx
L103:
  movzbl 0x1(%r13),%eax
  add    $0x1,%r13
  add    $0x1,%r14
  xor    %edx,%edx
  test   %al,%al
  jne    L3
  nopl   0x0(%rax,%rax,1)
L182:
  cmp    %rbp,%r15
  jne    L176
  mov    %rdx,%rbx
  sub    $0x1,%rbx
  je     L269
  mov    %rcx,%rdi
  mov    %rbx,%rdx
  mov    $0x10,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %rbx,%rcx
L269:
  test   %r14,%r14
  je     L109
  mov    %rcx,%rdi
  mov    %r14,%rdx
  mov    $0x7c,%esi
  call   <memset@plt>
  mov    %rax,%rcx
  add    %r14,%rcx
L109:
  movb   $0x0,(%rcx)
  lea    D8(%rip),%rax
  jmp    L101
  nopw   0x0(%rax,%rax,1)
L118:
  cmp    $0x1,%rdx
  jbe    L209
  movb   $0x10,(%rcx)
  lea    0x1(%rcx),%rax
L90:
  movzbl 0x0(%r13),%esi
  lea    0x1(%rax),%rcx
  mov    %sil,(%rax)
  jmp    L262
  cs nopw 0x0(%rax,%rax,1)
L279:
  cmp    $0x1,%rdx
  jbe    L246
  movb   $0x10,(%rcx)
  sub    $0x1,%rdx
  add    $0x1,%rcx
L246:
  movq   %r14,%xmm0
  movq   %rdx,%xmm1
  punpcklqdq %xmm1,%xmm0
  cmp    %r12,%r15
  jae    L176
  movaps %xmm0,(%r15)
  xor    %edx,%edx
  add    $0x10,%r15
  xor    %r14d,%r14d
  jmp    L262
  nopw   0x0(%rax,%rax,1)
L223:
  test   %rdx,%rdx
  je     L176
  mov    %al,(%rcx)
  add    $0x1,%rcx
  jmp    L262
  nopl   0x0(%rax)
L209:
  add    $0x1,%rdx
  mov    %rcx,%rax
  jmp    L90
L160:
  mov    $0xffffffffffffffff,%rdx
  mov    $0x10,%esi
  lea    D8(%rip),%rdi
  call   <memset@plt>
  lea    D33(%rip),%rcx
  jmp    L109
L240:
  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;
}
```