user: 请从给定的汇编指令推导出C源代码:

```asm
<find_vpattern>:
  endbr64
  push   %r15
  push   %r14
  mov    %rsi,%r14
  push   %r13
  push   %r12
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x18,%rsp
  call   <strlen@plt>
  movzbl (%rbx),%ecx
  mov    %rax,%r12
L210:
  lea    0x1(%rbp),%r13d
  movslq %r13d,%rax
  cmp    $0x5f,%cl
  je     L181
  cmp    %rax,%r12
  jbe    L214
L83:
  cmpb   $0x5f,(%rbx,%rax,1)
  mov    %eax,%ebp
  je     L11
  add    $0x1,%rax
  cmp    %rax,%r12
  jne    L83
L214:
  add    $0x18,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L11:
  lea    0x1(%rax),%r13d
L181:
  movslq %r13d,%rax
  cmp    %rax,%r12
  jbe    L214
  movsbl (%rbx,%rax,1),%edi
  call   <isdigit@plt>
  lea    0x2(%rbp),%edx
  mov    %rax,%r8
  movslq %edx,%rax
  test   %r8,%r8
  je     L150
  cmp    %rax,%r12
  jbe    L214
  lea    0x3(%rbp),%edx
  movzbl (%rbx,%rax,1),%ecx
  movslq %edx,%rdx
L180:
  movsbl %cl,%edi
  mov    %rdx,(%rsp)
  mov    %edx,%r15d
  mov    %cl,0xb(%rsp)
  call   <isdigit@plt>
  mov    (%rsp),%rdx
  test   %rax,%rax
  jne    L194
  movzbl 0xb(%rsp),%ecx
  cmp    $0x70,%cl
  je     L131
  cmp    $0x2e,%cl
  je     L131
  cmp    %rdx,%r12
  jbe    L214
  movzbl (%rbx,%rdx,1),%ecx
  mov    %edx,%ebp
  jmp    L210
  nopl   (%rax)
L150:
  cmp    %rax,%r12
  jbe    L214
  movzbl (%rbx,%rax,1),%ecx
  mov    %edx,%ebp
  jmp    L210
  nopl   0x0(%rax)
L194:
  cmp    %rdx,%r12
  je     L214
  movzbl (%rbx,%rdx,1),%ecx
  add    $0x1,%rdx
  jmp    L180
  nopl   0x0(%rax,%rax,1)
L131:
  cmp    %rdx,%r12
  jbe    L214
  movsbl (%rbx,%rdx,1),%edi
  call   <isdigit@plt>
  lea    0x1(%r15),%edx
  mov    %rax,%r8
  movslq %edx,%rax
  test   %r8,%r8
  je     L150
  cmp    %rax,%r12
  jbe    L214
  lea    0x2(%r15),%edx
  movzbl (%rbx,%rax,1),%ecx
  movslq %edx,%r15
L293:
  lea    -0x1(%r15),%esi
  movsbl %cl,%edi
  mov    %r15d,(%rsp)
  mov    %esi,0xc(%rsp)
  mov    %cl,0xb(%rsp)
  call   <isdigit@plt>
  mov    %r15d,%r8d
  test   %rax,%rax
  jne    L186
  movzbl 0xb(%rsp),%ecx
  mov    0xc(%rsp),%esi
  cmp    $0x56,%cl
  je     L6
  cmp    %r15,%r12
  jbe    L214
  movzbl (%rbx,%r15,1),%ecx
  mov    %r15d,%ebp
  jmp    L210
  nopl   0x0(%rax)
L186:
  cmp    %r15,%r12
  je     L214
  movzbl (%rbx,%r15,1),%ecx
  add    $0x1,%r15
  jmp    L293
  nopl   0x0(%rax)
L6:
  cmp    %r15,%r12
  jbe    L214
  movzbl (%rbx,%r15,1),%eax
  cmp    $0x5f,%al
  je     L193
  cmp    $0x2e,%al
  je     L193
  mov    (%rsp),%ebp
  add    $0x1,%ebp
  movslq %ebp,%rax
  cmp    %rax,%r12
  jbe    L214
  movzbl (%rbx,%rax,1),%ecx
  jmp    L210
  nopl   0x0(%rax)
L193:
  movslq %ebp,%rax
  mov    %r14,%rdi
  sub    %rax,%rdi
  cmp    %r8d,%ebp
  jg     L159
  xchg   %ax,%ax
L175:
  movzbl (%rbx,%rax,1),%ecx
  mov    %cl,(%rdi,%rax,1)
  add    $0x1,%rax
  lea    -0x1(%rax),%ecx
  cmp    %ecx,%esi
  jge    L175
  sub    %ebp,%esi
  xor    %edx,%edx
  cmp    %r15d,%ebp
  lea    0x1(%rsi),%eax
  cmovg  %edx,%eax
  add    %r13d,%eax
  sub    %ebp,%eax
  cltq
  add    %rax,%r14
L159:
  movb   $0x0,(%r14)
  add    $0x18,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int find_vpattern(char *str, char *found) {
  size_t len;
  int i;
  int start;
  int end;
  int pos;
  int state;
  int done;
  char c;
  len = strlen(str);
  start = 0;
  end = 0;
  done = 0;
  pos = 0;
  state = 1;
  done = 0;
  do {
    c = str[pos];
    if (state == 1) {
      if (c == '_') {
        state++;
        start = pos;
      }
      pos++;
    } else if (state == 2) {
      if (isdigit((char)c)) {
        state++;
      } else {
        state = 1;
      }
      pos++;
    } else if (state == 3) {
      if (isdigit((char)c)) {
        ;
      } else if ((c == 'p') || (c == '.')) {
        state++;
      } else {
        state = 1;
      }
      pos++;
    } else if (state == 4) {
      if (isdigit((char)c)) {
        state++;
      } else {
        state = 1;
      }
      pos++;
    } else if (state == 5) {
      if (isdigit((char)c)) {
        ;
      } else if (c == 'V') {
        state++;
      } else {
        state = 1;
      }
      pos++;
    } else if (state == 6) {
      if ((c == '_') || (c == '.')) {
        done = 1;
        end = pos;
      } else {
        state = 1;
      }
      pos++;
    }
  } while ((pos < len) && (done == 0));
  if (done == 0)
    return 0;
  for (i = start; i <= end; i++) {
    found[i - start] = str[i];
  }
  found[i - start] = 0x00;
  return 1;
}
```