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

```asm
<main>:
  endbr64
  push   %r15
  lea    D39(%rip),%rdi
  push   %r14
  push   %r13
  lea    D14(%rip),%r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  lea    0x30(%rsp),%r15
  lea    0x28(%rsp),%r14
  call   <puts@plt>
  lea    D15(%rip),%rdi
  call   <puts@plt>
  lea    D186(%rip),%rdi
  call   <puts@plt>
  lea    D161(%rip),%rdi
  call   <puts@plt>
  lea    D158(%rip),%rdi
  call   <puts@plt>
  lea    D63(%rip),%rdi
  call   <puts@plt>
  lea    D90(%rip),%rdi
  call   <puts@plt>
  lea    D11(%rip),%rdi
  call   <puts@plt>
  lea    D128(%rip),%rdi
  call   <puts@plt>
  lea    D121(%rip),%rdi
  call   <puts@plt>
  lea    0x20(%rsp),%rax
  mov    %rax,0x18(%rsp)
  nopl   (%rax)
L28:
  mov    0x18(%rsp),%rsi
  mov    %r15,%rcx
  mov    %r14,%rdx
  lea    D76(%rip),%rdi
  call   <scanf@plt>
  cmp    $0x3,%eax
  jne    L22
  movsd  0x20(%rsp),%xmm2
  movsd  0x28(%rsp),%xmm0
  lea    D78(%rip),%rbx
  lea    D119(%rip),%r12
  lea    D106(%rip),%rbp
  comisd %xmm2,%xmm0
  jb     L28
  nop
L7:
  cvttsd2si %xmm2,%edi
  movsd  %xmm2,0x10(%rsp)
  call   <log@plt>
  mov    $0x2,%edi
  movsd  %xmm0,(%rsp)
  call   <log@plt>
  movsd  (%rsp),%xmm1
  mov    %r13,%rdi
  divsd  %xmm0,%xmm1
  cvttsd2si %xmm1,%eax
  movapd %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  xor    %eax,%eax
  subsd  %xmm1,%xmm0
  mulsd  D107(%rip),%xmm1
  mulsd  D184(%rip),%xmm0
  movsd  %xmm1,(%rsp)
  movsd  %xmm0,0x8(%rsp)
  call   <printf@plt>
  movsd  D157(%rip),%xmm5
  addsd  (%rsp),%xmm5
  mov    %rbx,%rdi
  movsd  0x8(%rsp),%xmm0
  mov    $0x2,%eax
  movapd %xmm5,%xmm1
  call   <printf@plt>
  movsd  (%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  mov    %rbx,%rdi
  addsd  D54(%rip),%xmm1
  mov    $0x2,%eax
  call   <printf@plt>
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    $0x1,%eax
  movsd  0x10(%rsp),%xmm2
  movapd %xmm2,%xmm0
  movsd  %xmm2,(%rsp)
  call   <printf@plt>
  movsd  (%rsp),%xmm2
  addsd  0x30(%rsp),%xmm2
  movsd  0x28(%rsp),%xmm0
  comisd %xmm2,%xmm0
  jae    L7
  jmp    L28
  nopl   0x0(%rax,%rax,1)
L22:
  mov    0x38(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L12
  add    $0x48,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L12:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_tag: D39
data_type: string
name: parse_data
arguments: data_tag: D14
data_type: string
name: parse_data
arguments: data_tag: D15
data_type: string
name: parse_data
arguments: data_tag: D186
data_type: string
name: parse_data
arguments: data_tag: D161
data_type: string
name: parse_data
arguments: data_tag: D158
data_type: string
name: parse_data
arguments: data_tag: D63
data_type: string
name: parse_data
arguments: data_tag: D90
data_type: string
name: parse_data
arguments: data_tag: D11
data_type: string
name: parse_data
arguments: data_tag: D128
data_type: string
name: parse_data
arguments: data_tag: D121
data_type: string
name: parse_data
arguments: data_tag: D76
data_type: string
name: parse_data
arguments: data_tag: D78
data_type: string
name: parse_data
arguments: data_tag: D119
data_type: string
name: parse_data
arguments: data_tag: D106
data_type: string
name: parse_data
arguments: data_tag: D107
data_type: byte[8]
name: parse_data
arguments: data_tag: D184
data_type: f64
name: parse_data
arguments: data_tag: D157
data_type: f64
name: parse_data
arguments: data_tag: D54
data_type: f64

tool: D39: Generate scale for spectrum chart.

tool: D14: \psline

tool: D15: Enter three space separated frequencies Eg. 300e12 400e12 10e11

tool: D186:   exa e18.

tool: D161:  peta e15.

tool: D158:  tera e12.

tool: D63:  giga e9.

tool: D90:  mega e6.

tool: D11:   x step is 0.5 inches.

tool: D128:   y divided into 12 steps.

tool: D121: Ctl-c to exit.

tool: D76: %lf %lf %lf

tool: D78: (%.3f,%.3f)

tool: D119: %

tool: D106: %s 	point=%.2f


tool: {"D107": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

tool: D184: 9.8

tool: D157: 3.05

tool: D54: 3.075

assistant: ```c
int main() {
  double point, xpos, start, end, step, startxpos, startypos, endxpos, endypos, position, width;
  int ypos;
  width = 9.8;
  printf("Generate scale for spectrum chart.\n");
  printf("Enter three space separated frequencies Eg. 300e12 400e12 10e11\n");
  printf("  exa e18.\n");
  printf(" peta e15.\n");
  printf(" tera e12.\n");
  printf(" giga e9.\n");
  printf(" mega e6.\n");
  printf("  x step is 0.5 inches.\n");
  printf("  y divided into 12 steps.\n");
  printf("Ctl-c to exit.\n");
  while (scanf("%lf %lf %lf", &start, &end, &step) == 3) {
    for (point = start; point <= end; point = point + step) {
      position = log(point) / log(2);
      ypos = (int)position;
      startxpos = ((position - (double)ypos)) * width;
      startypos = (double)(ypos) / 2 + 3.05;
      endypos = (double)(ypos) / 2 + 3.075;
      printf("\\psline");
      printf("(%.3f,%.3f)", startxpos, startypos);
      printf("(%.3f,%.3f)", startxpos, endypos);
      printf("%s \tpoint=%.2f\n", "%", point);
    }
  }
  return 0;
  position = log(start) / log(2);
  ypos = (int)position;
  startxpos = ((position - (double)ypos)) * width;
  startypos = (double)(ypos) / 2 + 3.05;
  printf("\t(%.2f,%.2f)", startxpos, startypos);
  position = log(end) / log(2);
  ypos = (int)position;
  endxpos = ((position - (double)ypos)) * width;
  endypos = (double)(ypos) / 2 + 3.25;
  printf("(%.2f,%.2f)   ", endxpos, endypos);
  printf("(%.2f,", (endxpos - startxpos) / 2 + startxpos);
  printf("%.2f)\n", (endypos - startypos) / 2 + startypos);
}
```