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

```asm
<__format_double>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %edi,%ebx
  mov    %esi,%ebp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  push   0x68(%rsp)
  push   0x68(%rsp)
  call   <isnan@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  je     L178
  test   $0x10,%bl
  je     L126
  lea    D110(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
L97:
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L305
  mov    %rbx,%rax
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L126:
  lea    D68(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L97
L178:
  push   0x68(%rsp)
  push   0x68(%rsp)
  call   <isinf@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  je     L123
  test   $0x10,%bl
  je     L128
  fldt   0x60(%rsp)
  fldz
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L260
  test   $0x1,%bl
  je     L4
  lea    D13(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L97
L260:
  lea    D122(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L97
L4:
  lea    D72(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L97
L128:
  fldt   0x60(%rsp)
  fldz
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L201
  test   $0x1,%bl
  je     L224
  lea    D62(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L97
L201:
  lea    D11(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L97
L224:
  lea    D98(%rip),%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L97
L123:
  test   $0x80,%bl
  jne    L183
  test   $0x1,%bh
  je     L45
  flds   0xc42(%rip)        # 2024 <_fini+0xa74>
  fldt   0x60(%rsp)
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L45
L183:
  push   0x68(%rsp)
  push   0x68(%rsp)
  call   <log10l@plt>
  fstpt  0x10(%rsp)
  mov    0x10(%rsp),%r12
  mov    0x18(%rsp),%r13d
  push   %r13
  push   %r12
  call   <floorl@plt>
  mov    %eax,%esi
  add    $0x20,%rsp
  mov    $0xa,%edi
  call   <powl@plt>
  mov    %ebx,%edi
  and    $0x7f,%dil
  fldt   0x60(%rsp)
  fdivp  %st,%st(1)
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  mov    %ebp,%esi
  call   <__format_double>
  mov    %rax,%rbp
  mov    %ebx,%edi
  or     $0x1,%edi
  push   %r13
  push   %r12
  call   <__format_int@plt>
  mov    %rax,%r12
  add    $0x20,%rsp
  test   $0x10,%bl
  lea    D103(%rip),%rsi
  lea    D70(%rip),%rax
  cmove  %rax,%rsi
  mov    $0x0,%ecx
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <strvcat@plt>
  mov    %rax,%rbx
  mov    %rbp,%rdi
  call   <free@plt>
  mov    %r12,%rdi
  call   <free@plt>
  jmp    L97
L45:
  lea    0x10(%rsp),%rdi
  push   0x68(%rsp)
  push   0x68(%rsp)
  call   <modfl@plt>
  fld    %st(0)
  fstpt  0x10(%rsp)
  add    $0x10,%rsp
  flds   0xb6d(%rip)        # 2028 <_fini+0xa78>
  fxch   %st(1)
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L296
  push   0x18(%rsp)
  push   0x18(%rsp)
  mov    %ebx,%edi
  call   <__format_double_int@plt>
  mov    %rax,%r12
  add    $0x10,%rsp
L67:
  push   0x8(%rsp)
  push   0x8(%rsp)
  mov    %ebp,%esi
  mov    %ebx,%edi
  call   <__format_double_frac@plt>
  mov    %rax,%r13
  add    $0x10,%rsp
  fldz
  fldt   0x10(%rsp)
  fucomip %st(1),%st
  jp     L304
  jne    L66
  fldt   (%rsp)
  fxch   %st(1)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L231
  jmp    L3
L304:
  fstp   %st(0)
  jmp    L3
L66:
  fstp   %st(0)
L3:
  fldz
  fldt   (%rsp)
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L175
  jne    L175
  test   $0x4,%bl
  je     L47
L175:
  mov    $0x0,%ecx
  mov    %r13,%rdx
  lea    D91(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <strvcat@plt>
  mov    %rax,%rbx
L136:
  mov    %r12,%rdi
  call   <free@plt>
  mov    %r13,%rdi
  call   <free@plt>
  jmp    L97
L296:
  push   0x18(%rsp)
  push   0x18(%rsp)
  mov    %ebx,%edi
  call   <__format_int@plt>
  mov    %rax,%r12
  add    $0x10,%rsp
  jmp    L67
L231:
  mov    $0x0,%r8d
  mov    %rax,%rcx
  lea    D91(%rip),%rdx
  mov    %r12,%rsi
  lea    D80(%rip),%rdi
  mov    $0x0,%eax
  call   <strvcat@plt>
  mov    %rax,%rbx
  jmp    L136
L47:
  mov    %r12,%rdi
  call   <strdup@plt>
  mov    %rax,%rbx
  jmp    L136
L305:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D110
type: string
name: parse_data
arguments: data_label: D68
type: string
name: parse_data
arguments: data_label: D13
type: string
name: parse_data
arguments: data_label: D122
type: string
name: parse_data
arguments: data_label: D72
type: string
name: parse_data
arguments: data_label: D62
type: string
name: parse_data
arguments: data_label: D11
type: string
name: parse_data
arguments: data_label: D98
type: string
name: parse_data
arguments: data_label: D103
type: string
name: parse_data
arguments: data_label: D70
type: string
name: parse_data
arguments: data_label: D91
type: string
name: parse_data
arguments: data_label: D80
type: string

tool: D110: NAN

tool: D68: nan

tool: D13: +INF

tool: D122: -INF

tool: D72: INF

tool: D62: +inf

tool: D11: -inf

tool: D98: inf

tool: D103: E

tool: D70: e

tool: D91: .

tool: D80: -

assistant: ```c
char *__format_double(long double value, int flags, int precision) {
  char *int_part;
  char *dec_part;
  char *string;
  long double i;
  if (isnan(value)) {
    if (flags & 0x10) {
      return strdup("NAN");
    } else {
      return strdup("nan");
    }
  }
  if (isinf(value)) {
    if (flags & 0x10) {
      if (value < 0) {
        return strdup("-INF");
      } else {
        if (flags & 0x01) {
          return strdup("+INF");
        } else {
          return strdup("INF");
        }
      }
    } else {
      if (value < 0) {
        return strdup("-inf");
      } else {
        if (flags & 0x01) {
          return strdup("+inf");
        } else {
          return strdup("inf");
        }
      }
    }
  }
  if (flags & 0x80 || (flags & 0x100 && value > 1000000000)) {
    i = log10l(value);
    value /= powl(10, floorl(i));
    int_part = __format_double(value, flags & ~(0x80), precision);
    dec_part = __format_int(i, flags | 0x01);
    string = strvcat(int_part, (flags & 0x10) ? "E" : "e", dec_part, NULL);
    free(int_part);
    free(dec_part);
  } else {
    value = modfl(value, &i);
    if (value > 2000000000) {
      int_part = __format_double_int(i, flags);
    } else {
      int_part = __format_int(i, flags);
    }
    dec_part = __format_double_frac(value, flags, precision);
    if (i == 0.0 && value < 0) {
      if (value != 0.0 || flags & 0x04) {
        string = strvcat("-", int_part, ".", dec_part, NULL);
      } else {
        string = strvcat("-", int_part, NULL);
      }
    } else {
      if (value != 0.0 || flags & 0x04) {
        string = strvcat(int_part, ".", dec_part, NULL);
      } else {
        string = strdup(int_part);
      }
    }
    free(int_part);
    free(dec_part);
  }
  return string;
}
```