user: What is the c source code of the assembly code below?

```asm
<dtoa>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  movq   %xmm0,%r15
  mov    %rdi,%rbp
  mov    %esi,%ebx
  mov    %edx,%r14d
  call   <isnan@plt>
  test   %rax,%rax
  je     L52
  movb   $0x6e,0x0(%rbp)
  movb   $0x61,0x1(%rbp)
  lea    0x3(%rbp),%r12
  movb   $0x6e,0x2(%rbp)
L154:
  mov    %r12,%rax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L52:
  movq   %r15,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  jne    L169
  test   %ebx,%ebx
  mov    $0x1,%eax
  cmovle %eax,%ebx
  movq   %r15,%xmm5
  ucomisd D29(%rip),%xmm5
  jp     L111
  je     L295
L111:
  pxor   %xmm0,%xmm0
  movq   %r15,%xmm6
  comisd %xmm6,%xmm0
  ja     L338
  movq   %r15,%xmm0
  call   <log10@plt>
  mov    %eax,%r13d
  mov    %r15,0x8(%rsp)
  mov    %rbp,%r12
L190:
  test   %r14d,%r14d
  jne    L201
  lea    0x8(%r13),%eax
  cmp    $0x15,%eax
  ja     L262
  pxor   %xmm0,%xmm0
  movq   %r15,%xmm4
  comisd %xmm4,%xmm0
  jbe    L372
  cmp    $0x8,%r13d
  jle    L372
  mov    $0x1,%r14d
  jmp    L201
L169:
  pxor   %xmm0,%xmm0
  movq   %r15,%xmm3
  comisd %xmm3,%xmm0
  ja     L213
L191:
  movb   $0x69,0x0(%rbp)
  movb   $0x6e,0x1(%rbp)
  lea    0x3(%rbp),%r12
  movb   $0x66,0x2(%rbp)
  jmp    L154
L213:
  movb   $0x2d,0x0(%rbp)
  lea    0x1(%rbp),%rbp
  jmp    L191
L295:
  movb   $0x30,0x0(%rbp)
  lea    0x2(%rbp),%r12
  movb   $0x2e,0x1(%rbp)
  lea    0x2(%rbx),%edx
  add    %rbp,%rdx
  mov    %r12,%rax
L212:
  add    $0x1,%rax
  movb   $0x30,-0x1(%rax)
  cmp    %rax,%rdx
  jne    L212
  mov    %ebx,%ebx
  add    %rbx,%r12
  test   %r14d,%r14d
  je     L154
  movb   $0x65,(%r12)
  movb   $0x2b,0x1(%r12)
  movb   $0x30,0x2(%r12)
  movb   $0x30,0x3(%r12)
  lea    0x4(%r12),%r12
  jmp    L154
L338:
  movq   %r15,%xmm5
  xorpd  D39(%rip),%xmm5
  movsd  %xmm5,0x8(%rsp)
  movapd %xmm5,%xmm0
  call   <log10@plt>
  mov    %eax,%r13d
  lea    0x1(%rbp),%r12
  movb   $0x2d,0x0(%rbp)
  jmp    L190
L262:
  mov    $0x1,%r14d
L201:
  test   %r13d,%r13d
  js     L287
L230:
  mov    %r13d,%edi
  movsd  D58(%rip),%xmm0
  call   <pow@plt>
  movsd  0x8(%rsp),%xmm7
  divsd  %xmm0,%xmm7
  movsd  %xmm7,0x8(%rsp)
  mov    $0x0,%ebp
L173:
  test   %ebp,%ebp
  mov    $0x0,%eax
  cmovs  %eax,%ebp
  mov    $0x0,%r15d
  jmp    L383
L287:
  pxor   %xmm0,%xmm0
  cvtsi2sd %r13d,%xmm0
  subsd  D23(%rip),%xmm0
  cvttsd2si %xmm0,%r13d
  jmp    L230
L372:
  mov    %r13d,%ebp
  mov    %r14d,%r13d
  jmp    L173
L94:
  test   %r15,%r15
  je     L194
  sub    $0x1,%ebx
L125:
  sub    $0x1,%ebp
  test   %ebx,%ebx
  jle    L181
L383:
  mov    %ebp,%edi
  mov    D58(%rip),%rax
  movq   %rax,%xmm0
  call   <pow@plt>
  movsd  %xmm0,(%rsp)
  pxor   %xmm2,%xmm2
  comisd %xmm0,%xmm2
  jae    L154
  comisd %xmm2,%xmm0
  jbe    L94
  call   <isinf@plt>
  test   %rax,%rax
  jne    L94
  movsd  0x8(%rsp),%xmm0
  divsd  (%rsp),%xmm0
  call   <floor@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  (%rsp),%xmm0
  movsd  0x8(%rsp),%xmm3
  subsd  %xmm0,%xmm3
  movsd  %xmm3,0x8(%rsp)
  add    $0x30,%eax
  mov    %al,(%r12)
  lea    0x1(%r12),%r12
  jmp    L94
L194:
  test   %ebp,%ebp
  jne    L125
  movsd  0x8(%rsp),%xmm7
  comisd D29(%rip),%xmm7
  jbe    L125
  lea    0x1(%r12),%r15
  movb   $0x2e,(%r12)
  mov    %r15,%r12
  jmp    L125
L181:
  test   %r14d,%r14d
  je     L339
  movb   $0x65,(%r12)
  test   %r13d,%r13d
  js     L185
  lea    0x2(%r12),%r8
  movb   $0x2b,0x1(%r12)
  mov    %r8,%rdx
  mov    $0x0,%edi
  jle    L289
L51:
  mov    %r8,%rdx
  mov    $0x0,%edi
L155:
  add    $0x1,%rdx
  movslq %r13d,%rax
  imul   $0x66666667,%rax,%rax
  sar    $0x22,%rax
  mov    %r13d,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  lea    (%rax,%rax,4),%esi
  add    %esi,%esi
  mov    %r13d,%ecx
  sub    %esi,%ecx
  add    $0x30,%ecx
  mov    %cl,-0x1(%rdx)
  mov    %r13d,%ecx
  mov    %eax,%r13d
  add    $0x1,%edi
  cmp    $0x9,%ecx
  jg     L155
  mov    %rdx,%rax
  sub    %r8,%rax
  cmp    $0x1,%rax
  jg     L346
L289:
  mov    %rdx,%r12
L307:
  add    $0x1,%r12
  movb   $0x30,-0x1(%r12)
  lea    (%rdi,%r12,1),%eax
  sub    %edx,%eax
  mov    %r12,%rcx
  sub    %r8,%rcx
  cmp    $0x1,%rcx
  jle    L307
L247:
  lea    -0x1(%r12),%rsi
  cltq
  mov    %r12,%rdi
  sub    %rax,%rdi
  call   <mem_reverse@plt>
L339:
  movb   $0x0,(%r12)
  jmp    L154
L185:
  lea    0x2(%r12),%r8
  neg    %r13d
  movb   $0x2d,0x1(%r12)
  jmp    L51
L346:
  mov    %edi,%eax
  mov    %rdx,%r12
  jmp    L247
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D29
type_guessed: f64[2]
name: extract_symbolic_data
arguments: data_label: D39
type_guessed: byte[16]
name: extract_symbolic_data
arguments: data_label: D58
type_guessed: f64
name: extract_symbolic_data
arguments: data_label: D23
type_guessed: f64

tool: {"D29": [0.0,1.0]}

tool: {"D39": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: D58: 10

tool: D23: 1

assistant: ```c
char *dtoa(double n, char *s, int precision_with, bool use_exp) {
  if (precision_with <= 0) {
    precision_with = 1;
  }
  char *p_tmp = NULL;
  char *c = s;
  if (isnan(n)) {
    *s++ = 'n';
    *s++ = 'a';
    *s++ = 'n';
    return s;
  } else if (isinf(n)) {
    if (n < 0) {
      *s++ = '-';
    }
    *s++ = 'i';
    *s++ = 'n';
    *s++ = 'f';
    return s;
  } else if (n == 0.0) {
    *s++ = '0';
    *s++ = '.';
    while (precision_with-- > 0) {
      *s++ = '0';
    }
    if (use_exp) {
      *s++ = 'e';
      *s++ = '+';
      *s++ = '0';
      *s++ = '0';
    }
    return s;
  } else {
    int digit, m, m1 = 0;
    int neg = (n < 0);
    if (neg)
      n = -n;
    m = log10(n);
    if (neg)
      *(c++) = '-';
    if (!use_exp) {
      use_exp = (m >= 14 || (neg && m >= 9) || m <= -9);
    }
    if (use_exp) {
      if (m < 0)
        m -= 1.0;
      n = n / pow(10.0, m);
      m1 = m;
      m = 0;
    } else {
    }
    if (m < 1.0) {
      m = 0;
    }
    while (precision_with > 0) {
      double weight = pow(10.0, m);
      if (weight <= 0) {
        return c;
      }
      if (weight > 0 && !isinf(weight)) {
        digit = floor(n / weight);
        n -= (digit * weight);
        *(c++) = '0' + digit;
      }
      if (p_tmp) {
        precision_with--;
      } else if (m == 0 && n > 0) {
        *(c++) = '.';
        p_tmp = c;
      }
      m--;
    }
    if (use_exp) {
      *(c++) = 'e';
      if (m1 >= 0) {
        *(c++) = '+';
      } else {
        *(c++) = '-';
        m1 = -m1;
      }
      p_tmp = c;
      m = 0;
      while (m1 > 0) {
        *(c++) = '0' + m1 % 10;
        m1 /= 10;
        m++;
      }
      while ((c - p_tmp) < 2) {
        *(c++) = '0';
        m++;
      }
      mem_reverse(c - m, c - 1);
    }
    *(c) = '\0';
  }
  return c;
}
```