user: Please show me the C implementation that matches the assembly code listed below:

```asm
<test_json_number_toDouble>:
  endbr64
  push   %r15
  lea    D21(%rip),%rdi
  lea    D45(%rip),%r15
  push   %r14
  lea    D279(%rip),%r14
  push   %r13
  lea    D109(%rip),%r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    $0x1,%ebx
  sub    $0x348,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x338(%rsp)
  xor    %eax,%eax
  lea    0x10(%rsp),%rbp
  lea    0x8(%rsp),%r12
  call   <puts@plt>
  lea    D193(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  mov    $0x64,%ecx
  mov    %rbp,%rdi
  rep stos %rax,%es:(%rdi)
  lea    D111(%rip),%rax
  lea    D309(%rip),%rcx
  movq   %rax,%xmm1
  movq   %rcx,%xmm0
  lea    D174(%rip),%rax
  punpcklqdq %xmm1,%xmm0
  lea    D350(%rip),%rcx
  movq   %rax,%xmm2
  movups %xmm0,0x18(%rsp)
  movq   %rcx,%xmm0
  lea    D6(%rip),%rax
  lea    D231(%rip),%rcx
  punpcklqdq %xmm2,%xmm0
  movq   %rax,%xmm3
  lea    D96(%rip),%rax
  movups %xmm0,0x28(%rsp)
  movq   %rcx,%xmm0
  lea    D165(%rip),%rcx
  movq   %rax,%xmm4
  punpcklqdq %xmm3,%xmm0
  lea    D86(%rip),%rax
  lea    D133(%rip),%rdx
  movups %xmm0,0x38(%rsp)
  movq   %rcx,%xmm0
  movq   %rax,%xmm5
  lea    D287(%rip),%rcx
  punpcklqdq %xmm4,%xmm0
  lea    D107(%rip),%rax
  movups %xmm0,0x48(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm6
  lea    D151(%rip),%rdx
  punpcklqdq %xmm5,%xmm0
  lea    D47(%rip),%rax
  movups %xmm0,0x58(%rsp)
  movq   %rcx,%xmm0
  movq   %rax,%xmm7
  lea    D103(%rip),%rcx
  punpcklqdq %xmm6,%xmm0
  lea    D42(%rip),%rax
  movups %xmm0,0x68(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm1
  lea    D192(%rip),%rdx
  punpcklqdq %xmm7,%xmm0
  lea    D271(%rip),%rax
  movups %xmm0,0x78(%rsp)
  movq   %rcx,%xmm0
  movq   %rax,%xmm2
  lea    D3(%rip),%rcx
  punpcklqdq %xmm1,%xmm0
  lea    D361(%rip),%rax
  movups %xmm0,0x88(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm3
  lea    D228(%rip),%rdx
  punpcklqdq %xmm2,%xmm0
  lea    D61(%rip),%rax
  movups %xmm0,0x98(%rsp)
  movq   %rcx,%xmm0
  movq   %rax,%xmm4
  lea    D333(%rip),%rcx
  punpcklqdq %xmm3,%xmm0
  lea    D213(%rip),%rax
  movups %xmm0,0xa8(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm5
  lea    D0(%rip),%rdx
  punpcklqdq %xmm4,%xmm0
  lea    D338(%rip),%rax
  movups %xmm0,0xb8(%rsp)
  movq   %rcx,%xmm0
  movq   %rax,%xmm6
  lea    D137(%rip),%rcx
  punpcklqdq %xmm5,%xmm0
  lea    D105(%rip),%rax
  movups %xmm0,0xc8(%rsp)
  movq   %rdx,%xmm0
  movq   %rax,%xmm7
  lea    D244(%rip),%rdx
  punpcklqdq %xmm6,%xmm0
  lea    D348(%rip),%rax
  movups %xmm0,0xd8(%rsp)
  movq   %rcx,%xmm0
  movq   %rax,%xmm1
  punpcklqdq %xmm7,%xmm0
  movups %xmm0,0xe8(%rsp)
  movq   %rdx,%xmm0
  punpcklqdq %xmm1,%xmm0
  movups %xmm0,0xf8(%rsp)
  nopl   0x0(%rax,%rax,1)
L5:
  mov    %ebx,%esi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %esi,%esi
  mov    %r12,%rdx
  mov    %r14,%rdi
  call   <json_number_toDouble@plt>
  test   %rax,%rax
  je     L17
  mov    %r14,%rsi
  lea    D122(%rip),%rdi
  xor    %eax,%eax
  add    $0x1,%rbx
  call   <printf@plt>
  mov    -0x8(%rbp,%rbx,8),%r14
  test   %r14,%r14
  jne    L5
L26:
  mov    0x338(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x348,%rsp
  lea    D347(%rip),%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1080 <puts@plt>
  nopl   (%rax)
L17:
  movsd  0x8(%rsp),%xmm0
  mov    %r14,%rsi
  mov    %r15,%rdi
  add    $0x1,%rbx
  mov    $0x1,%eax
  call   <printf@plt>
  mov    -0x8(%rbp,%rbx,8),%r14
  test   %r14,%r14
  jne    L5
  jmp    L26
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_label: D21
data_type: string
name: parse_data
arguments: data_label: D45
data_type: string
name: parse_data
arguments: data_label: D279
data_type: string
name: parse_data
arguments: data_label: D109
data_type: string
name: parse_data
arguments: data_label: D193
data_type: string
name: parse_data
arguments: data_label: D111
data_type: string
name: parse_data
arguments: data_label: D309
data_type: string
name: parse_data
arguments: data_label: D174
data_type: string
name: parse_data
arguments: data_label: D350
data_type: string
name: parse_data
arguments: data_label: D6
data_type: string
name: parse_data
arguments: data_label: D231
data_type: string
name: parse_data
arguments: data_label: D96
data_type: string
name: parse_data
arguments: data_label: D165
data_type: string
name: parse_data
arguments: data_label: D86
data_type: string
name: parse_data
arguments: data_label: D133
data_type: string
name: parse_data
arguments: data_label: D287
data_type: string
name: parse_data
arguments: data_label: D107
data_type: string
name: parse_data
arguments: data_label: D151
data_type: string
name: parse_data
arguments: data_label: D47
data_type: string
name: parse_data
arguments: data_label: D103
data_type: string
name: parse_data
arguments: data_label: D42
data_type: string
name: parse_data
arguments: data_label: D192
data_type: string
name: parse_data
arguments: data_label: D271
data_type: string
name: parse_data
arguments: data_label: D3
data_type: string
name: parse_data
arguments: data_label: D361
data_type: string
name: parse_data
arguments: data_label: D228
data_type: string
name: parse_data
arguments: data_label: D61
data_type: string
name: parse_data
arguments: data_label: D333
data_type: string
name: parse_data
arguments: data_label: D213
data_type: string
name: parse_data
arguments: data_label: D0
data_type: string
name: parse_data
arguments: data_label: D338
data_type: string
name: parse_data
arguments: data_label: D137
data_type: string
name: parse_data
arguments: data_label: D105
data_type: string
name: parse_data
arguments: data_label: D244
data_type: string
name: parse_data
arguments: data_label: D348
data_type: string
name: parse_data
arguments: data_label: D122
data_type: string
name: parse_data
arguments: data_label: D347
data_type: string

tool: D21: Test json_number_toDouble

tool: D45: %s = %f


tool: D279: --123

tool: D109: %d. 

tool: D193: ================================================================================

tool: D111: 123


tool: D309: abc

tool: D174: -

tool: D350: 456

tool: D6: -123

tool: D231: -abc

tool: D96: -0

tool: D165: 0

tool: D86: .

tool: D133: 0.

tool: D287: 0.0

tool: D107: 1.2.3

tool: D151: -10.123

tool: D47: 10.e

tool: D103: 10..

tool: D42: e

tool: D192: -E

tool: D271: -0e12

tool: D3: 10.5e00abc

tool: D361: 10.5E+13

tool: D228: 8.5E-2

tool: D61: 8e

tool: D333: 123E-

tool: D213: 456E+

tool: D0: 9.e

tool: D338: 9.e99

tool: D137: 0ee

tool: 

tool: D244: 0.0eabc

tool: D348: 0.0e-abc

tool: D122: %s is not number


tool: D347: ================================================================================


assistant: ```c
void test_json_number_toDouble() {
  puts("Test json_number_toDouble");
  puts("================================================================================");
  char *str[100] = {"--123", "abc", "123\n", "456", "-", "-abc", "-123", "0", "-0", "0.", ".", "0.0", "1.2.3", "-10.123", "10.e", "10..", "e", "-E", "-0e12", "10.5e00abc", "10.5E+13", "8.5E-2", "8e", "123E-", "456E+", "9.e", "9.e99", "0ee", "", "0.0eabc", "0.0e-abc"};
  int i;
  for (i = 0; str[i] != NULL; i++) {
    double number;
    printf("%d. ", i + 1);
    if (json_number_toDouble(str[i], 0, &number) != 0) {
      printf("%s is not number\n", str[i]);
    } else {
      printf("%s = %f\n", str[i], number);
    }
  }
  puts("================================================================================\n");
}
```