user: Converte this assembly snippet into its equivalent C code:

```asm
<ParseDataLine>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %r8,-0x58(%rbp)
  mov    %r9,-0x60(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x58(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x68(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x40(%rbp),%rax
  mov    $0x2,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <string_copy@plt>
  mov    -0x38(%rbp),%rax
  lea    0x4(%rax),%rcx
  mov    -0x48(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <string_copy@plt>
  mov    -0x38(%rbp),%rax
  lea    0xe(%rax),%rcx
  mov    -0x50(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <string_copy@plt>
  mov    -0x38(%rbp),%rax
  lea    0x18(%rax),%rcx
  lea    -0x26(%rbp),%rax
  mov    $0xc,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <string_copy@plt>
  movl   $0x0,-0x2c(%rbp)
  movl   $0x0,-0x30(%rbp)
  jmp    L7
L64:
  mov    -0x30(%rbp),%eax
  cltq
  movzbl -0x26(%rbp,%rax,1),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  jne    L18
  mov    -0x2c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x2c(%rbp)
  mov    -0x30(%rbp),%edx
  movslq %edx,%rdx
  movzbl -0x26(%rbp,%rdx,1),%edx
  cltq
  mov    %dl,-0x17(%rbp,%rax,1)
L18:
  addl   $0x1,-0x30(%rbp)
L7:
  cmpl   $0xe,-0x30(%rbp)
  jg     L30
  mov    -0x30(%rbp),%eax
  cltq
  movzbl -0x26(%rbp,%rax,1),%eax
  test   %al,%al
  jne    L64
L30:
  mov    -0x2c(%rbp),%eax
  cltq
  movb   $0x0,-0x17(%rbp,%rax,1)
  lea    -0x17(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <atof@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    -0x58(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x38(%rbp),%rax
  lea    0x27(%rax),%rcx
  mov    -0x60(%rbp),%rax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <string_copy@plt>
  mov    -0x38(%rbp),%rax
  lea    0x31(%rax),%rcx
  lea    -0x26(%rbp),%rax
  mov    $0xc,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <string_copy@plt>
  movl   $0x0,-0x2c(%rbp)
  movl   $0x0,-0x30(%rbp)
  jmp    L19
L84:
  mov    -0x30(%rbp),%eax
  cltq
  movzbl -0x26(%rbp,%rax,1),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %eax,%eax
  jne    L77
  mov    -0x2c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x2c(%rbp)
  mov    -0x30(%rbp),%edx
  movslq %edx,%rdx
  movzbl -0x26(%rbp,%rdx,1),%edx
  cltq
  mov    %dl,-0x17(%rbp,%rax,1)
L77:
  addl   $0x1,-0x30(%rbp)
L19:
  cmpl   $0xe,-0x30(%rbp)
  jg     L81
  mov    -0x30(%rbp),%eax
  cltq
  movzbl -0x26(%rbp,%rax,1),%eax
  test   %al,%al
  jne    L84
L81:
  mov    -0x2c(%rbp),%eax
  cltq
  movb   $0x0,-0x17(%rbp,%rax,1)
  lea    -0x17(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <atof@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mov    -0x68(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L25
  call   <__stack_chk_fail@plt>
L25:
  leave
  ret
```

assistant: ```c
int ParseDataLine(line, code, name1, name2, val1, name3, val2)
char *code, *line, *name1, *name2, *name3;
double *val1, *val2;
{
  int i, j;
  char valstr[15], NoBlank[15];
  *val1 = 0.0;
  *val2 = 0.0;
  string_copy(code, &line[1], 2);
  string_copy(name1, &line[4], 8);
  string_copy(name2, &line[14], 8);
  string_copy(valstr, &line[24], 12);
  j = 0;
  for (i = 0; i < 15 && valstr[i] != '\0'; i++)
    if (!isspace(valstr[i]))
      NoBlank[j++] = valstr[i];
  NoBlank[j] = '\0';
  *val1 = atof(NoBlank);
  string_copy(name3, &line[39], 8);
  string_copy(valstr, &line[49], 12);
  j = 0;
  for (i = 0; i < 15 && valstr[i] != '\0'; i++)
    if (!isspace(valstr[i]))
      NoBlank[j++] = valstr[i];
  NoBlank[j] = '\0';
  *val2 = atof(NoBlank);
  return 0;
}
```