user: Please show me the C implementation that matches the assembly code listed below:

```asm
<fc_glob>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
L26:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x5b,%eax
  je     L247
  cmp    $0x5b,%eax
  jg     L89
  cmp    $0x3f,%eax
  je     L196
  cmp    $0x3f,%eax
  jg     L89
  test   %eax,%eax
  je     L235
  cmp    $0x2a,%eax
  je     L290
  jmp    L89
L235:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  jmp    L260
L196:
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L198
  mov    $0x0,%eax
  jmp    L260
L198:
  addq   $0x4,-0x18(%rbp)
  jmp    L72
L290:
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L297
  mov    $0x1,%eax
  jmp    L260
L297:
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fc_glob>
  test   %eax,%eax
  je     L163
  mov    $0x1,%eax
  jmp    L260
L163:
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L297
  mov    $0x0,%eax
  jmp    L260
L247:
  movl   $0x0,-0x4(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x5e,%eax
  jne    L49
  movl   $0x1,-0x4(%rbp)
  addq   $0x4,-0x18(%rbp)
  jmp    L49
L94:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  je     L205
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x5d,%eax
  jne    L79
L205:
  mov    $0x0,%eax
  jmp    L260
L79:
  addq   $0x4,-0x18(%rbp)
L49:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  sete   %al
  movzbl %al,%eax
  cmp    %eax,-0x4(%rbp)
  je     L94
L68:
  mov    -0x18(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L239
  mov    $0x0,%eax
  jmp    L260
L239:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x5d,%eax
  jne    L68
  addq   $0x4,-0x18(%rbp)
  addq   $0x4,-0x20(%rbp)
  jmp    L72
L89:
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    (%rax),%eax
  cmp    %eax,%ecx
  je     L201
  mov    $0x0,%eax
  jmp    L260
L201:
  nop
L72:
  jmp    L26
L260:
  leave
  ret
```

assistant: ```c
bool fc_glob(const char32_t *pat, const char32_t *str) {
  for (;;) {
    switch (*pat) {
    case U'\0':
      return !*str;
      break;
    case U'?':
      if (!*str++)
        return false;
      pat++;
      break;
    case U'*':
      if (!*++pat)
        return true;
      do {
        if (fc_glob(pat, str))
          return true;
      } while (*str++);
      return false;
      break;
    case U'[': {
      bool invert = false;
      pat++;
      if (*pat == U'^') {
        invert = true;
        pat++;
      }
      while ((*pat == *str) == invert) {
        if (!*pat || *pat == U']')
          return false;
        pat++;
      }
      do {
        if (!*pat++)
          return false;
      } while (*pat != U']');
      pat++;
      str++;
      break;
    }
    default:
      if (*str++ != *pat++)
        return false;
      break;
    }
  }
  return false;
}
```