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

```asm
<base_base_dist>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xb8,%rsp
  mov    %rdi,0x20(%rsp)
  mov    %rsi,0x30(%rsp)
  mov    %rdx,%rax
  mov    %rcx,%r15
  mov    %r8,0x10(%rsp)
  mov    %r9,0x40(%rsp)
  movsd  %xmm0,0x48(%rsp)
  mov    0xf0(%rsp),%rcx
  mov    %rcx,0x28(%rsp)
  mov    0xf8(%rsp),%rcx
  mov    %rcx,0x50(%rsp)
  mov    0x100(%rsp),%rdx
  mov    %rdx,0x58(%rsp)
  mov    0x108(%rsp),%rcx
  mov    %rcx,0x60(%rsp)
  mov    %fs:0x28,%rdx
  mov    %rdx,0xa8(%rsp)
  xor    %edx,%edx
  lea    (%rax,%rdi,8),%r14
  mov    (%r14),%rdx
  mov    0x8(%rdx),%rbx
  cmp    0x10(%rdx),%rbx
  jg     L21
  lea    (%rax,%rsi,8),%rax
  mov    %rax,0x38(%rsp)
  movq   $0x0,0x18(%rsp)
  lea    D353(%rip),%rbp
  jmp    L371
L369:
  cmpb   $0x27,0x3(%r12)
  jne    L610
  jmp    L436
L265:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L570
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L833
  mov    0x8(%rsp),%rax
  mov    (%r15,%rax,8),%r12
  lea    D265(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D266(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D358(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D14(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  jmp    L617
L833:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L454
  mov    0x8(%rsp),%rax
  mov    (%r15,%rax,8),%r12
  lea    D265(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D266(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  jmp    L617
L454:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  jne    L247
L274:
  mov    0x8(%rsp),%rax
  mov    (%r15,%rax,8),%r12
  lea    D265(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D14(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  jmp    L617
L247:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  je     L274
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  je     L274
  jmp    L617
L729:
  cmpb   $0x27,0x3(%rbx)
  jne    L302
L584:
  add    $0x1,%r12
  add    $0x8,%r13
  mov    (%r14),%rax
  cmp    %r12,0x10(%rax)
  jl     L44
L18:
  mov    %r13,%r15
  mov    0x0(%r13),%rbx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D349(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D107(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D125(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  movzbl 0x1(%rbx),%eax
  cmp    $0x43,%al
  je     L729
  cmp    $0x50,%al
  je     L584
L302:
  mov    0x10(%rsp),%rbx
  add    0x30(%rsp),%rbx
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  jne    L165
L359:
  mov    (%r15),%rbx
  lea    D265(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D266(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D358(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
L414:
  mov    0x68(%rsp),%rax
  mov    0x8(%rsp),%rcx
  mov    (%rax,%rcx,8),%rbx
  cmpb   $0x43,0x1(%rbx)
  je     L41
L329:
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L786
  lea    D294(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L786
  lea    D107(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L786
  lea    D125(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L786
  lea    D349(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L205
L786:
  mov    (%r15),%rbx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D294(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D107(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D125(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D349(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
L205:
  mov    0x40(%rsp),%rax
  mov    0x8(%rsp),%rcx
  mov    (%rax,%rcx,8),%rcx
  mov    (%rax,%r12,8),%rdx
  mov    $0x1,%eax
L561:
  movsd  (%rcx,%rax,8),%xmm0
  subsd  (%rdx,%rax,8),%xmm0
  movsd  %xmm0,0x80(%rsp,%rax,8)
  add    $0x1,%rax
  cmp    $0x4,%rax
  jne    L561
  lea    0x80(%rsp),%rdi
  call   <veclen@plt>
  movq   %xmm0,%rbx
  movsd  0x48(%rsp),%xmm1
  comisd %xmm0,%xmm1
  jbe    L584
  addq   $0x1,0x18(%rsp)
  mov    0x18(%rsp),%rax
  cmp    $0x200,%rax
  jg     L830
L609:
  mov    0x68(%rsp),%rax
  mov    0x8(%rsp),%rcx
  mov    (%rax,%rcx,8),%rsi
  mov    0x50(%rsp),%rcx
  mov    0x18(%rsp),%rax
  mov    (%rcx,%rax,8),%rdi
  call   <strcpy@plt>
  mov    0x58(%rsp),%rcx
  mov    0x18(%rsp),%rax
  mov    (%rcx,%rax,8),%rdi
  mov    (%r15),%rsi
  call   <strcpy@plt>
  mov    0x60(%rsp),%rcx
  mov    0x18(%rsp),%rax
  mov    %rbx,(%rcx,%rax,8)
  jmp    L584
L165:
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L359
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L765
  mov    (%r15),%rbx
  lea    D265(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D266(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D358(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D14(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L414
  jmp    L584
L765:
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L518
  mov    (%r15),%rbx
  lea    D265(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D266(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L414
  jmp    L584
L518:
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  jne    L268
L87:
  mov    (%r15),%rbx
  lea    D265(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L584
  lea    D14(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L414
  jmp    L584
L268:
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  je     L87
  movsbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  jne    L414
  jmp    L87
L41:
  mov    (%r15),%rax
  cmpb   $0x43,0x1(%rax)
  jne    L329
  jmp    L584
L830:
  lea    D253(%rip),%rdi
  call   <nrerror@plt>
  jmp    L609
L44:
  mov    0x70(%rsp),%r14
  mov    0x78(%rsp),%rbx
  mov    0x68(%rsp),%r15
L436:
  add    $0x1,%rbx
  mov    (%r14),%rax
  cmp    %rbx,0x10(%rax)
  jl     L705
L371:
  mov    %rbx,0x8(%rsp)
  mov    (%r15,%rbx,8),%r12
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D349(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D107(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D125(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  movzbl 0x1(%r12),%eax
  cmp    $0x43,%al
  je     L369
  cmp    $0x50,%al
  je     L436
L610:
  mov    0x10(%rsp),%r12
  add    0x20(%rsp),%r12
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  jne    L265
L570:
  mov    0x8(%rsp),%rax
  mov    (%r15,%rax,8),%r12
  lea    D265(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D266(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
  lea    D358(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L436
L617:
  mov    0x38(%rsp),%rcx
  mov    (%rcx),%rax
  mov    0x8(%rax),%r12
  cmp    0x10(%rax),%r12
  jg     L436
  lea    (%r15,%r12,8),%r13
  mov    %r14,0x70(%rsp)
  mov    %rcx,%r14
  mov    %rbx,0x78(%rsp)
  mov    %r15,0x68(%rsp)
  jmp    L18
L21:
  movq   $0x0,0x18(%rsp)
L705:
  mov    0x28(%rsp),%rax
  mov    0x18(%rsp),%rdx
  mov    %rdx,(%rax)
  mov    0xa8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L447
  add    $0xb8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L447:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_tag: D353
type_infered: string
name: unpack_data
arguments: data_tag: D265
type_infered: string
name: unpack_data
arguments: data_tag: D266
type_infered: string
name: unpack_data
arguments: data_tag: D358
type_infered: string
name: unpack_data
arguments: data_tag: D14
type_infered: string
name: unpack_data
arguments: data_tag: D349
type_infered: string
name: unpack_data
arguments: data_tag: D107
type_infered: string
name: unpack_data
arguments: data_tag: D125
type_infered: string
name: unpack_data
arguments: data_tag: D294
type_infered: string
name: unpack_data
arguments: data_tag: D253
type_infered: string

tool: D353:  O3'

tool: D265:  C4 

tool: D266:  C5 

tool: D358:  C6 

tool: D14:  C2 

tool: D349:  O2P

tool: D107:  O5'

tool: D125:  O1P

tool: D294:  O4'

tool: D253: Too many possible H-bonds between two bases

assistant: ```c
void base_base_dist(long i, long j, long **seidx, char **AtomName, char *bseq, double **xyz, double dist, long *nh, char **hb_atom1, char **hb_atom2, double *hb_dist) {
  double dd, dtmp[4];
  long k, m, n, num_hbonds = 0;
  for (m = seidx[i][1]; m <= seidx[i][2]; m++) {
    if (!strcmp(AtomName[m], " O3'") || !strcmp(AtomName[m], " O2P") || !strcmp(AtomName[m], " O5'") || !strcmp(AtomName[m], " O1P"))
      continue;
    if ((AtomName[m][1] == 'C' && AtomName[m][3] == '\'') || AtomName[m][1] == 'P')
      continue;
    if (toupper(bseq[i]) == 'A' || toupper(bseq[i]) == 'I') {
      if (!strcmp(AtomName[m], " C4 ") || !strcmp(AtomName[m], " C5 ") || !strcmp(AtomName[m], " C6 "))
        continue;
    } else if (toupper(bseq[i]) == 'G') {
      if (!strcmp(AtomName[m], " C4 ") || !strcmp(AtomName[m], " C5 ") || !strcmp(AtomName[m], " C6 ") || !strcmp(AtomName[m], " C2 "))
        continue;
    } else if (toupper(bseq[i]) == 'P') {
      if (!strcmp(AtomName[m], " C4 ") || !strcmp(AtomName[m], " C5 "))
        continue;
    } else if (toupper(bseq[i]) == 'U' || toupper(bseq[i]) == 'C' || toupper(bseq[i]) == 'T') {
      if (!strcmp(AtomName[m], " C4 ") || !strcmp(AtomName[m], " C2 "))
        continue;
    }
    for (n = seidx[j][1]; n <= seidx[j][2]; n++) {
      if (!strcmp(AtomName[n], " O3'") || !strcmp(AtomName[n], " O2P") || !strcmp(AtomName[n], " O5'") || !strcmp(AtomName[n], " O1P"))
        continue;
      if ((AtomName[n][1] == 'C' && AtomName[n][3] == '\'') || AtomName[n][1] == 'P')
        continue;
      if (toupper(bseq[j]) == 'A' || toupper(bseq[j]) == 'I') {
        if (!strcmp(AtomName[n], " C4 ") || !strcmp(AtomName[n], " C5 ") || !strcmp(AtomName[n], " C6 "))
          continue;
      } else if (toupper(bseq[j]) == 'G') {
        if (!strcmp(AtomName[n], " C4 ") || !strcmp(AtomName[n], " C5 ") || !strcmp(AtomName[n], " C6 ") || !strcmp(AtomName[n], " C2 "))
          continue;
      } else if (toupper(bseq[j]) == 'P') {
        if (!strcmp(AtomName[n], " C4 ") || !strcmp(AtomName[n], " C5 "))
          continue;
      } else if (toupper(bseq[j]) == 'U' || toupper(bseq[j]) == 'C' || toupper(bseq[j]) == 'T') {
        if (!strcmp(AtomName[n], " C4 ") || !strcmp(AtomName[n], " C2 "))
          continue;
      }
      if (AtomName[m][1] == 'C' && AtomName[n][1] == 'C')
        continue;
      if ((!strcmp(AtomName[m], " O3'") || !strcmp(AtomName[m], " O4'") || !strcmp(AtomName[m], " O5'") || !strcmp(AtomName[m], " O1P") || !strcmp(AtomName[m], " O2P")) && (!strcmp(AtomName[n], " O3'") || !strcmp(AtomName[n], " O4'") || !strcmp(AtomName[n], " O5'") || !strcmp(AtomName[n], " O1P") || !strcmp(AtomName[n], " O2P")))
        continue;
      for (k = 1; k <= 3; k++) {
        dtmp[k] = xyz[m][k] - xyz[n][k];
      }
      if ((dd = veclen(dtmp)) < dist) {
        if (++num_hbonds > 512)
          nrerror("Too many possible H-bonds between two bases");
        strcpy(hb_atom1[num_hbonds], AtomName[m]);
        strcpy(hb_atom2[num_hbonds], AtomName[n]);
        hb_dist[num_hbonds] = dd;
      }
    }
  }
  *nh = num_hbonds;
}
```