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

```asm
<main>:
  endbr64
  push   %r15
  lea    D148(%rip),%rdx
  push   %r14
  movq   %rdx,%xmm0
  lea    D104(%rip),%rdx
  lea    D73(%rip),%r14
  push   %r13
  push   %r12
  lea    D210(%rip),%r12
  push   %rbp
  lea    D31(%rip),%rbp
  push   %rbx
  sub    $0xb8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xa8(%rsp)
  lea    D99(%rip),%rax
  lea    0x10(%rsp),%rbx
  lea    0xa0(%rsp),%r13
  movq   %rax,%xmm3
  lea    D24(%rip),%rax
  punpcklqdq %xmm3,%xmm0
  movq   %rax,%xmm4
  lea    D193(%rip),%rax
  movaps %xmm0,0x10(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm5
  lea    D63(%rip),%rdx
  punpcklqdq %xmm4,%xmm0
  lea    D223(%rip),%rax
  movaps %xmm0,0x20(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm6
  lea    D69(%rip),%rdx
  punpcklqdq %xmm5,%xmm0
  lea    D17(%rip),%rax
  movaps %xmm0,0x30(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm7
  lea    D255(%rip),%rdx
  punpcklqdq %xmm6,%xmm0
  lea    D146(%rip),%rax
  movaps %xmm0,0x40(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm3
  lea    D256(%rip),%rdx
  punpcklqdq %xmm7,%xmm0
  lea    D14(%rip),%rax
  movaps %xmm0,0x50(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm4
  lea    D4(%rip),%rdx
  punpcklqdq %xmm3,%xmm0
  lea    D97(%rip),%rax
  movaps %xmm0,0x60(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm5
  lea    D108(%rip),%rdx
  punpcklqdq %xmm4,%xmm0
  lea    D117(%rip),%rax
  movaps %xmm0,0x70(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm6
  lea    D98(%rip),%rdx
  punpcklqdq %xmm5,%xmm0
  movaps %xmm0,0x80(%rsp)
  movq   %rdx,%xmm0
  punpcklqdq %xmm6,%xmm0
  movaps %xmm0,0x90(%rsp)
  jmp    L80
  nopl   0x0(%rax)
L172:
  movzbl (%r15),%ecx
  cmp    $0x2b,%cl
  je     L113
  cmp    $0x30,%cl
  je     L30
L57:
  pxor   %xmm2,%xmm2
  ucomiss %xmm2,%xmm1
  jp     L91
  jne    L91
  cmp    $0x1,%eax
  je     L83
  jle    L91
  lea    -0x2d(%rcx),%eax
  cmp    $0x1,%al
  jbe    L51
  cmp    $0x30,%cl
  je     L51
  cmpb   $0x30,0x1(%r15)
  je     L51
  mov    %r14,%rdi
  call   <puts@plt>
  nopl   0x0(%rax,%rax,1)
L91:
  mov    %rbp,%rdi
  add    $0x8,%rbx
  call   <puts@plt>
  cmp    %rbx,%r13
  je     L62
L80:
  mov    (%rbx),%r15
  mov    %r15,%rdi
  call   <atof@plt>
  mov    %r15,%rsi
  mov    %r12,%rdi
  mov    $0x1,%eax
  movaps %xmm0,%xmm1
  cvtss2sd %xmm0,%xmm0
  movss  %xmm1,0xc(%rsp)
  call   <printf@plt>
  mov    %r15,%rdi
  call   <strlen@plt>
  movss  0xc(%rsp),%xmm1
  test   %eax,%eax
  jne    L172
  lea    D15(%rip),%rdi
  call   <puts@plt>
  jmp    L91
  nopl   0x0(%rax)
L30:
  cmpb   $0x78,0x1(%r15)
  jne    L57
  lea    D1(%rip),%rdi
  call   <puts@plt>
  jmp    L91
  nopl   0x0(%rax)
L113:
  lea    D9(%rip),%rdi
  call   <puts@plt>
  jmp    L91
  nopl   0x0(%rax)
L83:
  cmp    $0x30,%cl
  je     L91
  lea    D258(%rip),%rdi
  call   <puts@plt>
  jmp    L91
  nopw   0x0(%rax,%rax,1)
L51:
  movzbl 0x2(%r15),%eax
  test   %al,%al
  je     L91
  lea    0x2(%r15),%rdx
L123:
  cmp    $0x30,%al
  jne    L239
  movzbl 0x1(%rdx),%eax
  add    $0x1,%rdx
  test   %al,%al
  je     L91
  jmp    L123
  nop
L62:
  mov    0xa8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L134
  add    $0xb8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L239:
  lea    D135(%rip),%rdi
  call   <puts@plt>
  jmp    L91
L134:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: label: D148
type_guessed: string
name: unpack_data
arguments: label: D104
type_guessed: string
name: unpack_data
arguments: label: D73
type_guessed: string
name: unpack_data
arguments: label: D210
type_guessed: string
name: unpack_data
arguments: label: D31
type_guessed: string
name: unpack_data
arguments: label: D99
type_guessed: string
name: unpack_data
arguments: label: D24
type_guessed: string
name: unpack_data
arguments: label: D193
type_guessed: string
name: unpack_data
arguments: label: D63
type_guessed: string
name: unpack_data
arguments: label: D223
type_guessed: string
name: unpack_data
arguments: label: D69
type_guessed: string
name: unpack_data
arguments: label: D17
type_guessed: string
name: unpack_data
arguments: label: D255
type_guessed: string
name: unpack_data
arguments: label: D146
type_guessed: string
name: unpack_data
arguments: label: D256
type_guessed: string
name: unpack_data
arguments: label: D14
type_guessed: string
name: unpack_data
arguments: label: D4
type_guessed: string
name: unpack_data
arguments: label: D97
type_guessed: string
name: unpack_data
arguments: label: D108
type_guessed: string
name: unpack_data
arguments: label: D117
type_guessed: string
name: unpack_data
arguments: label: D98
type_guessed: string
name: unpack_data
arguments: label: D15
type_guessed: string
name: unpack_data
arguments: label: D1
type_guessed: string
name: unpack_data
arguments: label: D9
type_guessed: string
name: unpack_data
arguments: label: D258
type_guessed: string
name: unpack_data
arguments: label: D135
type_guessed: string

tool: D148: -345

tool: D104: 0.000000000003

tool: D73: > 1 but not .0 or -0

tool: D210: original %s  float: %g


tool: D31: ------------

tool: D99: 0.00002

tool: D24: 5e12

tool: D193: 0

tool: D63: 10.000000000003

tool: D223: 0.00000000000

tool: D69: 0.0

tool: D17: .0

tool: D255: 000000000000

tool: 

tool: D256: .000000000000000

tool: D14: .0000000000a00000

tool: D4: 0.0.0

tool: D97: 0x01010

tool: D108: 0x00000

tool: D117: fourty4

tool: D98: +123

tool: D15: zero length

tool: D1: hex not supported

tool: D9: start with +

tool: D258: one length != 0

tool: D135: found non-0 or non-.

assistant: ```c
void main(void) {
  char buf[256];
  float f;
  int i, len, isfloat;
  char *strs[] = {
      "-345", "0.00002", "0.000000000003", "5e12", "10.000000000003", "0", "0.0", "0.00000000000", "000000000000", ".0", ".000000000000000", "", "0.0.0", ".0000000000a00000", "0x00000", "0x01010", "+123", "fourty4",
  };
  for (i = 0; i < 18; i++) {
    isfloat = 1;
    f = atof(strs[i]);
    printf("original %s  float: %g\n", strs[i], f);
    len = strlen(strs[i]);
    if (len == 0) {
      isfloat = 0;
      printf("zero length\n");
    } else if (strs[i][0] == '+') {
      isfloat = 0;
      printf("start with +\n");
    } else if (strs[i][0] == '0' && strs[i][1] == 'x') {
      isfloat = 0;
      printf("hex not supported\n");
    } else if (f == 0) {
      if (len == 1 && strs[i][0] != '0') {
        isfloat = 0;
        printf("one length != 0\n");
      } else if (len > 1) {
        if ((strs[i][0] != '0' && strs[i][0] != '.' && strs[i][0] != '-') && strs[i][1] != '0') {
          isfloat = 0;
          printf("> 1 but not .0 or -0\n");
        } else {
          char *str = &strs[i][2];
          int founddot = 0;
          while (*str != '\0') {
            if (*str == '.')
              founddot++;
            if ((*str != '0' && *str != '.') || founddot) {
              isfloat = 0;
              printf("found non-0 or non-.\n");
              break;
            }
            str++;
          }
        }
      }
    }
    printf("------------\n");
  }
}
```