user: What would the C source look like for the assembly code provided here:

```asm
<_atof>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L97
L90:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L32
  mov    -0x28(%rbp),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,(%rax)
  pxor   %xmm0,%xmm0
  jmp    L68
L32:
  addq   $0x1,-0x10(%rbp)
L97:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jle    L90
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x2b,%eax
  je     L12
  cmp    $0x2d,%eax
  je     L134
  jmp    L148
L12:
  addq   $0x1,-0x10(%rbp)
  movss  D54(%rip),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  jmp    L94
L134:
  addq   $0x1,-0x10(%rbp)
  movss  D45(%rip),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  jmp    L94
L148:
  movss  D54(%rip),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  nop
L94:
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L45
L72:
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x2f,-0x14(%rbp)
  jle    L45
  cmpl   $0x39,-0x14(%rbp)
  jg     L45
  subl   $0x30,-0x14(%rbp)
  movss  -0x18(%rbp),%xmm1
  movss  D14(%rip),%xmm0
  mulss  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2ssl -0x14(%rbp),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
  jmp    L72
L45:
  cmpl   $0x2e,-0x14(%rbp)
  jne    L36
  movsd  D3(%rip),%xmm0
  movsd  %xmm0,-0x8(%rbp)
L95:
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x2f,-0x14(%rbp)
  jle    L36
  cmpl   $0x39,-0x14(%rbp)
  jg     L36
  subl   $0x30,-0x14(%rbp)
  pxor   %xmm1,%xmm1
  cvtss2sd -0x18(%rbp),%xmm1
  pxor   %xmm0,%xmm0
  cvtsi2sdl -0x14(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x18(%rbp)
  movsd  -0x8(%rbp),%xmm1
  movsd  D3(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  jmp    L95
L36:
  mov    -0x28(%rbp),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,(%rax)
  movss  -0x18(%rbp),%xmm0
  mulss  -0x1c(%rbp),%xmm0
  cvtss2sd %xmm0,%xmm0
L68:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  pop    %rbp
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D54
type_guessed: byte[4]
name: extract_symbolic_data
arguments: data_label: D45
type_guessed: byte[4]
name: extract_symbolic_data
arguments: data_label: D14
type_guessed: byte[4]
name: extract_symbolic_data
arguments: data_label: D3
type_guessed: f64

tool: {"D54": [0x00,0x00,0x80,0x3f]}

tool: {"D45": [0x00,0x00,0x80,0xbf]}

tool: {"D14": [0x00,0x00,0x20,0x41]}

tool: D3: 0.1

assistant: ```c
double _atof(const char **stringPtr) {
  const char *string;
  float sign;
  float value;
  int c;
  string = *stringPtr;
  while (*string <= ' ') {
    if (!*string) {
      *stringPtr = string;
      return 0;
    }
    string++;
  }
  switch (*string) {
  case '+':
    string++;
    sign = 1;
    break;
  case '-':
    string++;
    sign = -1;
    break;
  default:
    sign = 1;
    break;
  }
  value = 0;
  if (string[0] != '.') {
    do {
      c = *string++;
      if (c < '0' || c > '9') {
        break;
      }
      c -= '0';
      value = value * 10 + c;
    } while (1);
  }
  if (c == '.') {
    double fraction;
    fraction = 0.1;
    do {
      c = *string++;
      if (c < '0' || c > '9') {
        break;
      }
      c -= '0';
      value += c * fraction;
      fraction *= 0.1;
    } while (1);
  }
  *stringPtr = string;
  return value * sign;
}
```