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

```asm
<ms_globmatch>:
  endbr64
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x8,%rsp
  movsbl (%rsi),%eax
  test   %al,%al
  je     L188
L224:
  movsbl 0x0(%rbp),%edx
  test   %dl,%dl
  jne    L311
  cmp    $0x2a,%al
  jne    L500
  lea    0x1(%rsi),%rbx
L352:
  movzbl (%rbx),%ecx
  cmp    $0x2a,%cl
  jne    L72
  nopl   0x0(%rax)
L125:
  movzbl 0x1(%rbx),%ecx
  add    $0x1,%rbx
  cmp    $0x2a,%cl
  je     L125
L72:
  mov    $0x1,%eax
  test   %cl,%cl
  je     L339
  lea    -0x5b(%rcx),%eax
  cmp    $0x1,%al
  jbe    L546
  cmp    $0x3f,%cl
  jne    L189
L546:
  test   %dl,%dl
  je     L500
  cs nopw 0x0(%rax,%rax,1)
L344:
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <ms_globmatch>
  test   %eax,%eax
  jne    L211
  add    $0x1,%rbp
  cmpb   $0x0,0x0(%rbp)
  jne    L344
L339:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax)
L311:
  lea    0x1(%rsi),%rbx
  cmp    $0x3f,%al
  je     L505
  jle    L377
  cmp    $0x5b,%al
  je     L432
  cmp    $0x5c,%al
  jne    L323
  movsbl 0x1(%rsi),%eax
  add    $0x2,%rsi
  test   %al,%al
  je     L358
L88:
  cmp    %eax,%edx
  jne    L500
L328:
  movsbl (%rsi),%eax
  add    $0x1,%rbp
  test   %al,%al
  jne    L224
L188:
  xor    %eax,%eax
  cmpb   $0x0,0x0(%rbp)
  sete   %al
  jmp    L339
L377:
  cmp    $0x2a,%al
  je     L352
L323:
  mov    %rbx,%rsi
  jmp    L88
  nopl   (%rax)
L432:
  movzbl 0x1(%rsi),%edi
  lea    0x2(%rsi),%rax
  cmp    $0x5e,%dil
  je     L102
  test   %dil,%dil
  je     L500
  xor    %r8d,%r8d
  jmp    L44
L280:
  cmp    %dil,%dl
  je     L140
  cmp    $0x5d,%cl
  je     L319
  cmp    %cl,%dl
  je     L140
  movzbl (%rax),%edi
  lea    0x1(%rax),%rcx
  test   %dil,%dil
  je     L523
L309:
  mov    %rax,%rbx
  mov    %rcx,%rax
L44:
  movzbl 0x1(%rbx),%ecx
  test   %cl,%cl
  je     L500
L304:
  cmp    $0x2d,%cl
  jne    L280
  movzbl 0x2(%rbx),%esi
  lea    0x2(%rbx),%rax
  test   %sil,%sil
  je     L500
  cmp    $0x5d,%sil
  je     L96
  cmp    %dil,%dl
  je     L140
  cmp    %sil,%dl
  je     L140
  cmp    %dil,%dl
  jle    L369
  cmp    %sil,%dl
  jl     L140
L369:
  lea    0x3(%rbx),%rcx
  mov    %esi,%edi
  jmp    L309
  nopl   0x0(%rax)
L505:
  mov    %rbx,%rsi
  jmp    L328
L358:
  mov    %rbx,%rsi
  mov    $0x5c,%eax
  jmp    L88
  nopl   (%rax)
L102:
  movzbl 0x2(%rsi),%edi
  lea    0x3(%rsi),%rcx
  test   %dil,%dil
  je     L331
  mov    %rax,%rbx
  mov    %rcx,%rax
  mov    $0x1,%r8d
  movzbl 0x1(%rbx),%ecx
  test   %cl,%cl
  jne    L304
  nopl   (%rax)
L500:
  xor    %eax,%eax
L413:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax)
L140:
  mov    $0x1,%edx
L512:
  cmp    %r8d,%edx
  jne    L481
  jmp    L500
  nopl   0x0(%rax)
L101:
  add    $0x1,%rax
L481:
  movzbl (%rax),%edx
  test   %dl,%dl
  je     L431
  cmp    $0x5d,%dl
  jne    L101
L431:
  lea    0x1(%rax),%rsi
  test   %dl,%dl
  jne    L328
  xor    %eax,%eax
  jmp    L413
  nopl   0x0(%rax,%rax,1)
L189:
  cmp    %cl,%dl
  je     L546
  test   %dl,%dl
  jne    L136
  jmp    L500
  xchg   %ax,%ax
L521:
  cmp    %cl,%dl
  je     L546
L136:
  movzbl 0x1(%rbp),%edx
  add    $0x1,%rbp
  test   %dl,%dl
  jne    L521
  xor    %eax,%eax
  jmp    L413
  nopl   0x0(%rax,%rax,1)
L523:
  mov    %rcx,%rax
L319:
  xor    %edx,%edx
  jmp    L512
  nopw   0x0(%rax,%rax,1)
L211:
  mov    $0x1,%eax
  jmp    L339
L96:
  cmp    %dil,%dl
  setge  %dl
  movzbl %dl,%edx
  jmp    L512
L331:
  mov    %rcx,%rax
  jmp    L481
```

assistant: ```c
int ms_globmatch(char *string, char *pattern) {
  int negate;
  int match;
  int c;
  while (*pattern) {
    if (!*string && *pattern != '*')
      return 0;
    switch (c = *pattern++) {
    case '*':
      while (*pattern == '*')
        pattern++;
      if (!*pattern)
        return 1;
      if (*pattern != '?' && *pattern != '[' && *pattern != '\\')
        while (*string && *pattern != *string)
          string++;
      while (*string) {
        if (ms_globmatch(string, pattern))
          return 1;
        string++;
      }
      return 0;
    case '?':
      if (*string)
        break;
      return 0;
    case '[':
      if (*pattern != '^')
        negate = 0;
      else {
        negate = 1;
        pattern++;
      }
      match = 0;
      while (!match && (c = *pattern++)) {
        if (!*pattern)
          return 0;
        if (*pattern == '-') {
          if (!*++pattern)
            return 0;
          if (*pattern != ']') {
            if (*string == c || *string == *pattern || (*string > c && *string < *pattern))
              match = 1;
          } else {
            if (*string >= c)
              match = 1;
            break;
          }
        } else {
          if (c == *string)
            match = 1;
          if (*pattern != ']') {
            if (*pattern == *string)
              match = 1;
          } else
            break;
        }
      }
      if (negate == match)
        return 0;
      while (*pattern && *pattern != ']')
        pattern++;
      if (!*pattern++)
        return 0;
      break;
    case '\\':
      if (*pattern)
        c = *pattern++;
    default:
      if (c != *string)
        return 0;
      break;
    }
    string++;
  }
  return !*string;
}
```