user: 请将以下的汇编代码转换成C语言代码:

```asm
<main>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xb0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xa8(%rsp)
  xor    %eax,%eax
  lea    D238(%rip),%rax
  mov    %rax,0x10(%rsp)
  lea    D273(%rip),%rax
  mov    %rax,0x18(%rsp)
  lea    D167(%rip),%rax
  mov    %rax,0x20(%rsp)
  lea    D252(%rip),%rax
  mov    %rax,0x28(%rsp)
  lea    D105(%rip),%rax
  mov    %rax,0x30(%rsp)
  lea    D119(%rip),%rax
  mov    %rax,0x38(%rsp)
  lea    D210(%rip),%rax
  mov    %rax,0x40(%rsp)
  lea    D250(%rip),%rax
  mov    %rax,0x48(%rsp)
  lea    D151(%rip),%rax
  mov    %rax,0x50(%rsp)
  lea    D20(%rip),%rax
  mov    %rax,0x58(%rsp)
  lea    D43(%rip),%rax
  mov    %rax,0x60(%rsp)
  lea    D114(%rip),%rax
  mov    %rax,0x68(%rsp)
  lea    D235(%rip),%rax
  mov    %rax,0x70(%rsp)
  lea    D81(%rip),%rax
  mov    %rax,0x78(%rsp)
  lea    D93(%rip),%rax
  mov    %rax,0x80(%rsp)
  lea    D160(%rip),%rax
  mov    %rax,0x88(%rsp)
  lea    D69(%rip),%rax
  mov    %rax,0x90(%rsp)
  lea    D16(%rip),%rax
  mov    %rax,0x98(%rsp)
  lea    0x10(%rsp),%rbp
  lea    0xa0(%rsp),%r13
  lea    D246(%rip),%r12
  lea    D186(%rip),%r14
  jmp    L180
L28:
  lea    D64(%rip),%rdi
  call   <puts@plt>
L31:
  lea    D35(%rip),%rdi
  call   <puts@plt>
  add    $0x8,%rbp
  cmp    %r13,%rbp
  je     L189
L180:
  mov    0x0(%rbp),%rbx
  mov    %rbx,%rdi
  call   <atof@plt>
  movss  %xmm0,0xc(%rsp)
  cvtss2sd %xmm0,%xmm0
  mov    %rbx,%rsi
  mov    %r12,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  je     L28
  movzbl (%rbx),%edx
  cmp    $0x2b,%dl
  je     L145
  cmp    $0x30,%dl
  je     L116
  movss  0xc(%rsp),%xmm1
  ucomiss D90(%rip),%xmm1
  jp     L31
  jne    L31
  cmp    $0x1,%eax
  je     L62
  jle    L31
  sub    $0x2d,%edx
  cmp    $0x1,%dl
  jbe    L186
  cmpb   $0x30,0x1(%rbx)
  je     L186
  lea    D68(%rip),%rdi
  call   <puts@plt>
  jmp    L31
L145:
  lea    D110(%rip),%rdi
  call   <puts@plt>
  jmp    L31
L116:
  cmpb   $0x78,0x1(%rbx)
  je     L202
  movss  0xc(%rsp),%xmm2
  ucomiss D90(%rip),%xmm2
  jp     L31
  jne    L31
  cmp    $0x1,%eax
  jle    L31
L186:
  lea    0x2(%rbx),%rdx
  movzbl 0x2(%rbx),%eax
  test   %al,%al
  je     L31
L112:
  lea    -0x2e(%rax),%ecx
  test   $0xfd,%cl
  jne    L35
  cmp    $0x2e,%al
  je     L35
  add    $0x1,%rdx
  movzbl (%rdx),%eax
  test   %al,%al
  jne    L112
  jmp    L31
L202:
  lea    D177(%rip),%rdi
  call   <puts@plt>
  jmp    L31
L62:
  lea    D277(%rip),%rdi
  call   <puts@plt>
  jmp    L31
L35:
  mov    %r14,%rdi
  call   <puts@plt>
  jmp    L31
L189:
  mov    0xa8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L173
  add    $0xb0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L173:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D238
datatype: string
name: parse_data
arguments: label: D273
datatype: string
name: parse_data
arguments: label: D167
datatype: string
name: parse_data
arguments: label: D252
datatype: string
name: parse_data
arguments: label: D105
datatype: string
name: parse_data
arguments: label: D119
datatype: string
name: parse_data
arguments: label: D210
datatype: string
name: parse_data
arguments: label: D250
datatype: string
name: parse_data
arguments: label: D151
datatype: string
name: parse_data
arguments: label: D20
datatype: string
name: parse_data
arguments: label: D43
datatype: string
name: parse_data
arguments: label: D114
datatype: string
name: parse_data
arguments: label: D235
datatype: string
name: parse_data
arguments: label: D81
datatype: string
name: parse_data
arguments: label: D93
datatype: string
name: parse_data
arguments: label: D160
datatype: string
name: parse_data
arguments: label: D69
datatype: string
name: parse_data
arguments: label: D16
datatype: string
name: parse_data
arguments: label: D246
datatype: string
name: parse_data
arguments: label: D186
datatype: string
name: parse_data
arguments: label: D64
datatype: string
name: parse_data
arguments: label: D35
datatype: string
name: parse_data
arguments: label: D90
datatype: byte[4]
name: parse_data
arguments: label: D68
datatype: string
name: parse_data
arguments: label: D110
datatype: string
name: parse_data
arguments: label: D177
datatype: string
name: parse_data
arguments: label: D277
datatype: string

tool: D238: -345

tool: D273: 0.00002

tool: D167: 0.000000000003

tool: D252: 5e12

tool: D105: 10.000000000003

tool: D119: 0

tool: D210: 0.0

tool: D250: 0.00000000000

tool: D151: 000000000000

tool: D20: .0

tool: D43: .000000000000000

tool: 

tool: D235: 0.0.0

tool: D81: .0000000000a00000

tool: D93: 0x00000

tool: D160: 0x01010

tool: D69: +123

tool: D16: fourty4

tool: D246: original %s  float: %g


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

tool: D64: zero length

tool: D35: ------------

tool: {"D90": [0x00,0x00,0x00,0x00]}

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

tool: D110: start with +

tool: D177: hex not supported

tool: D277: one length != 0

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");
  }
}
```