user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<match_pattern_list>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x428,%rsp
  mov    %ecx,(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x418(%rsp)
  xor    %eax,%eax
  test   %rdx,%rdx
  jne    L135
L172:
  xor    %r15d,%r15d
L61:
  mov    0x418(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L277
  add    $0x428,%rsp
  mov    %r15d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L135:
  mov    %rdi,%r13
  mov    %rsi,%r12
  xor    %ebx,%ebx
  xor    %r15d,%r15d
  lea    0x10(%rsp),%r14
L214:
  cmpb   $0x21,(%r12,%rbx,1)
  movl   $0x0,0x4(%rsp)
  jne    L99
  movl   $0x1,0x4(%rsp)
  add    $0x1,%rbx
L99:
  xor    %ebp,%ebp
  cmp    %rdx,%rbx
  jae    L245
  mov    (%rsp),%ecx
  test   %ecx,%ecx
  je     L89
  jmp    L269
  xchg   %ax,%ax
L65:
  add    $0x1,%rbx
  mov    %al,(%r14,%rbp,1)
  add    $0x1,%rbp
  cmp    %rbx,%rdx
  jbe    L121
  cmp    $0x3fe,%rbp
  ja     L121
L89:
  movzbl (%r12,%rbx,1),%eax
  cmp    $0x2c,%al
  jne    L65
L93:
  cmp    %rbx,%rdx
  ja     L154
L245:
  mov    %r14,%rsi
  mov    %r13,%rdi
  mov    %rdx,0x8(%rsp)
  movb   $0x0,0x10(%rsp,%rbp,1)
  call   <match_pattern@plt>
  mov    0x8(%rsp),%rdx
  test   %rax,%rax
  je     L61
L95:
  mov    0x4(%rsp),%eax
  test   %eax,%eax
  jne    L141
  mov    $0x1,%r15d
L56:
  cmp    %rbx,%rdx
  jbe    L61
  jmp    L214
  nopw   0x0(%rax,%rax,1)
L62:
  movsbl (%r12,%rbx,1),%edi
  mov    %rdx,0x8(%rsp)
  add    $0x1,%rbx
  call   <tolower@plt>
  mov    0x8(%rsp),%rdx
  mov    %al,(%r14,%rbp,1)
  add    $0x1,%rbp
  cmp    $0x3fe,%rbp
  ja     L121
  cmp    %rdx,%rbx
  jae    L121
  xchg   %ax,%ax
L269:
  movsbl (%r12,%rbx,1),%edi
  cmp    $0x2c,%dil
  je     L93
  mov    %rdx,0x8(%rsp)
  call   <isupper@plt>
  mov    0x8(%rsp),%rdx
  test   %rax,%rax
  jne    L62
  movzbl (%r12,%rbx,1),%eax
  add    $0x1,%rbx
  mov    %al,(%r14,%rbp,1)
  add    $0x1,%rbp
  cmp    %rbx,%rdx
  jbe    L121
  cmp    $0x3fe,%rbp
  jbe    L269
  nopw   0x0(%rax,%rax,1)
L121:
  cmp    $0x3ff,%rbp
  je     L172
  cmp    %rbx,%rdx
  jbe    L245
  cmpb   $0x2c,(%r12,%rbx,1)
  je     L154
  mov    %r14,%rsi
  mov    %r13,%rdi
  mov    %rdx,0x8(%rsp)
  movb   $0x0,0x10(%rsp,%rbp,1)
  call   <match_pattern@plt>
  mov    0x8(%rsp),%rdx
  test   %rax,%rax
  je     L214
  jmp    L95
  nopl   (%rax)
L154:
  mov    %r14,%rsi
  mov    %r13,%rdi
  mov    %rdx,0x8(%rsp)
  add    $0x1,%rbx
  movb   $0x0,0x10(%rsp,%rbp,1)
  call   <match_pattern@plt>
  mov    0x8(%rsp),%rdx
  test   %rax,%rax
  je     L56
  jmp    L95
L141:
  mov    $0xffffffff,%r15d
  jmp    L61
L277:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int match_pattern_list(const char *string, const char *pattern, u_int len, int dolower) {
  char sub[1024];
  int negated;
  int got_positive;
  u_int i, subi;
  got_positive = 0;
  for (i = 0; i < len;) {
    if (pattern[i] == '!') {
      negated = 1;
      i++;
    } else
      negated = 0;
    for (subi = 0; i < len && subi < sizeof(sub) - 1 && pattern[i] != ','; subi++, i++)
      sub[subi] = dolower && isupper(pattern[i]) ? (char)tolower(pattern[i]) : pattern[i];
    if (subi >= sizeof(sub) - 1)
      return 0;
    if (i < len && pattern[i] == ',')
      i++;
    sub[subi] = '\0';
    if (match_pattern(string, sub)) {
      if (negated)
        return -1;
      else
        got_positive = 1;
    }
  }
  return got_positive;
}
```