user: Please show me the C implementation that matches the assembly code listed below:

```asm
<X3DGetValues3f>:
  endbr64
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x8,%rsp
  test   %rdi,%rdi
  je     L217
  movzbl (%rdi),%eax
  mov    %rdi,%rbx
  test   %al,%al
  jne    L103
  jmp    L74
  nopl   (%rax)
L94:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
L103:
  cmp    $0x20,%al
  je     L94
  cmp    $0x9,%al
  je     L94
  mov    %rbx,%rdi
  call   <atof@plt>
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  movss  %xmm0,0x0(%rbp)
  movzbl (%rbx),%eax
  test   $0xdf,%al
  jne    L288
  jmp    L271
  nopw   0x0(%rax,%rax,1)
L115:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  test   $0xdf,%al
  je     L271
L288:
  cmp    $0x9,%al
  jne    L115
  cmp    $0x20,%al
  jne    L257
  nopl   0x0(%rax)
L108:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
L271:
  cmp    $0x20,%al
  je     L108
L257:
  cmp    $0x9,%al
  je     L108
  mov    %rbx,%rdi
  call   <atof@plt>
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  movss  %xmm0,0x4(%rbp)
  movzbl (%rbx),%eax
  test   $0xdf,%al
  jne    L27
  jmp    L19
  nopw   0x0(%rax,%rax,1)
L145:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  test   $0xdf,%al
  je     L19
L27:
  cmp    $0x9,%al
  jne    L145
L243:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  cmp    $0x20,%al
  je     L243
  cmp    $0x9,%al
  je     L243
L175:
  mov    %rbx,%rdi
  call   <atof@plt>
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  movss  %xmm0,0x8(%rbp)
  movzbl (%rbx),%eax
  test   $0xdf,%al
  jne    L29
  jmp    L122
  nop
L127:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  test   $0xdf,%al
  je     L122
L29:
  cmp    $0x9,%al
  jne    L127
L41:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  cmp    $0x20,%al
  je     L41
  cmp    $0x9,%al
  je     L41
L91:
  test   %al,%al
  mov    $0x0,%eax
  cmovne %rbx,%rax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopw   0x0(%rax,%rax,1)
L19:
  cmp    $0x9,%al
  je     L243
  cmp    $0x20,%al
  je     L243
  jmp    L175
  nopw   0x0(%rax,%rax,1)
L122:
  cmp    $0x9,%al
  je     L41
  cmp    $0x20,%al
  je     L41
  jmp    L91
  nopw   0x0(%rax,%rax,1)
L217:
  mov    D1(%rip),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  je     L28
L74:
  movq   $0x0,0x0(%rbp)
  xor    %eax,%eax
  movl   $0x0,0x8(%rbp)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
L28:
  jmp    1060 <X3DGetValues3f.cold>
```

assistant: ```c
const char *X3DGetValues3f(const char *arg, GLfloat *vf) {
  if ((arg != NULL) ? (*arg == '\0') : GL_TRUE) {
    vf[0] = 0.0f;
    vf[1] = 0.0f;
    vf[2] = 0.0f;
    return (NULL);
  }
  while ((((*arg) == ' ') || ((*arg) == '\t')))
    arg++;
  vf[0] = (((arg) != NULL) ? (float)atof(arg) : 0.0f);
  while (!(((*arg) == ' ') || ((*arg) == '\t')) && (*arg != '\0'))
    arg++;
  while ((((*arg) == ' ') || ((*arg) == '\t')))
    arg++;
  vf[1] = (((arg) != NULL) ? (float)atof(arg) : 0.0f);
  while (!(((*arg) == ' ') || ((*arg) == '\t')) && (*arg != '\0'))
    arg++;
  while ((((*arg) == ' ') || ((*arg) == '\t')))
    arg++;
  vf[2] = (((arg) != NULL) ? (float)atof(arg) : 0.0f);
  while (!(((*arg) == ' ') || ((*arg) == '\t')) && (*arg != '\0'))
    arg++;
  while ((((*arg) == ' ') || ((*arg) == '\t')))
    arg++;
  return ((*arg != '\0') ? arg : NULL);
}
```