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

```asm
<pmatch>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbp
  mov    %edx,%r12d
  mov    $0x1,%esi
  jmp    L159
L607:
  cmp    $0x81,%al
  jne    L623
  mov    %rbp,%rax
  test   %r12d,%r12d
  je     L498
  cmpb   $0x81,0x0(%rbp)
  sete   %al
  movzbl %al,%eax
  add    %rbp,%rax
L498:
  lea    0x1(%rax),%rbp
  lea    0x2(%rdi),%rbx
  movzbl 0x1(%rdi),%edi
  cmp    %dil,(%rax)
  je     L349
  mov    $0x0,%eax
  jmp    L367
L449:
  cmp    $0x3f,%al
  je     L427
  cmp    $0x5b,%al
  jne    L623
  movzbl 0x1(%rdi),%r8d
  add    $0x2,%rdi
  cmp    $0x21,%r8b
  cmovne %rbx,%rdi
  mov    %rdi,%rcx
  jmp    L518
L427:
  mov    %rbp,%rax
  test   %r12d,%r12d
  je     L633
  cmpb   $0x81,0x0(%rbp)
  sete   %al
  movzbl %al,%eax
  add    %rbp,%rax
L633:
  lea    0x1(%rax),%rbp
  cmpb   $0x0,(%rax)
  jne    L349
  mov    $0x0,%eax
  jmp    L367
L121:
  movzbl 0x1(%rdi),%eax
  cmp    $0x88,%al
  je     L209
  cmp    $0x2a,%al
  jne    L86
L209:
  add    $0x1,%rbx
  movzbl (%rbx),%eax
  cmp    $0x88,%al
  je     L209
  cmp    $0x2a,%al
  je     L209
L86:
  cmp    $0x81,%al
  je     L459
  cmp    $0x88,%al
  je     L459
  lea    -0x2a(%rax),%edx
  cmp    $0x31,%dl
  ja     L99
  movabs $0x2000000200001,%rcx
  bt     %rdx,%rcx
  jb     L459
L99:
  movzbl 0x0(%rbp),%edx
  cmp    %al,%dl
  jne    L365
  jmp    L459
L163:
  mov    %rbp,%rdx
  test   %r12d,%r12d
  je     L595
  cmpb   $0x81,0x0(%rbp)
  sete   %dl
  movzbl %dl,%edx
  add    %rbp,%rdx
L595:
  lea    0x1(%rdx),%rbp
  cmpb   $0x0,(%rdx)
  je     L367
L459:
  mov    %r12d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <pmatch>
  test   %eax,%eax
  je     L163
  mov    $0x1,%eax
  jmp    L367
L243:
  add    $0x1,%rcx
L518:
  movzbl (%rcx),%edx
  cmp    $0x88,%dl
  je     L243
  test   %dl,%dl
  je     L623
  cmp    $0x81,%dl
  sete   %dl
  movzbl %dl,%edx
  add    %rcx,%rdx
  lea    0x1(%rdx),%rcx
  cmpb   $0x5d,0x1(%rdx)
  jne    L518
  cmp    $0x21,%r8b
  sete   %r9b
  movzbl %r9b,%r9d
  movzbl 0x0(%rbp),%r8d
  test   %r12d,%r12d
  je     L23
  cmp    $0x81,%r8b
  jne    L23
  movzbl 0x1(%rbp),%r8d
  lea    0x2(%rbp),%rbp
  jmp    L610
L23:
  add    $0x1,%rbp
L610:
  test   %r8b,%r8b
  je     L526
  lea    0x1(%rdi),%rbx
  movzbl (%rdi),%edx
  mov    $0x0,%edi
  jmp    L399
L258:
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%rbx
  jmp    L410
L464:
  movzbl 0x1(%rbx),%ecx
  cmp    $0x5d,%cl
  jne    L372
  cmp    %r8b,%dl
  je     L182
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%rbx
  jmp    L399
L372:
  lea    0x1(%rbx),%rax
  cmp    $0x88,%cl
  jne    L409
L133:
  add    $0x1,%rax
  movzbl (%rax),%ecx
  cmp    $0x88,%cl
  je     L133
L409:
  cmp    $0x81,%cl
  sete   %cl
  movzbl %cl,%ecx
  add    %rcx,%rax
  cmp    %r8b,%dl
  jg     L220
  cmp    %r8b,(%rax)
  cmovge %esi,%edi
L220:
  add    $0x1,%rax
  jmp    L435
L453:
  mov    %rbx,%rax
L435:
  lea    0x1(%rax),%rbx
  movzbl (%rax),%edx
  cmp    $0x5d,%dl
  je     L300
L399:
  cmp    $0x88,%dl
  je     L453
  cmp    $0x81,%dl
  je     L258
L410:
  movzbl (%rbx),%eax
  cmp    $0x2d,%al
  je     L464
  mov    %rbx,%rax
  cmp    %r8b,%dl
  cmove  %esi,%edi
  jmp    L435
L300:
  cmp    %r9d,%edi
  jne    L349
  mov    $0x0,%eax
  jmp    L367
L623:
  mov    %rbp,%rdx
  test   %r12d,%r12d
  je     L630
  cmpb   $0x81,0x0(%rbp)
  sete   %dl
  movzbl %dl,%edx
  add    %rbp,%rdx
L630:
  lea    0x1(%rdx),%rbp
  cmp    %al,(%rdx)
  jne    L192
L349:
  mov    %rbx,%rdi
L159:
  lea    0x1(%rdi),%rbx
  movzbl (%rdi),%eax
  cmp    $0x2a,%al
  je     L121
  jg     L449
  cmp    $0x88,%al
  je     L349
  test   %al,%al
  jne    L607
  cmpb   $0x0,0x0(%rbp)
  sete   %al
  movzbl %al,%eax
L367:
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L192:
  mov    $0x0,%eax
  jmp    L367
L526:
  mov    $0x0,%eax
  jmp    L367
L176:
  mov    $0x0,%eax
  jmp    L367
L448:
  test   %dl,%dl
  je     L176
  mov    %rbp,%rdx
L444:
  lea    0x1(%rdx),%rbp
  movzbl 0x1(%rdx),%edx
  cmp    %al,%dl
  je     L459
L365:
  cmp    $0x81,%dl
  jne    L448
  test   %r12d,%r12d
  je     L448
  cmp    %al,0x1(%rbp)
  je     L459
  lea    0x1(%rbp),%rdx
  jmp    L444
L182:
  add    $0x1,%rbx
  mov    %eax,%edx
  mov    $0x1,%edi
  jmp    L399
```

assistant: ```c
int pmatch(char *pattern, char *string, int squoted) {
  char *p, *q;
  char c;
  p = pattern;
  q = string;
  for (;;) {
    switch (c = *p++) {
    case '\0':
      goto breakloop;
    case '\201':
      if (squoted && *q == '\201')
        q++;
      if (*q++ != *p++)
        return 0;
      break;
    case '\210':
      continue;
    case '?':
      if (squoted && *q == '\201')
        q++;
      if (*q++ == '\0')
        return 0;
      break;
    case '*':
      c = *p;
      while (c == '\210' || c == '*')
        c = *++p;
      if (c != '\201' && c != '\210' && c != '?' && c != '*' && c != '[') {
        while (*q != c) {
          if (squoted && *q == '\201' && q[1] == c)
            break;
          if (*q == '\0')
            return 0;
          if (squoted && *q == '\201')
            q++;
          q++;
        }
      }
      do {
        if (pmatch(p, q, squoted))
          return 1;
        if (squoted && *q == '\201')
          q++;
      } while (*q++ != '\0');
      return 0;
    case '[': {
      char *endp;
      int invert, found;
      char chr;
      endp = p;
      if (*endp == '!')
        endp++;
      for (;;) {
        while (*endp == '\210')
          endp++;
        if (*endp == '\0')
          goto dft;
        if (*endp == '\201')
          endp++;
        if (*++endp == ']')
          break;
      }
      invert = 0;
      if (*p == '!') {
        invert++;
        p++;
      }
      found = 0;
      chr = *q++;
      if (squoted && chr == '\201')
        chr = *q++;
      if (chr == '\0')
        return 0;
      c = *p++;
      do {
        if (c == '\210')
          continue;
        if (c == '\201')
          c = *p++;
        if (*p == '-' && p[1] != ']') {
          p++;
          while (*p == '\210')
            p++;
          if (*p == '\201')
            p++;
          if (chr >= c && chr <= *p)
            found = 1;
          p++;
        } else {
          if (chr == c)
            found = 1;
        }
      } while ((c = *p++) != ']');
      if (found == invert)
        return 0;
      break;
    }
    dft:
    default:
      if (squoted && *q == '\201')
        q++;
      if (*q++ != c)
        return 0;
      break;
    }
  }
breakloop:
  if (*q != '\0')
    return 0;
  return 1;
}
```