user: Demonstrate the C code that generates the assembly output below:

```asm
<Hbond_pair>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xe8,%rsp
  mov    %rdi,0x18(%rsp)
  mov    %rsi,0x20(%rsp)
  mov    %rdx,%rax
  mov    %rcx,0x38(%rsp)
  mov    %r8,0x10(%rsp)
  mov    %r9,0x50(%rsp)
  movsd  %xmm0,0x48(%rsp)
  mov    0x120(%rsp),%rdx
  mov    %rdx,0x30(%rsp)
  mov    0x128(%rsp),%rdx
  mov    %rdx,0x58(%rsp)
  mov    0x130(%rsp),%rdx
  mov    %rdx,0x60(%rsp)
  mov    0x138(%rsp),%rdx
  mov    %rdx,0x68(%rsp)
  mov    0x140(%rsp),%r14
  mov    %fs:0x28,%rdx
  mov    %rdx,0xd8(%rsp)
  xor    %edx,%edx
  lea    (%rax,%rdi,8),%r15
  mov    (%r15),%rdx
  mov    0x8(%rdx),%r13
  cmp    0x10(%rdx),%r13
  jg     L289
  lea    (%rax,%rsi,8),%rax
  mov    %rax,0x40(%rsp)
  lea    (%rcx,%r13,8),%rbx
  movq   $0x0,0x28(%rsp)
  mov    %r14,%r12
  jmp    L533
L100:
  cmpq   $0x0,0x148(%rsp)
  jne    L9
L351:
  mov    (%rbx),%rbp
  lea    D403(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D278(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D609(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D426(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
L9:
  mov    %rbx,0x8(%rsp)
  mov    (%rbx),%rdx
  movzbl 0x1(%rdx),%eax
  cmp    $0x43,%al
  jne    L429
  cmpb   $0x27,0x3(%rdx)
  jne    L1380
  jmp    L982
L1289:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L802
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L64
  mov    0x8(%rsp),%rax
  mov    (%rax),%rbp
  lea    D416(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D532(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D117(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D286(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  jmp    L1123
L64:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L295
  mov    0x8(%rsp),%rax
  mov    (%rax),%rbp
  lea    D416(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D532(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  jmp    L1123
L295:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  jne    L259
L1057:
  mov    0x8(%rsp),%rax
  mov    (%rax),%rbp
  lea    D416(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D286(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  jmp    L1123
L259:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  je     L1057
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  je     L1057
  jmp    L1123
L299:
  cmpq   $0x0,0x148(%rsp)
  je     L1422
L1244:
  mov    %rbp,%rbx
  mov    0x0(%rbp),%rdx
  movzbl 0x1(%rdx),%eax
  cmp    $0x43,%al
  jne    L1431
  cmpb   $0x27,0x3(%rdx)
  jne    L554
L1124:
  add    $0x1,%r14
  add    $0x8,%rbp
  mov    0x0(%r13),%rax
  cmp    %r14,0x10(%rax)
  jl     L1351
L577:
  test   %r12,%r12
  jne    L299
  mov    %rbp,%rbx
  mov    0x0(%rbp),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x43,%al
  je     L1124
  cmpq   $0x0,0x148(%rsp)
  jne    L1431
L1422:
  mov    0x0(%rbp),%rbx
  lea    D403(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D278(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D609(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D426(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1244
  jmp    L1124
L1431:
  cmp    $0x50,%al
  je     L1124
L554:
  mov    0x10(%rsp),%r15
  add    0x20(%rsp),%r15
  movsbl (%r15),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  jne    L260
L650:
  mov    (%rbx),%r15
  lea    D416(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D532(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D117(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
L1392:
  mov    0x8(%rsp),%rax
  mov    (%rax),%r15
  cmpb   $0x43,0x1(%r15)
  je     L173
L750:
  lea    D403(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L724
  lea    D25(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L724
  lea    D609(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L724
  lea    D426(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L724
  lea    D278(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L793
L724:
  mov    (%rbx),%r15
  lea    D403(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D25(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D609(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D426(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D278(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
L793:
  lea    0xa8(%rsp),%r9
  lea    0xa0(%rsp),%r8
  mov    0x38(%rsp),%rcx
  mov    0x10(%rsp),%rdx
  mov    %r14,%rsi
  mov    0x20(%rsp),%rdi
  call   <H_catalog@plt>
  cmpq   $0x1,0x90(%rsp)
  jne    L889
  cmpq   $0x1,0xa0(%rsp)
  je     L1124
L889:
  mov    0x8(%rsp),%r15
  mov    (%r15),%rax
  movsbl 0x1(%rax),%esi
  lea    D364(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L263
  mov    (%r15),%rax
  movzbl 0x3(%rax),%eax
  cmp    $0x50,%al
  je     L263
  cmp    $0x27,%al
  jne    L539
L263:
  mov    0x8(%rsp),%rax
  mov    (%rax),%rax
  cmpb   $0x43,0x1(%rax)
  je     L174
L1061:
  mov    (%rbx),%rax
  cmpb   $0x43,0x1(%rax)
  je     L1368
L1117:
  mov    0x8(%rsp),%rax
  mov    (%rax),%rax
  cmpb   $0x4f,0x1(%rax)
  je     L1161
L808:
  mov    (%rbx),%rax
  cmpb   $0x4f,0x1(%rax)
  je     L775
L637:
  mov    0x8(%rsp),%rax
  mov    (%rax),%rdx
  movzbl 0x3(%rdx),%eax
  cmp    $0x50,%al
  je     L444
L1245:
  mov    (%rbx),%rcx
  cmpb   $0x50,0x3(%rcx)
  jne    L545
  cmp    $0x27,%al
  jne    L1303
L545:
  movsd  0x48(%rsp),%xmm3
  addsd  D199(%rip),%xmm3
  movq   %xmm3,%r15
  comisd D343(%rip),%xmm3
  jb     L972
  mov    D343(%rip),%r15
L972:
  mov    0x50(%rsp),%rax
  mov    0x70(%rsp),%rcx
  mov    (%rax,%rcx,8),%rcx
  mov    (%rax,%r14,8),%rdx
  mov    $0x1,%eax
L342:
  movsd  (%rcx,%rax,8),%xmm0
  subsd  (%rdx,%rax,8),%xmm0
  movsd  %xmm0,0xb0(%rsp,%rax,8)
  add    $0x1,%rax
  cmp    $0x4,%rax
  jne    L342
  lea    0xb0(%rsp),%rdi
  call   <veclen@plt>
  movsd  %xmm0,0x88(%rsp)
  movq   %r15,%xmm1
  comisd %xmm0,%xmm1
  jbe    L1124
  addq   $0x1,0x28(%rsp)
  mov    0x28(%rsp),%rax
  cmp    $0x200,%rax
  jg     L538
L420:
  mov    0x58(%rsp),%rax
  mov    0x28(%rsp),%r15
  mov    (%rax,%r15,8),%rdi
  mov    0x8(%rsp),%rax
  mov    (%rax),%rsi
  call   <strcpy@plt>
  mov    0x60(%rsp),%rax
  mov    (%rax,%r15,8),%rdi
  mov    (%rbx),%rsi
  call   <strcpy@plt>
  mov    0x68(%rsp),%rax
  movsd  0x88(%rsp),%xmm5
  movsd  %xmm5,(%rax,%r15,8)
  jmp    L1124
L260:
  movsbl (%r15),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L650
  movsbl (%r15),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L1407
  mov    (%rbx),%r15
  lea    D416(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D532(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D117(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D286(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1392
  jmp    L1124
L1407:
  movsbl (%r15),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L513
  mov    (%rbx),%r15
  lea    D416(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D532(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1392
  jmp    L1124
L513:
  movsbl (%r15),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  jne    L56
L328:
  mov    (%rbx),%r15
  lea    D416(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1124
  lea    D286(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1392
  jmp    L1124
L56:
  movsbl (%r15),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  je     L328
  movsbl (%r15),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  jne    L1392
  jmp    L328
L173:
  mov    (%rbx),%rax
  cmpb   $0x43,0x1(%rax)
  jne    L750
  jmp    L1124
L539:
  mov    (%rbx),%rax
  movsbl 0x1(%rax),%esi
  lea    D364(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L263
  mov    (%rbx),%rax
  movzbl 0x3(%rax),%eax
  cmp    $0x50,%al
  je     L1427
  cmp    $0x27,%al
  je     L1427
  movsd  0x48(%rsp),%xmm6
  addsd  D518(%rip),%xmm6
  movq   %xmm6,%r15
  comisd D33(%rip),%xmm6
  jb     L972
  mov    D33(%rip),%r15
  jmp    L972
L174:
  mov    (%rbx),%rax
  movzbl 0x3(%rax),%edx
  cmp    $0x27,%dl
  je     L715
  cmp    $0x50,%dl
  je     L715
  movsbl 0x1(%rax),%esi
  lea    D364(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L1061
L526:
  movsd  0x48(%rsp),%xmm7
  addsd  D335(%rip),%xmm7
  movq   %xmm7,%r15
  comisd D33(%rip),%xmm7
  jb     L972
  mov    D33(%rip),%r15
  jmp    L972
L1368:
  mov    0x8(%rsp),%rax
  mov    (%rax),%rax
  movzbl 0x3(%rax),%edx
  cmp    $0x27,%dl
  je     L1236
  cmp    $0x50,%dl
  jne    L153
L1236:
  cmpb   $0x4f,0x1(%rax)
  jne    L637
L1161:
  cmpb   $0x27,0x3(%rax)
  jne    L808
  mov    (%rbx),%rax
  movsbl 0x1(%rax),%esi
  lea    D364(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L808
  mov    (%rbx),%rax
  movzbl 0x3(%rax),%eax
  cmp    $0x50,%al
  je     L808
  cmp    $0x27,%al
  je     L808
L135:
  movsd  0x48(%rsp),%xmm6
  addsd  D518(%rip),%xmm6
  movq   %xmm6,%r15
  comisd D33(%rip),%xmm6
  jb     L972
  mov    D33(%rip),%r15
  jmp    L972
L775:
  cmpb   $0x27,0x3(%rax)
  je     L1384
  mov    0x8(%rsp),%rax
  mov    (%rax),%rdx
  movzbl 0x3(%rdx),%eax
  cmp    $0x50,%al
  jne    L1245
  jmp    L794
L1384:
  mov    0x8(%rsp),%r15
  mov    (%r15),%rax
  movsbl 0x1(%rax),%esi
  lea    D364(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L637
  mov    (%r15),%rax
  movzbl 0x3(%rax),%eax
  cmp    $0x50,%al
  je     L637
  cmp    $0x27,%al
  jne    L135
  jmp    L637
L444:
  mov    (%rbx),%rcx
  cmpb   $0x27,0x3(%rcx)
  je     L545
  cmpb   $0x43,0x1(%rcx)
  je     L1245
  jmp    L794
L1303:
  cmpb   $0x43,0x1(%rdx)
  je     L545
L794:
  movsd  0x48(%rsp),%xmm7
  addsd  D477(%rip),%xmm7
  movq   %xmm7,%r15
  comisd D33(%rip),%xmm7
  jb     L972
  mov    D33(%rip),%r15
  jmp    L972
L538:
  lea    D365(%rip),%rdi
  call   <nrerror@plt>
  jmp    L420
L1351:
  mov    0x78(%rsp),%r15
  mov    0x70(%rsp),%r13
  mov    0x80(%rsp),%rbx
L982:
  add    $0x1,%r13
  add    $0x8,%rbx
  mov    (%r15),%rax
  cmp    %r13,0x10(%rax)
  jl     L1254
L533:
  test   %r12,%r12
  jne    L100
  mov    %rbx,0x8(%rsp)
  mov    (%rbx),%rax
  movzbl 0x1(%rax),%eax
  cmp    $0x43,%al
  je     L982
  cmpq   $0x0,0x148(%rsp)
  je     L351
L429:
  cmp    $0x50,%al
  je     L982
L1380:
  mov    0x10(%rsp),%rbp
  add    0x18(%rsp),%rbp
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  jne    L1289
L802:
  mov    0x8(%rsp),%rax
  mov    (%rax),%rbp
  lea    D416(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D532(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
  lea    D117(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L982
L1123:
  lea    0x98(%rsp),%r9
  lea    0x90(%rsp),%r8
  mov    0x38(%rsp),%rbp
  mov    %rbp,%rcx
  mov    0x10(%rsp),%rdx
  mov    %r13,%rsi
  mov    0x18(%rsp),%rdi
  call   <H_catalog@plt>
  mov    0x40(%rsp),%rdx
  mov    (%rdx),%rax
  mov    0x8(%rax),%r14
  cmp    0x10(%rax),%r14
  jg     L982
  lea    0x0(%rbp,%r14,8),%rbp
  mov    %r15,0x78(%rsp)
  mov    %r13,0x70(%rsp)
  mov    %rdx,%r13
  mov    %rbx,0x80(%rsp)
  jmp    L577
L289:
  movq   $0x0,0x28(%rsp)
L1254:
  mov    0x30(%rsp),%rax
  mov    0x28(%rsp),%rcx
  mov    %rcx,(%rax)
  mov    0xd8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L28
  add    $0xe8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L1427:
  mov    0x8(%rsp),%rax
  mov    (%rax),%rax
  cmpb   $0x43,0x1(%rax)
  jne    L1061
  mov    (%rbx),%rax
L715:
  cmpb   $0x43,0x1(%rax)
  jne    L808
  mov    0x8(%rsp),%rax
  mov    (%rax),%rax
  movzbl 0x3(%rax),%edx
  cmp    $0x27,%dl
  je     L637
  cmp    $0x50,%dl
  je     L637
L153:
  movsbl 0x1(%rax),%esi
  lea    D364(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L1117
  jmp    L526
L28:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D403
type_infered: string
name: unpack_data
arguments: data_label: D278
type_infered: string
name: unpack_data
arguments: data_label: D609
type_infered: string
name: unpack_data
arguments: data_label: D426
type_infered: string
name: unpack_data
arguments: data_label: D416
type_infered: string
name: unpack_data
arguments: data_label: D532
type_infered: string
name: unpack_data
arguments: data_label: D117
type_infered: string
name: unpack_data
arguments: data_label: D286
type_infered: string
name: unpack_data
arguments: data_label: D25
type_infered: string
name: unpack_data
arguments: data_label: D364
type_infered: string
name: unpack_data
arguments: data_label: D199
type_infered: f64
name: unpack_data
arguments: data_label: D343
type_infered: f64[2]
name: unpack_data
arguments: data_label: D518
type_infered: f64
name: unpack_data
arguments: data_label: D33
type_infered: f64[2]
name: unpack_data
arguments: data_label: D335
type_infered: f64
name: unpack_data
arguments: data_label: D477
type_infered: f64
name: unpack_data
arguments: data_label: D365
type_infered: string

tool: D403:  O3'

tool: D278:  O2P

tool: D609:  O5'

tool: D426:  O1P

tool: D416:  C4 

tool: D532:  C5 

tool: D117:  C6 

tool: D286:  C2 

tool: D25:  O4'

tool: D364: NO

tool: D199: 3.1

tool: {"D343": [3.8,3.4]}

tool: D518: 3.4

tool: {"D33": [4.0,3.8]}

tool: D335: 3.6

tool: D477: 3.2

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

assistant: ```c
void Hbond_pair(long i, long j, long **seidx, char **AtomName, char *bseq, double **xyz, double change, long *nh, char **hb_atom1, char **hb_atom2, double *hb_dist, long c_key, long bone_key) {
  double dd, dist, dtmp[4];
  long k, m, n, num_hbonds = 0;
  long without_H_m, with_H_m, without_H_n, with_H_n;
  for (m = seidx[i][1]; m <= seidx[i][2]; m++) {
    if (c_key == 0) {
      if (AtomName[m][1] == 'C')
        continue;
    }
    if (bone_key == 0) {
      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;
    }
    H_catalog(i, m, bseq, AtomName, &without_H_m, &with_H_m);
    for (n = seidx[j][1]; n <= seidx[j][2]; n++) {
      if (c_key == 0) {
        if (AtomName[n][1] == 'C')
          continue;
      }
      if (bone_key == 0) {
        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;
      H_catalog(j, n, bseq, AtomName, &without_H_n, &with_H_n);
      if (without_H_m == 1 && without_H_n == 1)
        continue;
      if ((strchr("NO", AtomName[m][1]) && AtomName[m][3] != '\'' && AtomName[m][3] != 'P') && (strchr("NO", AtomName[n][1]) && AtomName[n][3] != '\'' && AtomName[n][3] != 'P')) {
        dist = 3.4 + change;
        if (dist >= 4)
          dist = 4.0;
      } else if ((AtomName[m][1] == 'C' && (AtomName[n][3] != '\'' && AtomName[n][3] != 'P' && strchr("NO", AtomName[n][1]))) || (AtomName[n][1] == 'C' && (AtomName[m][3] != '\'' && AtomName[m][3] != 'P' && strchr("NO", AtomName[m][1])))) {
        dist = 3.6 + change;
        if (dist >= 4.0)
          dist = 4.0;
      } else if ((AtomName[m][1] == 'O' && AtomName[m][3] == '\'' && strchr("NO", AtomName[n][1]) && AtomName[n][3] != '\'' && AtomName[n][3] != 'P') || (AtomName[n][1] == 'O' && AtomName[n][3] == '\'' && strchr("NO", AtomName[m][1]) && AtomName[m][3] != '\'' && AtomName[m][3] != 'P')) {
        dist = 3.4 + change;
        if (dist >= 4.0)
          dist = 4.0;
      } else if ((AtomName[m][3] == 'P' && AtomName[n][3] != '\'' && AtomName[n][1] != 'C') || (AtomName[n][3] == 'P' && AtomName[m][3] != '\'' && AtomName[m][1] != 'C')) {
        dist = 3.2 + change;
        if (dist >= 4.0)
          dist = 4.0;
      } else {
        dist = 3.1 + change;
        if (dist >= 3.8)
          dist = 3.8;
      }
      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;
}
```