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

```asm
<atof_nonlocalized>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  movl   $0x0,-0x20(%rbp)
  movl   $0xffffffff,-0x1c(%rbp)
  movl   $0x0,-0x18(%rbp)
  movl   $0x1,-0x14(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi_nonlocalized@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  jmp    L156
L43:
  addl   $0x1,-0x20(%rbp)
L156:
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L43
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2b,%al
  je     L163
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L4
L163:
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L92
  movl   $0xffffffff,-0x14(%rbp)
L92:
  addl   $0x1,-0x20(%rbp)
L4:
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L136
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L124
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L72
L124:
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L70
L72:
  cmpl   $0x0,-0x1c(%rbp)
  js     L9
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L14
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jg     L14
  addl   $0x1,-0x18(%rbp)
L9:
  mov    -0x20(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L86
  cmpl   $0x0,-0x1c(%rbp)
  jns    L86
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
L86:
  addl   $0x1,-0x20(%rbp)
  jmp    L4
L136:
  nop
  jmp    L14
L70:
  nop
L14:
  cmpl   $0x0,-0x18(%rbp)
  je     L115
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <atoi_nonlocalized@plt>
  imul   -0x14(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movl   $0x1,-0x20(%rbp)
  jmp    L41
L147:
  mov    -0x20(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,-0x20(%rbp)
L41:
  mov    -0x18(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x18(%rbp)
  test   %eax,%eax
  jne    L147
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x20(%rbp),%xmm1
  movsd  -0x10(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L115:
  movsd  -0x8(%rbp),%xmm0
  addsd  -0x10(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

assistant: ```c
double atof_nonlocalized(const char *str) {
  int i = 0, dot_pos = -1, decimals = 0, sign = 1;
  double value, value2 = 0.0;
  value = atoi_nonlocalized(str);
  while (str[i] == ' ') {
    i++;
  }
  if ((str[i] == '+') || (str[i] == '-')) {
    if (str[i] == '-') {
      sign = -1;
    }
    i++;
  }
  for (;; i++) {
    if (str[i] == 0) {
      break;
    }
    if (((str[i] < '0') || (str[i] > '9')) && (str[i] != '.')) {
      break;
    }
    if (dot_pos >= 0) {
      if ((str[i] >= '0') && (str[i] <= '9')) {
        decimals++;
      } else {
        break;
      }
    }
    if (str[i] == '.') {
      if (dot_pos < 0) {
        dot_pos = i;
      }
    }
  }
  if (decimals) {
    value2 = atoi_nonlocalized(str + dot_pos + 1) * sign;
    i = 1;
    while (decimals--) {
      i *= 10;
    }
    value2 /= i;
  }
  return (value + value2);
}
```