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

```asm
<parse_args_from_file>:
  endbr64
  push   %r13
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rcx,%rbx
  sub    $0x18,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  movl   $0x0,(%rsi)
  lea    0x4(%rsp),%rdx
  mov    %rcx,%rsi
  movl   $0x0,0x4(%rsp)
  call   <parse_line_from_file@plt>
  mov    %eax,%r13d
  test   %eax,%eax
  jne    L194
  movslq 0x4(%rsp),%rdx
  mov    0x0(%rbp),%edi
  test   %edx,%edx
  jle    L73
  mov    (%rbx),%rcx
  xor    %eax,%eax
  jmp    L166
L242:
  cmpb   $0x20,-0x1(%rcx,%rax,1)
  je     L35
L209:
  add    $0x1,%rax
  cmp    %rax,%rdx
  je     L73
L166:
  test   %rax,%rax
  jne    L242
L35:
  cmpb   $0x20,(%rcx,%rax,1)
  je     L209
  add    $0x1,%edi
  add    $0x1,%rax
  mov    %edi,0x0(%rbp)
  cmp    %rax,%rdx
  jne    L166
L73:
  mov    $0x8,%esi
  call   <calloc@plt>
  mov    %rax,(%r12)
  test   %rax,%rax
  je     L58
  mov    0x4(%rsp),%r8d
  test   %r8d,%r8d
  js     L194
  xor    %r9d,%r9d
  mov    $0xfffffffffffffffe,%rdi
  mov    $0xffffffffffffffff,%rsi
  xor    %edx,%edx
  jmp    L124
  nopl   0x0(%rax)
L217:
  cmp    %ecx,%r9d
  jge    L178
  mov    (%r12),%rcx
  movslq %r9d,%r10
  add    $0x1,%r9d
  mov    %rax,(%rcx,%r10,8)
L178:
  test   %rdx,%rdx
  jne    L33
L167:
  add    $0x1,%rdx
  add    $0x1,%rsi
  add    $0x1,%rdi
  cmp    %edx,%r8d
  jl     L194
L124:
  mov    (%rbx),%rax
  test   %rdx,%rdx
  je     L228
  testb  $0xdf,(%rax,%rsi,1)
  jne    L167
L228:
  add    %rdx,%rax
  mov    0x0(%rbp),%ecx
  cmpb   $0x20,(%rax)
  jne    L217
  cmp    %ecx,%r9d
  jne    L167
  jmp    L178
L58:
  mov    (%rbx),%rdi
  mov    $0x4,%r13d
  call   <free@plt>
  nopl   0x0(%rax,%rax,1)
L194:
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L132
  add    $0x18,%rsp
  mov    %r13d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  xchg   %ax,%ax
L33:
  mov    (%rbx),%rax
  movb   $0x0,(%rax,%rsi,1)
  test   %edi,%edi
  jle    L135
  lea    -0x3(%rdx),%eax
  lea    -0x3(%rdx),%r8
  sub    %rax,%r8
  mov    %rdi,%rax
  jmp    L54
  nopw   0x0(%rax,%rax,1)
L99:
  sub    $0x1,%rax
  movb   $0x0,(%rcx)
  cmp    %r8,%rax
  je     L135
L54:
  mov    (%rbx),%rcx
  add    %rax,%rcx
  cmpb   $0x20,(%rcx)
  je     L99
L135:
  mov    0x4(%rsp),%r8d
  jmp    L167
L132:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int parse_args_from_file(char *path, int *argcp, char ***argvp, char **linep) {
  int i = *argcp = 0, k = 0, size = 0, l;
  if ((i = parse_line_from_file(path, linep, &size)) != 0)
    return i;
  for (i = 0; i < size; i++)
    if ((i == 0 || (*linep)[i - 1] == ' ') && (*linep)[i] != ' ')
      (*argcp)++;
  (*argvp) = calloc((*argcp), sizeof(char *));
  if ((*argvp) == NULL) {
    free((*linep));
    return 4;
  }
  for (i = 0; i <= size; i++) {
    if ((i == 0 || !(*linep)[i - 1] || (*linep)[i - 1] == ' ') && ((*linep)[i] != ' ' || k == *argcp)) {
      if (k < *argcp)
        (*argvp)[k++] = (*linep) + i;
      if (i > 0) {
        (*linep)[i - 1] = 0;
        for (l = i - 2; l > 0; l--) {
          if ((*linep)[l] != ' ')
            break;
          else
            (*linep)[l] = 0;
        }
      }
    }
  }
  return 0;
}
```