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

```asm
<DoMatch>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  movzbl (%rsi),%eax
  test   %al,%al
  je     L226
  movsbl (%r14),%edi
  mov    %rsi,%rbx
  mov    $0x1,%ebp
  cmp    $0x2a,%al
  je     L196
L149:
  test   %dil,%dil
  je     L83
L196:
  cmp    $0x5b,%al
  je     L239
L304:
  jg     L13
  cmp    $0x2a,%al
  je     L65
  cmp    $0x3f,%al
  jne    L179
L185:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%r14
  lea    0x1(%rbx),%rdx
  test   %al,%al
  je     L226
  movsbl (%r14),%edi
  mov    %rdx,%rbx
  cmp    $0x2a,%al
  jne    L149
  cmp    $0x5b,%al
  jne    L304
L239:
  movzbl 0x1(%rbx),%eax
  xor    %edx,%edx
  cmp    $0x5e,%al
  sete   %dl
  mov    %edx,0xc(%rsp)
  jne    L97
  movzbl 0x2(%rbx),%eax
  add    $0x1,%rbx
L97:
  cmp    $0x5d,%al
  je     L286
  xor    %r12d,%r12d
  cmp    $0x2d,%al
  je     L286
L174:
  movsbl (%rbx),%ecx
  lea    0x1(%rbx),%r15
  cmp    $0x5d,%al
  jne    L172
  jmp    L240
  nop
L134:
  movzbl 0x2(%rbx),%eax
  cmp    $0x5d,%al
  je     L22
  add    $0x2,%rbx
  cmp    %dil,%al
  jl     L69
  cmp    %ecx,%edi
  cmovge %ebp,%r12d
L69:
  movsbl %al,%ecx
  movzbl 0x1(%rbx),%eax
  lea    0x1(%rbx),%r15
  cmp    $0x5d,%al
  je     L240
L172:
  test   %al,%al
  je     L240
  movsbl (%r14),%edi
  cmp    $0x2d,%al
  je     L134
L22:
  call   <toupper@plt>
  movsbl 0x1(%rbx),%edi
  mov    %r15,%rbx
  mov    %eax,%r13d
  call   <toupper@plt>
  mov    %eax,%r8d
  movzbl (%r15),%eax
  lea    0x1(%rbx),%r15
  cmp    %r8d,%r13d
  movsbl %al,%ecx
  movzbl 0x1(%rbx),%eax
  cmove  %ebp,%r12d
  cmp    $0x5d,%al
  jne    L172
L240:
  cmp    %r12d,0xc(%rsp)
  je     L186
  mov    %r15,%rbx
  jmp    L185
  nopw   0x0(%rax,%rax,1)
L13:
  cmp    $0x5c,%al
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbx
L179:
  call   <toupper@plt>
  movsbl (%rbx),%edi
  mov    %eax,%r12d
  call   <toupper@plt>
  cmp    %eax,%r12d
  je     L185
L186:
  xor    %eax,%eax
L27:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L65:
  movzbl 0x1(%rbx),%edx
  add    $0x1,%rbx
  cmp    $0x2a,%dl
  je     L65
  mov    $0x1,%eax
  test   %dl,%dl
  je     L27
  test   %dil,%dil
  je     L83
L244:
  mov    %rbx,%rsi
  mov    %r14,%rdi
  lea    0x1(%r14),%rbp
  call   <DoMatch>
  test   %eax,%eax
  jne    L27
  movzbl 0x1(%r14),%edi
  mov    %rbp,%r14
  test   %dil,%dil
  jne    L244
L83:
  add    $0x18,%rsp
  mov    $0xffffffff,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L286:
  movsbl %al,%edi
  xor    %r12d,%r12d
  lea    0x1(%rbx),%r13
  call   <toupper@plt>
  movsbl (%r14),%edi
  mov    %eax,%r15d
  call   <toupper@plt>
  cmp    %eax,%r15d
  movzbl 0x2(%rbx),%eax
  mov    %r13,%rbx
  sete   %r12b
  jmp    L174
  xchg   %ax,%ax
L226:
  xor    %eax,%eax
  cmpb   $0x0,(%r14)
  sete   %al
  jmp    L27
```

assistant: ```c
int DoMatch(char *text, char *p) {
  register int last;
  register int matched;
  register int reverse;
  for (; *p; text++, p++) {
    if (*text == '\0' && *p != '*')
      return -1;
    switch (*p) {
    case '\\':
      p++;
    default:
      if (toupper(*text) != toupper(*p))
        return 0;
      continue;
    case '?':
      continue;
    case '*':
      while (*++p == '*')
        continue;
      if (*p == '\0')
        return 1;
      while (*text)
        if ((matched = DoMatch(text++, p)) != 0)
          return matched;
      return -1;
    case '[':
      reverse = p[1] == '^' ? 1 : 0;
      if (reverse)
        p++;
      matched = 0;
      if (p[1] == ']' || p[1] == '-')
        if (toupper(*++p) == toupper(*text))
          matched = 1;
      for (last = *p; *++p && *p != ']'; last = *p)
        if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : toupper(*text) == toupper(*p))
          matched = 1;
      if (matched == reverse)
        return 0;
      continue;
    }
  }
  return *text == '\0';
}
```