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

```asm
<search_match_file>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %r8,-0x48(%rbp)
  mov    -0x28(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <build_total_path@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <opendir@plt>
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  je     L53
  jmp    L76
L70:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jle    L22
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <sub_directory_or_file@plt>
  test   %rax,%rax
  je     L76
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <build_total_path@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <directory_match@plt>
  test   %rax,%rax
  je     L39
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x48(%rbp),%rdi
  mov    -0x20(%rbp),%rcx
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <search_match_file>
  jmp    L12
L39:
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <sub_directory_or_file@plt>
  test   %rax,%rax
  je     L12
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <compare_match_string@plt>
  test   %rax,%rax
  je     L12
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <print_file@plt>
L12:
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
L76:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <readdir@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L70
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <closedir@plt>
  jmp    L59
L53:
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <perror@plt>
L59:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  jmp    L64
L22:
  nop
L64:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D12
type_guessed: string
name: extract_symbolic_data
arguments: label: D13
type_guessed: string

tool: D12: %d

tool: 

assistant: ```c
void search_match_file(char *path, char *match_string, int *max_results, char *father_directory, int *current_result) {
  DIR *path_directory;
  struct dirent *directory_file;
  char *total_path = build_total_path(father_directory, path);
  path_directory = opendir(total_path);
  if (path_directory != NULL) {
    while ((directory_file = readdir(path_directory)) != NULL) {
      if (*max_results <= *current_result) {
        return;
      }
      if (sub_directory_or_file(directory_file->d_name)) {
        char *total_file_name;
        total_file_name = build_total_path(total_path, directory_file->d_name);
        if (directory_match(total_file_name)) {
          search_match_file(directory_file->d_name, match_string, max_results, total_path, current_result);
        } else if (sub_directory_or_file(directory_file->d_name)) {
          if (compare_match_string(match_string, directory_file->d_name)) {
            (*current_result)++;
            printf("%d", *current_result);
            print_file(total_file_name);
          }
        }
        free(total_file_name);
      }
    }
    closedir(path_directory);
  } else {
    perror("");
  }
  free(total_path);
}
```