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

```asm
<load_matrix>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %rdx,-0x68(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
L102:
  mov    -0x58(%rbp),%rax
  lea    D21(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L160
  mov    -0x58(%rbp),%rax
  mov    %rax,%rsi
  lea    D55(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movl   $0x1,-0x3c(%rbp)
  jmp    L93
L160:
  movl   $0x0,-0x3c(%rbp)
L93:
  cmpl   $0x0,-0x3c(%rbp)
  jne    L102
  lea    -0x48(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D84(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  lea    -0x44(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D84(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  lea    -0x40(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D84(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  lea    -0x30(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D30(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  lea    -0x28(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  lea    D30(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  mov    -0x48(%rbp),%edx
  mov    -0x60(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x48(%rbp),%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x18(%rbp)
  movl   $0x0,-0x38(%rbp)
  jmp    L83
L36:
  mov    -0x44(%rbp),%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    -0x38(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x18(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rax,(%rdx)
  addl   $0x1,-0x38(%rbp)
L83:
  mov    -0x48(%rbp),%eax
  cmp    %eax,-0x38(%rbp)
  jl     L36
  mov    -0x40(%rbp),%eax
  test   %eax,%eax
  jle    L90
  mov    -0x48(%rbp),%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x20(%rbp)
  movl   $0x0,-0x38(%rbp)
  jmp    L144
L167:
  mov    -0x40(%rbp),%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    -0x38(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rax,(%rdx)
  addl   $0x1,-0x38(%rbp)
L144:
  mov    -0x48(%rbp),%eax
  cmp    %eax,-0x38(%rbp)
  jl     L167
  jmp    L90
L63:
  movl   $0x0,-0x38(%rbp)
  jmp    L28
L96:
  movl   $0x0,-0x34(%rbp)
  jmp    L164
L34:
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,%rdx
  mov    -0x10(%rbp),%rax
  lea    D30(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  addl   $0x1,-0x34(%rbp)
L164:
  mov    -0x44(%rbp),%eax
  cmp    %eax,-0x34(%rbp)
  jl     L34
  movl   $0x0,-0x34(%rbp)
  jmp    L115
L54:
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,%rdx
  mov    -0x10(%rbp),%rax
  lea    D30(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  addl   $0x1,-0x34(%rbp)
L115:
  mov    -0x40(%rbp),%eax
  cmp    %eax,-0x34(%rbp)
  jl     L54
  addl   $0x1,-0x38(%rbp)
L28:
  mov    -0x48(%rbp),%eax
  cmp    %eax,-0x38(%rbp)
  jl     L96
L90:
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <feof@plt>
  test   %eax,%eax
  je     L63
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  mov    -0x68(%rbp),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x20(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L72
  call   <__stack_chk_fail@plt>
L72:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D21
datatype: string
name: extract_symbolic_data
arguments: tag: D55
datatype: string
name: extract_symbolic_data
arguments: tag: D84
datatype: string
name: extract_symbolic_data
arguments: tag: D30
datatype: string

tool: D21: r

tool: D55: File %s Not Found!!


tool: D84: %d

tool: D30: %lf

assistant: ```c
double **load_matrix(const char *file_name, int *num_inputs, double ***m_inputs) {
  FILE *fd;
  int file_found;
  double **outputs = NULL;
  double **inputs = NULL;
  int r, c_input, c_output;
  double min, max;
  int a, b;
  do {
    fd = fopen(file_name, "r");
    if (!fd) {
      printf("File %s Not Found!!\n", file_name);
      file_found = 1;
    } else
      file_found = 0;
  } while (file_found);
  fscanf(fd, "%d", &r);
  fscanf(fd, "%d", &c_input);
  fscanf(fd, "%d", &c_output);
  fscanf(fd, "%lf", &min);
  fscanf(fd, "%lf", &max);
  *num_inputs = r;
  inputs = (double **)malloc(r * sizeof(double));
  for (a = 0; a < r; a++) {
    inputs[a] = (double *)malloc(c_input * sizeof(double));
  }
  if (c_output > 0) {
    outputs = (double **)malloc(r * sizeof(double));
    for (a = 0; a < r; a++) {
      outputs[a] = (double *)malloc(c_output * sizeof(double));
    }
  }
  while (!feof(fd)) {
    for (a = 0; a < r; a++) {
      for (b = 0; b < c_input; b++) {
        fscanf(fd, "%lf", &inputs[a][b]);
      }
      for (b = 0; b < c_output; b++) {
        fscanf(fd, "%lf", &outputs[a][b]);
      }
    }
  }
  fclose(fd);
  *m_inputs = inputs;
  return outputs;
}
```