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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x430,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D29(%rip),%rax
  mov    %rax,%rdi
  call   <opendir@plt>
  mov    %rax,-0x428(%rbp)
  cmpq   $0x0,-0x428(%rbp)
  jne    L42
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  call   <perror@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L42
L20:
  mov    -0x420(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x418(%rbp)
  mov    -0x418(%rbp),%rax
  mov    $0x2e,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L42
  mov    -0x418(%rbp),%rax
  lea    D32(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L54
  jmp    L42
L54:
  mov    -0x418(%rbp),%rcx
  mov    -0x418(%rbp),%rdx
  lea    -0x410(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  lea    D33(%rip),%rdx
  mov    $0x400,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  lea    -0x410(%rbp),%rax
  mov    %rax,%rdi
  call   <system@plt>
  mov    -0x418(%rbp),%rcx
  mov    -0x418(%rbp),%rdx
  lea    -0x410(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  lea    D16(%rip),%rdx
  mov    $0x400,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  lea    -0x410(%rbp),%rax
  mov    %rax,%rdi
  call   <system@plt>
  mov    %eax,-0x42c(%rbp)
  mov    -0x42c(%rbp),%eax
  sar    $0x8,%eax
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    -0x418(%rbp),%rdx
  mov    $0x0,%r8d
  mov    %rdx,%rcx
  mov    %eax,%edx
  mov    $0x17,%esi
  lea    D48(%rip),%rax
  mov    %rax,%rdi
  call   <ok_at_loc@plt>
L42:
  mov    -0x428(%rbp),%rax
  mov    %rax,%rdi
  call   <readdir@plt>
  mov    %rax,-0x420(%rbp)
  cmpq   $0x0,-0x420(%rbp)
  jne    L20
  mov    -0x428(%rbp),%rax
  mov    %rax,%rdi
  call   <closedir@plt>
  mov    $0x0,%eax
  call   <exit_status@plt>
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L14
  call   <__stack_chk_fail@plt>
L14:
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D29
type_infered: string
name: parse_data
arguments: label: D44
type_infered: string
name: parse_data
arguments: label: D32
type_infered: string
name: parse_data
arguments: label: D33
type_infered: string
name: parse_data
arguments: label: D16
type_infered: string
name: parse_data
arguments: label: D48
type_infered: string

tool: D29: t

tool: D44: opendir

tool: D32: test

tool: D33: ./t/%s >t/%s.got 2>&1

tool: D16: diff -up t/%s.expected t/%s.got

tool: D48: /scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/ErnWong/NothingButNet-Mark-III/refs/heads/master/t/test.c

assistant: ```c
int main() {
  DIR *dp = opendir("t");
  if (!dp) {
    perror("opendir");
    exit(1);
  }
  struct dirent *ep;
  while ((ep = readdir(dp))) {
    char *name = ep->d_name;
    if (strchr(name, '.') || !strcmp(name, "test"))
      continue;
    char command[1024];
    snprintf(command, 1024, "./t/%s >t/%s.got 2>&1", name, name);
    system(command);
    snprintf(command, 1024, "diff -up t/%s.expected t/%s.got", name, name);
    int retval = system(command);
    ok_at_loc("/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/ErnWong/NothingButNet-Mark-III/refs/heads/master/t/test.c", 23, !(retval >> 8), name, NULL);
  }
  closedir(dp);
  return exit_status();
}
```