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

```asm
<parse_number>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L223
  addq   $0x1,-0x8(%rbp)
L223:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  jne    L236
  addq   $0x1,-0x8(%rbp)
  jmp    L102
L236:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L103
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L92
L103:
  mov    $0x0,%eax
  jmp    L121
L92:
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L102
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L92
L102:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L208
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L100
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L49
L100:
  mov    $0x0,%eax
  jmp    L121
L49:
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L208
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L49
L208:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x45,%al
  je     L186
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L209
L186:
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2b,%al
  je     L75
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L201
L75:
  addq   $0x1,-0x8(%rbp)
L201:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L8
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L147
L8:
  mov    $0x0,%eax
  jmp    L121
L147:
  addq   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L209
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L147
L209:
  cmpq   $0x0,-0x20(%rbp)
  je     L88
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <strtod@plt>
  movq   %xmm0,%rax
  mov    -0x20(%rbp),%rdx
  mov    %rax,(%rdx)
L88:
  mov    -0x18(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    $0x1,%eax
L121:
  leave
  ret
```

assistant: ```c
int parse_number(const char **sp, double *out) {
  const char *s = *sp;
  if (*s == '-')
    s++;
  if (*s == '0') {
    s++;
  } else {
    if (!((*s) >= '0' && (*s) <= '9'))
      return 0;
    do {
      s++;
    } while (((*s) >= '0' && (*s) <= '9'));
  }
  if (*s == '.') {
    s++;
    if (!((*s) >= '0' && (*s) <= '9'))
      return 0;
    do {
      s++;
    } while (((*s) >= '0' && (*s) <= '9'));
  }
  if (*s == 'E' || *s == 'e') {
    s++;
    if (*s == '+' || *s == '-')
      s++;
    if (!((*s) >= '0' && (*s) <= '9'))
      return 0;
    do {
      s++;
    } while (((*s) >= '0' && (*s) <= '9'));
  }
  if (out)
    *out = strtod(*sp, NULL);
  *sp = s;
  return 1;
}
```