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

```asm
<projectPoint>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    %r8,-0x68(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x58(%rbp),%rax
  movss  (%rax),%xmm0
  mov    -0x50(%rbp),%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x3c(%rbp)
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mov    -0x50(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x38(%rbp)
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mov    -0x50(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x34(%rbp)
  mov    -0x60(%rbp),%rax
  movss  (%rax),%xmm0
  mov    -0x50(%rbp),%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x30(%rbp)
  mov    -0x60(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mov    -0x50(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x2c(%rbp)
  mov    -0x60(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mov    -0x50(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x28(%rbp)
  lea    -0x24(%rbp),%rdx
  lea    -0x30(%rbp),%rcx
  lea    -0x3c(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <crossVectorsNorm@plt>
  lea    -0x24(%rbp),%rax
  mov    %rax,%rdi
  call   <magnitudeVector@plt>
  test   %rax,%rax
  jne    L8
  mov    -0x50(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x24(%rbp)
  mov    -0x50(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x20(%rbp)
  mov    -0x50(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  lea    -0x24(%rbp),%rax
  mov    %rax,%rdi
  call   <normalizeVector@plt>
L8:
  lea    -0x24(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dotVectors@plt>
  movd   %xmm0,%ebx
  lea    -0x24(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dotVectors@plt>
  movaps %xmm0,%xmm1
  movd   %ebx,%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,-0x40(%rbp)
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  -0x40(%rbp),%xmm0
  mov    -0x68(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mov    -0x68(%rbp),%rax
  add    $0x4,%rax
  mulss  -0x40(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mov    -0x68(%rbp),%rax
  add    $0x8,%rax
  mulss  -0x40(%rbp),%xmm0
  movss  %xmm0,(%rax)
  nop
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L6
  call   <__stack_chk_fail@plt>
L6:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void projectPoint(const float *point, const float *v0, const float *v1, const float *v2, float *projected_point) {
  float v0v1[3], v0v2[3], norm[3];
  float s;
  v0v1[0] = v1[0] - v0[0];
  v0v1[1] = v1[1] - v0[1];
  v0v1[2] = v1[2] - v0[2];
  v0v2[0] = v2[0] - v0[0];
  v0v2[1] = v2[1] - v0[1];
  v0v2[2] = v2[2] - v0[2];
  crossVectorsNorm(v0v1, v0v2, norm);
  if (magnitudeVector(norm) == 0) {
    norm[0] = v0[0];
    norm[1] = v0[1];
    norm[2] = v0[2];
    normalizeVector(norm);
  }
  s = dotVectors(v0, norm) / dotVectors(point, norm);
  projected_point[0] = s * point[0];
  projected_point[1] = s * point[1];
  projected_point[2] = s * point[2];
  return;
}
```