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

```asm
<wild_match>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  movq   $0x0,-0x18(%rbp)
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  movl   $0x0,-0x20(%rbp)
  movl   $0x0,-0x1c(%rbp)
  cmpq   $0x0,-0x40(%rbp)
  je     L44
  cmpq   $0x0,-0x38(%rbp)
  jne    L167
L44:
  mov    $0x0,%eax
  jmp    L278
L163:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x2a,%eax
  je     L67
  cmp    $0x3f,%eax
  jne    L102
  addq   $0x1,-0x38(%rbp)
  addq   $0x1,-0x40(%rbp)
  jmp    L167
L67:
  addq   $0x1,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L111
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  add    $0x1,%eax
  jmp    L278
L111:
  movl   $0x1,-0x1c(%rbp)
  jmp    L167
L102:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L113
  addq   $0x1,-0x38(%rbp)
L113:
  cmpl   $0x0,-0x1c(%rbp)
  je     L50
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  movl   $0x0,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L277
L40:
  addq   $0x1,-0x40(%rbp)
L277:
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L154
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,%ebx
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  cmp    %eax,%ebx
  jne    L40
L154:
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L50
  movl   $0x1,-0x28(%rbp)
  jmp    L167
L50:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  mov    %eax,%ebx
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <toupper@plt>
  cmp    %eax,%ebx
  je     L124
  cmpq   $0x0,-0x18(%rbp)
  jne    L179
  mov    $0x0,%eax
  jmp    L278
L179:
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x1,%rax
  mov    %rax,-0x38(%rbp)
  jmp    L167
L124:
  movl   $0x0,-0x1c(%rbp)
  addl   $0x1,-0x24(%rbp)
  movl   $0x1,-0x28(%rbp)
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L56
  addq   $0x1,-0x38(%rbp)
L56:
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L167
  addq   $0x1,-0x40(%rbp)
L167:
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L212
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L163
L212:
  cmpl   $0x0,-0x28(%rbp)
  je     L264
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L264
  mov    -0x40(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L264
  mov    -0x24(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  add    $0x1,%eax
  jmp    L278
L264:
  mov    $0x0,%eax
L278:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int wild_match(char *wild, char *matchtext) {
  char *fallback = 0;
  int match = 0, count = 0, saved = 0, wildcard = 0;
  if (!matchtext || !wild)
    return 0;
  while (*matchtext && *wild) {
    switch (*wild) {
    case '?':
      wild++;
      matchtext++;
      break;
      while ((*(matchtext++) == ' '))
        ;
      break;
    case '*':
      if (!*++wild)
        return (count + saved + 1);
      wildcard = 1;
      break;
    default:
      if (*wild == '\\')
        wild++;
      if (wildcard) {
        saved = count;
        match = count = 0;
        fallback = wild;
        while (*matchtext && (toupper(*wild) != toupper(*matchtext)))
          matchtext++;
        if (!*matchtext) {
          match = 1;
          break;
        }
      }
      if (toupper(*wild) != toupper(*matchtext)) {
        if (!fallback)
          return 0;
        count = saved;
        wild = fallback - 1;
        break;
      }
      wildcard = 0;
      count++;
      match = 1;
      if (*wild)
        wild++;
      if (*matchtext)
        matchtext++;
    }
  }
  return (!match || *wild || *matchtext) ? 0 : (count + saved + 1);
}
```