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

```asm
<read_float>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  push   %rbx
  lea    (%rdi,%rsi,1),%rbx
  sub    $0x18,%rsp
  mov    %rcx,(%rsp)
  cmp    %rbx,%rdi
  jae    L116
  cmpb   $0x2d,(%rdi)
  movl   $0x0,0xc(%rsp)
  mov    %rdi,%rbp
  mov    %rdi,%r15
  je     L41
L125:
  xor    %r14d,%r14d
  jmp    L44
  nopw   0x0(%rax,%rax,1)
L30:
  mov    D17(%rip),%rax
  movslq (%rax),%rax
  mov    %rax,%rsi
  imul   $0x66666667,%rax,%rax
  sar    $0x1f,%esi
  sar    $0x22,%rax
  sub    %esi,%eax
  cmp    %r14d,%eax
  jle    L69
  lea    (%r14,%r14,4),%eax
  add    $0x1,%r15
  lea    (%rdx,%rax,2),%r14d
  cmp    %r15,%rbx
  jbe    L80
L44:
  movsbl (%r15),%edi
  call   <digit_to_num@plt>
  mov    %eax,%edx
  test   %eax,%eax
  jns    L30
  xor    %r13d,%r13d
  cmp    %rbx,%r15
  jae    L184
  cmpb   $0x2e,(%r15)
  je     L183
L184:
  mov    0xc(%rsp),%eax
  mov    %r13d,(%r12)
  test   %eax,%eax
  je     L157
L87:
  neg    %r14d
L157:
  mov    %r15d,%eax
  sub    %ebp,%eax
  jmp    L135
  cs nopw 0x0(%rax,%rax,1)
L116:
  movl   $0x0,(%rdx)
  xor    %eax,%eax
  xor    %r14d,%r14d
L135:
  mov    (%rsp),%rcx
  mov    %r14d,(%rcx)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L183:
  add    $0x1,%r15
  cmp    %r15,%rbx
  ja     L167
  jmp    L184
  nopl   0x0(%rax,%rax,1)
L45:
  lea    (%r14,%r14,4),%eax
  add    $0x1,%r15
  sub    $0x1,%r13d
  lea    (%rdx,%rax,2),%r14d
  cmp    %r15,%rbx
  je     L184
L167:
  movsbl (%r15),%edi
  call   <digit_to_num@plt>
  mov    %eax,%edx
  test   %eax,%eax
  js     L184
  mov    D17(%rip),%rax
  movslq (%rax),%rax
  mov    %rax,%rdi
  imul   $0x66666667,%rax,%rax
  sar    $0x1f,%edi
  sar    $0x22,%rax
  sub    %edi,%eax
  cmp    %r14d,%eax
  jg     L45
L69:
  mov    D3(%rip),%rax
  mov    (%rax),%eax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  neg    %eax
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L41:
  lea    0x1(%rdi),%r15
  cmp    %r15,%rbx
  jbe    L136
  movl   $0x1,0xc(%rsp)
  jmp    L125
L136:
  movl   $0x0,(%rdx)
  xor    %r14d,%r14d
  jmp    L87
L80:
  xor    %r13d,%r13d
  jmp    L184
```

assistant: ```c
int read_float(char *buf, size_t size, int *exponent_out, int *mantissa_out) {
  int mantissa = 0;
  int exponent = 0;
  bool neg = false;
  char *cursor = buf;
  char *end = buf + size;
  if (cursor < end && *cursor == '-') {
    neg = true;
    cursor++;
  }
  while (cursor < end) {
    int digit = digit_to_num(*cursor);
    if (digit < 0)
      break;
    if (mantissa >= (INT_MAX / 10))
      return -EOVERFLOW;
    mantissa *= 10;
    mantissa += digit;
    cursor++;
  }
  if (cursor < end && *cursor == '.') {
    cursor++;
    while (cursor < end) {
      int digit = digit_to_num(*cursor);
      if (digit < 0)
        break;
      if (mantissa >= (INT_MAX / 10))
        return -EOVERFLOW;
      mantissa *= 10;
      mantissa += digit;
      cursor++;
      exponent--;
    }
  }
  *exponent_out = exponent;
  *mantissa_out = neg ? -mantissa : mantissa;
  return cursor - buf;
}
```