user: Demonstrate the C code that generates the assembly output below:

```asm
<fpattern_submatch>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %edx,-0x54(%rbp)
  mov    %ecx,-0x58(%rbp)
  jmp    L401
L74:
  mov    -0x50(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x20(%rbp)
  addq   $0x1,-0x48(%rbp)
  cmpl   $0x7b,-0x20(%rbp)
  je     L128
  cmpl   $0x7b,-0x20(%rbp)
  jg     L706
  cmpl   $0x5c,-0x20(%rbp)
  je     L133
  cmpl   $0x5c,-0x20(%rbp)
  jg     L706
  cmpl   $0x5b,-0x20(%rbp)
  je     L416
  cmpl   $0x5b,-0x20(%rbp)
  jg     L706
  cmpl   $0x3f,-0x20(%rbp)
  je     L396
  cmpl   $0x3f,-0x20(%rbp)
  jg     L706
  cmpl   $0x21,-0x20(%rbp)
  je     L204
  cmpl   $0x2a,-0x20(%rbp)
  je     L96
  jmp    L706
L396:
  cmpl   $0x0,-0x54(%rbp)
  jne    L135
  mov    $0x0,%eax
  jmp    L581
L135:
  addq   $0x1,-0x50(%rbp)
  subl   $0x1,-0x54(%rbp)
  jmp    L401
L96:
  mov    -0x54(%rbp),%eax
  mov    %eax,-0x30(%rbp)
  jmp    L622
L788:
  mov    -0x54(%rbp),%eax
  sub    -0x30(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x50(%rbp),%rax
  lea    (%rcx,%rax,1),%rsi
  mov    -0x58(%rbp),%ecx
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <fpattern_submatch>
  test   %eax,%eax
  je     L108
  mov    $0x1,%eax
  jmp    L581
L108:
  subl   $0x1,-0x30(%rbp)
L622:
  cmpl   $0x0,-0x30(%rbp)
  jns    L788
  mov    $0x0,%eax
  jmp    L581
L133:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x58(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  mov    %eax,%ebx
  mov    -0x58(%rbp),%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  cmp    %eax,%ebx
  jne    L465
  cmpl   $0x0,-0x20(%rbp)
  jne    L115
L465:
  mov    $0x0,%eax
  jmp    L581
L115:
  addq   $0x1,-0x50(%rbp)
  subl   $0x1,-0x54(%rbp)
  addq   $0x1,-0x48(%rbp)
  jmp    L401
L416:
  movl   $0x1,-0x2c(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L390
  addq   $0x1,-0x48(%rbp)
  movl   $0x0,-0x2c(%rbp)
L390:
  cmpl   $0x0,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x28(%rbp)
  jmp    L53
L612:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L652
  addq   $0x1,-0x48(%rbp)
L652:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L179
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L282
  addq   $0x1,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L630
  addq   $0x1,-0x48(%rbp)
L630:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L364
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x24(%rbp)
L282:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L12
  mov    -0x58(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  mov    %eax,%ebx
  mov    -0x58(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  cmp    %eax,%ebx
  jl     L53
  mov    -0x58(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  mov    %eax,%ebx
  mov    -0x58(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  cmp    %eax,%ebx
  jg     L53
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x28(%rbp)
L53:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  je     L408
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L612
  jmp    L408
L179:
  nop
  jmp    L408
L364:
  nop
  jmp    L408
L12:
  nop
L408:
  cmpl   $0x0,-0x28(%rbp)
  jne    L677
  mov    $0x0,%eax
  jmp    L581
L677:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L455
  mov    $0x0,%eax
  jmp    L581
L455:
  addq   $0x1,-0x50(%rbp)
  subl   $0x1,-0x54(%rbp)
  addq   $0x1,-0x48(%rbp)
  jmp    L401
L128:
  movl   $0x1,-0x2c(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L496
  addq   $0x1,-0x48(%rbp)
  movl   $0x0,-0x2c(%rbp)
L496:
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x28(%rbp)
  jmp    L120
L28:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L508
  addq   $0x1,-0x48(%rbp)
L508:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L759
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L344
  addq   $0x1,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L570
  addq   $0x1,-0x48(%rbp)
L570:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L697
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x24(%rbp)
L344:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L54
  mov    -0x58(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  mov    %eax,%ebx
  mov    -0x58(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  cmp    %eax,%ebx
  jl     L120
  mov    -0x58(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  mov    %eax,%ebx
  mov    -0x58(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  cmp    %eax,%ebx
  jg     L120
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  jmp    L46
L444:
  addq   $0x1,-0x48(%rbp)
L46:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7d,%al
  je     L69
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L444
  jmp    L69
L120:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7d,%al
  je     L483
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L28
  jmp    L483
L759:
  nop
  jmp    L483
L697:
  nop
  jmp    L483
L54:
  nop
  jmp    L483
L69:
  nop
L483:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L285
  mov    $0x0,%eax
  jmp    L581
L285:
  cmpl   $0x0,-0x28(%rbp)
  je     L301
  addq   $0x1,-0x50(%rbp)
  subl   $0x1,-0x54(%rbp)
  mov    -0x50(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x34(%rbp)
  cmpl   $0x0,-0x54(%rbp)
  jle    L301
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x48(%rbp)
L301:
  cmpl   $0x0,-0x28(%rbp)
  je     L138
  cmpl   $0x0,-0x54(%rbp)
  jg     L496
L138:
  addq   $0x1,-0x48(%rbp)
  jmp    L401
L204:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L582
  mov    $0x0,%eax
  jmp    L581
L582:
  mov    -0x58(%rbp),%ecx
  mov    -0x54(%rbp),%edx
  mov    -0x50(%rbp),%rsi
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <fpattern_submatch>
  mov    %eax,-0x30(%rbp)
  cmpl   $0x0,-0x30(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L581
L706:
  mov    -0x58(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  mov    %eax,%ebx
  mov    -0x58(%rbp),%edx
  mov    -0x20(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <lowercase@plt>
  cmp    %eax,%ebx
  je     L502
  mov    $0x0,%eax
  jmp    L581
L502:
  addq   $0x1,-0x50(%rbp)
  subl   $0x1,-0x54(%rbp)
  nop
L401:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L74
  cmpl   $0x0,-0x54(%rbp)
  je     L727
  mov    $0x0,%eax
  jmp    L581
L727:
  mov    $0x1,%eax
L581:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int fpattern_submatch(const char *pat, const char *fname, int flength, int keepcase) {
  int fch;
  int pch;
  int i;
  int yes, match;
  int lo, hi;
  while (*pat != '\0') {
    fch = *fname;
    pch = *pat;
    pat++;
    switch (pch) {
    case '?':
      if (flength == 0)
        return (0);
      fname++;
      flength--;
      break;
    case '*':
      i = flength;
      while (i >= 0) {
        if (fpattern_submatch(pat, fname + i, flength - i, keepcase))
          return (1);
        i--;
      }
      return (0);
    case '\\':
      pch = *pat;
      if (lowercase(fch, keepcase) != lowercase(pch, keepcase) || pch == '\0')
        return (0);
      fname++;
      flength--;
      pat++;
      break;
    case '[':
      yes = 1;
      if (*pat == '!') {
        pat++;
        yes = 0;
      }
      match = !yes;
      while (*pat != ']' && *pat != '\0') {
        if (*pat == '\\')
          pat++;
        if (*pat == '\0')
          break;
        lo = *pat++;
        hi = lo;
        if (*pat == '-') {
          pat++;
          if (*pat == '\\')
            pat++;
          if (*pat == '\0')
            break;
          hi = *pat++;
        }
        if (*pat == '\0')
          break;
        if (lowercase(fch, keepcase) >= lowercase(lo, keepcase) && lowercase(fch, keepcase) <= lowercase(hi, keepcase))
          match = yes;
      }
      if (!match)
        return (0);
      if (*pat == '\0')
        return (0);
      fname++;
      flength--;
      pat++;
      break;
    case '{':
      yes = 1;
      if (*pat == '!') {
        pat++;
        yes = 0;
      }
      do {
        const char *org_pat = pat;
        match = !yes;
        while (*pat != '}' && *pat != '\0') {
          if (*pat == '\\')
            pat++;
          if (*pat == '\0')
            break;
          lo = *pat++;
          hi = lo;
          if (*pat == '-') {
            pat++;
            if (*pat == '\\')
              pat++;
            if (*pat == '\0')
              break;
            hi = *pat++;
          }
          if (*pat == '\0')
            break;
          if (lowercase(fch, keepcase) >= lowercase(lo, keepcase) && lowercase(fch, keepcase) <= lowercase(hi, keepcase)) {
            match = yes;
            while (*pat != '}' && *pat != '\0')
              pat++;
            break;
          }
        }
        if (*pat == '\0')
          return (0);
        if (match) {
          fname++;
          flength--;
          fch = *fname;
          if (flength > 0)
            pat = org_pat;
        }
      } while (match && flength > 0);
      pat++;
      break;
    case '!':
      if (*pat == '\0')
        return (0);
      i = fpattern_submatch(pat, fname, flength, keepcase);
      return !i;
    default:
      if (lowercase(fch, keepcase) != lowercase(pch, keepcase))
        return (0);
      fname++;
      flength--;
      break;
    }
  }
  if (flength != 0)
    return (0);
  return (1);
}
```