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

```asm
<do_include>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x7e8,%rsp
  mov    %rdi,%r13
  mov    %rcx,%r12
  mov    %r8,%rbx
  mov    %r9,%rbp
  mov    %fs:0x28,%rax
  mov    %rax,0x7e0(%rsp)
  xor    %eax,%eax
  push   $0x3e8
  lea    0x400(%rsp),%r9
  mov    %rbp,%r8
  mov    %rbx,%rcx
  mov    %r12,%rdx
  call   <get_filename@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  js     L130
  lea    0x3f0(%rsp),%rdi
  call   <check_filename@plt>
  test   %eax,%eax
  je     L115
  lea    0x3f0(%rsp),%rdi
  lea    D8(%rip),%rsi
  call   <fopen@plt>
  mov    %rax,%r14
  test   %rax,%rax
  je     L98
  lea    D19(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L35
  mov    %rbp,%rdi
  call   <strlen@plt>
  cmp    $0x3e7,%rax
  ja     L87
  mov    %rsp,%rdi
  mov    %rbp,%rsi
  call   <strcpy@plt>
L51:
  lea    0x3f0(%rsp),%rsi
  mov    %rsp,%rdi
  mov    %r14,%rdx
  call   <read_file@plt>
  mov    %r14,%rdi
  call   <fclose@plt>
L130:
  mov    0x7d8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L55
  add    $0x7e0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L115:
  lea    0x3f0(%rsp),%rdx
  mov    %rbx,%rsi
  mov    %r12,%rdi
  call   <not_permitted@plt>
  jmp    L130
L98:
  lea    0x3f0(%rsp),%rdx
  mov    %rbx,%rsi
  mov    %r12,%rdi
  call   <not_found2@plt>
  jmp    L130
L87:
  lea    0x3f0(%rsp),%rsi
  mov    %rsp,%rdi
  call   <strcpy@plt>
  jmp    L51
L35:
  mov    %r13,%rdi
  call   <strlen@plt>
  mov    %rax,%rbx
  mov    %rbp,%rdi
  call   <strlen@plt>
  lea    0x1(%rbx,%rax,1),%rax
  cmp    $0x3e7,%rax
  ja     L29
  mov    %rsp,%rbx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <strcpy@plt>
  mov    $0x2f,%esi
  mov    %rbx,%rdi
  call   <strrchr@plt>
  test   %rax,%rax
  je     L83
L20:
  lea    0x1(%rax),%rdi
  mov    %rbp,%rsi
  call   <strcpy@plt>
  jmp    L51
L83:
  mov    %rbx,%rdi
  call   <strlen@plt>
  mov    %rax,%rdx
  lea    (%rbx,%rax,1),%rax
  movb   $0x2f,(%rsp,%rdx,1)
  jmp    L20
L29:
  lea    0x3f0(%rsp),%rsi
  mov    %rsp,%rdi
  call   <strcpy@plt>
  jmp    L51
L55:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: data_label: D8
type: string
name: read_data
arguments: data_label: D19
type: string

tool: D8: r

tool: D19: virtual

assistant: ```c
void do_include(char *vfilename, char *filename, FILE *fp, char *directive, char *tag, char *val) {
  char vfilename2[1000];
  char filename2[1000];
  FILE *fp2;
  if (get_filename(vfilename, filename, directive, tag, val, filename2, sizeof(filename2)) < 0)
    return;
  if (!check_filename(filename2)) {
    not_permitted(directive, tag, filename2);
    return;
  }
  fp2 = fopen(filename2, "r");
  if (fp2 == (FILE *)0) {
    not_found2(directive, tag, filename2);
    return;
  }
  if (strcmp(tag, "virtual") == 0) {
    if (strlen(val) < sizeof(vfilename2))
      (void)strcpy(vfilename2, val);
    else
      (void)strcpy(vfilename2, filename2);
  } else {
    if (strlen(vfilename) + 1 + strlen(val) < sizeof(vfilename2)) {
      char *cp;
      (void)strcpy(vfilename2, vfilename);
      cp = strrchr(vfilename2, '/');
      if (cp == (char *)0) {
        cp = &vfilename2[strlen(vfilename2)];
        *cp = '/';
      }
      (void)strcpy(++cp, val);
    } else
      (void)strcpy(vfilename2, filename2);
  }
  read_file(vfilename2, filename2, fp2);
  (void)fclose(fp2);
}
```