user: Translate the below assembly code into C programming language:

```asm
<pmatch>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x10(%rbp)
L529:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x22(%rbp)
  movsbl -0x22(%rbp),%eax
  cmp    $0x5b,%eax
  je     L668
  cmp    $0x5b,%eax
  jg     L465
  cmp    $0x3f,%eax
  je     L316
  cmp    $0x3f,%eax
  jg     L465
  cmp    $0x2a,%eax
  je     L404
  cmp    $0x2a,%eax
  jg     L465
  test   %eax,%eax
  je     L583
  test   %eax,%eax
  jg     L465
  cmp    $0xffffff81,%eax
  je     L33
  cmp    $0xffffff88,%eax
  je     L434
  jmp    L465
L33:
  cmpl   $0x0,-0x44(%rbp)
  je     L329
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L329
  addq   $0x1,-0x10(%rbp)
L329:
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  cmp    %al,%cl
  je     L181
  mov    $0x0,%eax
  jmp    L587
L316:
  cmpl   $0x0,-0x44(%rbp)
  je     L164
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L164
  addq   $0x1,-0x10(%rbp)
L164:
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  test   %al,%al
  jne    L566
  mov    $0x0,%eax
  jmp    L587
L404:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x22(%rbp)
  jmp    L486
L577:
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x22(%rbp)
L486:
  cmpb   $0x88,-0x22(%rbp)
  je     L577
  cmpb   $0x2a,-0x22(%rbp)
  je     L577
  cmpb   $0x81,-0x22(%rbp)
  je     L353
  cmpb   $0x88,-0x22(%rbp)
  je     L353
  cmpb   $0x3f,-0x22(%rbp)
  je     L353
  cmpb   $0x2a,-0x22(%rbp)
  je     L353
  cmpb   $0x5b,-0x22(%rbp)
  je     L353
  jmp    L48
L113:
  cmpl   $0x0,-0x44(%rbp)
  je     L114
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L114
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x22(%rbp)
  je     L473
L114:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L687
  mov    $0x0,%eax
  jmp    L587
L687:
  cmpl   $0x0,-0x44(%rbp)
  je     L257
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L257
  addq   $0x1,-0x10(%rbp)
L257:
  addq   $0x1,-0x10(%rbp)
L48:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x22(%rbp)
  jne    L113
  jmp    L353
L473:
  nop
L353:
  mov    -0x44(%rbp),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <pmatch>
  test   %eax,%eax
  je     L411
  mov    $0x1,%eax
  jmp    L587
L411:
  cmpl   $0x0,-0x44(%rbp)
  je     L779
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L779
  addq   $0x1,-0x10(%rbp)
L779:
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  test   %al,%al
  jne    L353
  mov    $0x0,%eax
  jmp    L587
L668:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L659
  addq   $0x1,-0x8(%rbp)
  jmp    L659
L601:
  addq   $0x1,-0x8(%rbp)
L659:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x88,%al
  je     L601
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L531
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L585
  addq   $0x1,-0x8(%rbp)
L585:
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  je     L17
  jmp    L659
L17:
  nop
  movl   $0x0,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x21,%al
  jne    L115
  addl   $0x1,-0x20(%rbp)
  addq   $0x1,-0x18(%rbp)
L115:
  movl   $0x0,-0x1c(%rbp)
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x21(%rbp)
  cmpl   $0x0,-0x44(%rbp)
  je     L745
  cmpb   $0x81,-0x21(%rbp)
  jne    L745
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x21(%rbp)
L745:
  cmpb   $0x0,-0x21(%rbp)
  jne    L380
  mov    $0x0,%eax
  jmp    L587
L380:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x22(%rbp)
L758:
  cmpb   $0x88,-0x22(%rbp)
  je     L160
  cmpb   $0x81,-0x22(%rbp)
  jne    L302
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x22(%rbp)
L302:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L54
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  je     L54
  addq   $0x1,-0x18(%rbp)
  jmp    L95
L510:
  addq   $0x1,-0x18(%rbp)
L95:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x88,%al
  je     L510
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L551
  addq   $0x1,-0x18(%rbp)
L551:
  movzbl -0x21(%rbp),%eax
  cmp    -0x22(%rbp),%al
  jl     L372
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x21(%rbp)
  jg     L372
  movl   $0x1,-0x1c(%rbp)
L372:
  addq   $0x1,-0x18(%rbp)
  jmp    L103
L54:
  movzbl -0x21(%rbp),%eax
  cmp    -0x22(%rbp),%al
  jne    L103
  movl   $0x1,-0x1c(%rbp)
  jmp    L103
L160:
  nop
L103:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x22(%rbp)
  cmpb   $0x5d,-0x22(%rbp)
  jne    L758
  mov    -0x1c(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jne    L736
  mov    $0x0,%eax
  jmp    L587
L531:
  nop
L465:
  cmpl   $0x0,-0x44(%rbp)
  je     L710
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x81,%al
  jne    L710
  addq   $0x1,-0x10(%rbp)
L710:
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  cmp    %al,-0x22(%rbp)
  je     L32
  mov    $0x0,%eax
  jmp    L587
L434:
  nop
  jmp    L529
L181:
  nop
  jmp    L529
L566:
  nop
  jmp    L529
L736:
  nop
  jmp    L529
L32:
  nop
  jmp    L529
L583:
  nop
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L614
  mov    $0x0,%eax
  jmp    L587
L614:
  mov    $0x1,%eax
L587:
  leave
  ret
```

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