user: What would the C source look like for the assembly code provided here?

```asm
<DoMatch>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%rbp
  movzbl (%rsi),%eax
  test   %al,%al
  je     L159
  mov    %rsi,%rbx
  mov    $0x1,%r14d
L298:
  movzbl 0x0(%rbp),%edi
  cmp    $0x2a,%al
  je     L285
  test   %dil,%dil
  je     L196
L285:
  cmp    $0x5b,%al
  je     L160
  jg     L57
  cmp    $0x2a,%al
  je     L150
  cmp    $0x3f,%al
  jne    L311
L289:
  add    $0x1,%rbp
  lea    0x1(%rbx),%rdx
  movzbl 0x1(%rbx),%eax
  test   %al,%al
  je     L159
  mov    %rdx,%rbx
  jmp    L298
L57:
  cmp    $0x5c,%al
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbx
L311:
  movsbl %dil,%edi
  call   <toupper@plt>
  mov    %eax,%r12d
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    %eax,%r12d
  je     L289
  mov    $0x0,%eax
L281:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L150:
  add    $0x1,%rbx
  movzbl (%rbx),%edx
  cmp    $0x2a,%dl
  je     L150
  mov    $0x1,%eax
  test   %dl,%dl
  je     L281
L326:
  cmpb   $0x0,0x0(%rbp)
  je     L9
  lea    0x1(%rbp),%r12
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <DoMatch>
  test   %eax,%eax
  jne    L281
  mov    %r12,%rbp
  jmp    L326
L9:
  mov    $0xffffffff,%eax
  jmp    L281
L160:
  movzbl 0x1(%rbx),%eax
  cmp    $0x5e,%al
  sete   %cl
  movzbl %cl,%ecx
  mov    %ecx,0xc(%rsp)
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbx
  movzbl 0x1(%rbx),%edi
  cmp    $0x5d,%dil
  je     L55
  mov    $0x0,%r15d
  cmp    $0x2d,%dil
  je     L55
L148:
  movsbl (%rbx),%edx
  lea    0x1(%rbx),%r13
  movzbl 0x1(%rbx),%eax
  cmp    $0x5d,%al
  je     L235
  test   %al,%al
  jne    L228
L235:
  cmp    %r15d,0xc(%rsp)
  je     L54
  mov    %r13,%rbx
  jmp    L289
L55:
  add    $0x1,%rbx
  movsbl %dil,%edi
  call   <toupper@plt>
  mov    %eax,%r12d
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    %eax,%r12d
  sete   %r15b
  movzbl %r15b,%r15d
  jmp    L148
L203:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  mov    %eax,%r12d
  movsbl 0x1(%rbx),%edi
  call   <toupper@plt>
  cmp    %eax,%r12d
  je     L343
L328:
  mov    %r13,%rbx
L287:
  movsbl (%rbx),%edx
  lea    0x1(%rbx),%r13
  movzbl 0x1(%rbx),%eax
  cmp    $0x5d,%al
  je     L235
  test   %al,%al
  je     L235
L228:
  cmp    $0x2d,%al
  jne    L203
  movzbl 0x2(%rbx),%eax
  cmp    $0x5d,%al
  je     L203
  movzbl 0x0(%rbp),%ecx
  lea    0x2(%rbx),%r13
  mov    $0x0,%esi
  cmp    %cl,%al
  jl     L180
  movsbl %cl,%ecx
  cmp    %edx,%ecx
  setge  %sil
  movzbl %sil,%esi
L180:
  test   %esi,%esi
  je     L328
  mov    %r13,%rbx
  mov    %r14d,%r15d
  jmp    L287
L343:
  mov    %r13,%rbx
  mov    %r14d,%r15d
  jmp    L287
L159:
  cmpb   $0x0,0x0(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L281
L196:
  mov    $0xffffffff,%eax
  jmp    L281
L54:
  mov    $0x0,%eax
  jmp    L281
```

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';
}
```