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

```asm
<atof>:
  endbr64
  push   %r14
  pxor   %xmm0,%xmm0
  push   %r13
  push   %r12
  push   %rbp
  lea    0x1(%rdi),%rbp
  push   %rbx
  sub    $0x10,%rsp
  movsbl (%rdi),%ebx
  test   %ebx,%ebx
  jne    L153
  jmp    L44
  nopl   0x0(%rax)
L167:
  sub    $0x30,%ebx
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm0,%xmm0
  add    $0x1,%rbp
  mulsd  D8(%rip),%xmm0
  cvtsi2sd %ebx,%xmm1
  movsbl -0x1(%rbp),%ebx
  addsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  test   %ebx,%ebx
  je     L44
L153:
  mov    %ebx,%edi
  movss  %xmm0,0xc(%rsp)
  call   <isdigit@plt>
  movss  0xc(%rsp),%xmm0
  test   %rax,%rax
  jne    L167
  cmp    $0x2e,%ebx
  jne    L146
  lea    0x1(%rbp),%r12
  movsbl 0x0(%rbp),%ebp
  xor    %ebx,%ebx
  test   %ebp,%ebp
  jne    L114
  jmp    L44
  nopl   0x0(%rax,%rax,1)
L204:
  sub    $0x30,%ebp
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm0,%xmm0
  add    $0x1,%r12
  mulsd  D8(%rip),%xmm0
  cvtsi2sd %ebp,%xmm1
  sub    $0x1,%ebx
  movsbl -0x1(%r12),%ebp
  addsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  test   %ebp,%ebp
  je     L82
L114:
  mov    %ebp,%edi
  movss  %xmm0,0xc(%rsp)
  call   <isdigit@plt>
  movss  0xc(%rsp),%xmm0
  test   %rax,%rax
  jne    L204
  and    $0xffffffdf,%ebp
  cmp    $0x45,%ebp
  jne    L10
L148:
  movsbl (%r12),%ebp
  cmp    $0x2b,%ebp
  je     L30
  lea    0x1(%r12),%r13
  mov    $0x1,%r14d
  cmp    $0x2d,%ebp
  jne    L38
  movsbl 0x1(%r12),%ebp
  lea    0x2(%r12),%r13
  mov    $0xffffffff,%r14d
L38:
  xor    %r12d,%r12d
  jmp    L163
  nopl   0x0(%rax)
L78:
  lea    (%r12,%r12,4),%eax
  add    $0x1,%r13
  lea    -0x30(%rbp,%rax,2),%r12d
  movsbl -0x1(%r13),%ebp
L163:
  mov    %ebp,%edi
  movss  %xmm0,0xc(%rsp)
  call   <isdigit@plt>
  movss  0xc(%rsp),%xmm0
  test   %rax,%rax
  jne    L78
  imul   %r14d,%r12d
  add    %r12d,%ebx
  test   %ebx,%ebx
  jle    L10
  movss  D25(%rip),%xmm1
  nopl   (%rax)
L203:
  mulss  %xmm1,%xmm0
  sub    $0x1,%ebx
  jne    L203
L44:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L10:
  test   %ebx,%ebx
  je     L44
L82:
  movsd  D34(%rip),%xmm1
  nopw   0x0(%rax,%rax,1)
L53:
  cvtss2sd %xmm0,%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  add    $0x1,%ebx
  jne    L53
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  cs nopw 0x0(%rax,%rax,1)
L30:
  movsbl 0x1(%r12),%ebp
  lea    0x2(%r12),%r13
  mov    $0x1,%r14d
  jmp    L38
  cs nopw 0x0(%rax,%rax,1)
L146:
  and    $0xffffffdf,%ebx
  cmp    $0x45,%ebx
  jne    L44
  mov    %rbp,%r12
  xor    %ebx,%ebx
  jmp    L148
```

tool_calls: name: unpack_data
arguments: data_label: D8
datatype: f64
name: unpack_data
arguments: data_label: D25
datatype: byte[4]
name: unpack_data
arguments: data_label: D34
datatype: f64

tool: D8: 10

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

tool: D34: 0.1

assistant: ```c
float atof(char *s) {
  float a = 0.0;
  int e = 0;
  int c;
  while ((c = *s++) != '\0' && isdigit(c)) {
    a = a * 10.0 + (c - '0');
  }
  if (c == '.') {
    while ((c = *s++) != '\0' && isdigit(c)) {
      a = a * 10.0 + (c - '0');
      e = e - 1;
    }
  }
  if (c == 'e' || c == 'E') {
    int sign = 1;
    int i = 0;
    c = *s++;
    if (c == '+')
      c = *s++;
    else if (c == '-') {
      c = *s++;
      sign = -1;
    }
    while (isdigit(c)) {
      i = i * 10 + (c - '0');
      c = *s++;
    }
    e += i * sign;
  }
  while (e > 0) {
    a *= 10.0;
    e--;
  }
  while (e < 0) {
    a *= 0.1;
    e++;
  }
  return a;
}
```