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

```asm
<strtod_flags>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  mov    %rsi,%r13
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x8,%rsp
  xchg   %ax,%ax
L124:
  mov    %rbx,%r15
  movsbl (%rbx),%edi
  add    $0x1,%rbx
  mov    %edi,%ebp
  call   <isspace@plt>
  test   %rax,%rax
  jne    L124
  xor    %ecx,%ecx
  test   $0x1,%r12b
  jne    L77
  cmp    $0x2b,%bpl
  je     L200
  cmp    $0x2d,%bpl
  je     L155
L77:
  mov    %r12d,%eax
  and    $0x2,%eax
  test   $0x4,%r12b
  je     L420
  test   %eax,%eax
  je     L433
  pxor   %xmm2,%xmm2
  xor    %eax,%eax
  movapd %xmm2,%xmm0
  cmp    $0x2e,%bpl
  je     L480
L209:
  cmp    $0x2c,%bpl
  je     L480
  lea    -0x30(%rbp),%edx
  cmp    $0x9,%dl
  ja     L80
  movsbl %dl,%edx
  pxor   %xmm1,%xmm1
  movzbl (%rbx),%ebp
  add    $0x1,%rbx
  mulsd  D34(%rip),%xmm0
  cvtsi2sd %edx,%xmm1
  add    $0x1,%eax
  addsd  %xmm1,%xmm0
  cmp    $0x2e,%bpl
  jne    L209
L480:
  movsd  D57(%rip),%xmm1
L194:
  test   %eax,%eax
  je     L35
L253:
  test   %r13,%r13
  je     L192
  sub    $0x1,%rbx
  mov    %rbx,0x0(%r13)
L192:
  test   %ecx,%ecx
  je     L208
  xorpd  D98(%rip),%xmm0
L208:
  divsd  %xmm1,%xmm0
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L420:
  xor    %esi,%esi
  pxor   %xmm2,%xmm2
  test   %eax,%eax
  movsd  D57(%rip),%xmm1
  mov    $0x0,%eax
  movapd %xmm2,%xmm0
  je     L360
L495:
  cmp    $0x2e,%bpl
  je     L194
  cmp    $0x2c,%bpl
  je     L405
  lea    -0x30(%rbp),%edx
  cmp    $0x9,%dl
  ja     L417
  mulsd  D34(%rip),%xmm0
  movsbl %dl,%edx
  pxor   %xmm3,%xmm3
  add    $0x1,%eax
  cvtsi2sd %edx,%xmm3
  addsd  %xmm3,%xmm0
  test   %esi,%esi
  je     L130
  mulsd  D34(%rip),%xmm1
  jmp    L130
  cs nopw 0x0(%rax,%rax,1)
L464:
  test   %esi,%esi
  jne    L194
  mov    $0x1,%esi
L441:
  movzbl (%rbx),%ebp
  add    $0x1,%rbx
L360:
  mov    %ebp,%edx
  and    $0xfffffffd,%edx
  cmp    $0x2c,%dl
  je     L464
  lea    -0x30(%rbp),%edx
  cmp    $0x9,%dl
  ja     L417
  mulsd  D34(%rip),%xmm0
  movsbl %dl,%edx
  pxor   %xmm3,%xmm3
  add    $0x1,%eax
  cvtsi2sd %edx,%xmm3
  addsd  %xmm3,%xmm0
  test   %esi,%esi
  je     L441
  mulsd  D34(%rip),%xmm1
  jmp    L441
  nopw   0x0(%rax,%rax,1)
L433:
  pxor   %xmm2,%xmm2
  movsd  D57(%rip),%xmm1
  xor    %esi,%esi
  xor    %eax,%eax
  movapd %xmm2,%xmm0
  cmp    $0x2e,%bpl
  je     L449
L100:
  cmp    $0x2c,%bpl
  je     L194
  lea    -0x30(%rbp),%edx
  cmp    $0x9,%dl
  ja     L417
  mulsd  D34(%rip),%xmm0
  movsbl %dl,%edx
  pxor   %xmm3,%xmm3
  add    $0x1,%eax
  cvtsi2sd %edx,%xmm3
  addsd  %xmm3,%xmm0
  test   %esi,%esi
  je     L98
  mulsd  D34(%rip),%xmm1
L98:
  movzbl (%rbx),%ebp
  add    $0x1,%rbx
  cmp    $0x2e,%bpl
  jne    L100
L449:
  test   %esi,%esi
  jne    L194
  mov    $0x1,%esi
  jmp    L98
  cs nopw 0x0(%rax,%rax,1)
L155:
  mov    $0x1,%ecx
L200:
  movzbl (%rbx),%ebp
  lea    0x2(%r15),%rbx
  jmp    L77
L80:
  movsd  D57(%rip),%xmm1
L417:
  and    $0xffffffdf,%ebp
  cmp    $0x45,%bpl
  jne    L194
  and    $0x8,%r12d
  jne    L194
  test   %eax,%eax
  je     L35
  movzbl (%rbx),%edx
  cmp    $0x2b,%dl
  je     L501
  cmp    $0x2d,%dl
  jne    L286
  mov    $0x1,%edi
L41:
  movzbl 0x1(%rbx),%edx
  lea    0x2(%rbx),%rax
L205:
  sub    $0x30,%edx
  cmp    $0x9,%dl
  ja     L253
  lea    0x1(%rax),%rbx
  movzbl (%rax),%eax
  movsbl %dl,%edx
  lea    -0x30(%rax),%esi
  cmp    $0x9,%sil
  ja     L244
  nopl   0x0(%rax)
L324:
  sub    $0x30,%eax
  lea    (%rdx,%rdx,4),%edx
  add    $0x1,%rbx
  movsbl %al,%eax
  lea    (%rax,%rdx,2),%edx
  movzbl -0x1(%rbx),%eax
  lea    -0x30(%rax),%esi
  cmp    $0x9,%sil
  jbe    L324
L244:
  mov    $0x134,%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  test   %edx,%edx
  je     L253
  movsd  D34(%rip),%xmm2
  test   %edi,%edi
  jne    L261
  nopl   0x0(%rax,%rax,1)
L24:
  divsd  %xmm2,%xmm1
  sub    $0x1,%eax
  test   %eax,%eax
  jle    L253
  sub    $0x1,%eax
  divsd  %xmm2,%xmm1
  test   %eax,%eax
  jg     L24
  jmp    L253
  nop
L35:
  test   %r13,%r13
  je     L440
  mov    %r14,0x0(%r13)
L440:
  add    $0x8,%rsp
  movapd %xmm2,%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L405:
  test   %esi,%esi
  jne    L194
  mov    $0x1,%esi
L130:
  add    $0x1,%rbx
  movzbl -0x1(%rbx),%ebp
  jmp    L495
  nopw   0x0(%rax,%rax,1)
L286:
  lea    0x1(%rbx),%rax
  xor    %edi,%edi
  jmp    L205
  nopl   0x0(%rax,%rax,1)
L261:
  mulsd  %xmm2,%xmm1
  sub    $0x1,%eax
  test   %eax,%eax
  jle    L253
  mulsd  %xmm2,%xmm1
  sub    $0x1,%eax
  test   %eax,%eax
  jg     L261
  jmp    L253
L501:
  xor    %edi,%edi
  jmp    L41
```

tool_calls: name: parse_data
arguments: data_tag: D34
data_type: f32[2]
name: parse_data
arguments: data_tag: D57
data_type: f64
name: parse_data
arguments: data_tag: D98
data_type: f32[4]

tool: {"D34": [0.0,2.5625]}

tool: D57: 1

tool: {"D98": [0.0,-0.0,0.0,0.0]}

assistant: ```c
double strtod_flags(const char *str, const char **ptr, unsigned int flags) {
  char c;
  const char *p = str, *ep;
  double val = 0.0;
  double decimal = 1.0;
  int sign = 0, esign = 0;
  int numbers = 0, dot = 0;
  while (isspace(c = *p++))
    ;
  if (!(flags & 0x01)) {
    switch (c) {
    case '-':
      sign = 1;
    case '+':
      c = *p++;
    }
  }
  for (;; c = *p++) {
    if ((c == '.' && !(flags & 0x02)) || (c == ',' && !(flags & 0x04))) {
      if (dot)
        goto done;
      dot = 1;
      continue;
    }
    if (c >= '0' && c <= '9') {
      numbers++;
      val = (val * 10) + (c - '0');
      if (dot)
        decimal *= 10;
      continue;
    }
    if (c != 'e' && c != 'E')
      goto done;
    if (flags & 0x08)
      goto done;
    break;
  }
  if (!numbers)
    goto done;
  ep = p;
  c = *ep++;
  switch (c) {
  case '-':
    esign = 1;
  case '+':
    c = *ep++;
  }
  if (c >= '0' && c <= '9') {
    p = ep;
    int exponent = c - '0';
    for (;;) {
      c = *p++;
      if (c < '0' || c > '9')
        break;
      exponent *= 10;
      exponent += c - '0';
    }
    if (exponent > 308)
      exponent = 308;
    while (exponent-- > 0) {
      if (esign)
        decimal *= 10;
      else
        decimal /= 10;
    }
  }
done:
  if (!numbers)
    goto no_conversion;
  if (ptr)
    *ptr = p - 1;
  return (sign ? -val : val) / decimal;
no_conversion:
  if (ptr)
    *ptr = str;
  return 0.0;
}
```