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    $0xd8,%rsp
  mov    0x110(%rsp),%rax
  mov    %rdi,0x8(%rsp)
  mov    %rsi,0x20(%rsp)
  mov    %rax,0x30(%rsp)
  mov    0x118(%rsp),%rax
  mov    %rcx,0x38(%rsp)
  mov    %rax,0x58(%rsp)
  mov    0x120(%rsp),%rax
  mov    %r8,(%rsp)
  mov    %rax,0x60(%rsp)
  mov    0x128(%rsp),%rax
  mov    %r9,0x50(%rsp)
  mov    %rax,0x68(%rsp)
  movsd  %xmm0,0x48(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xc8(%rsp)
  xor    %eax,%eax
  lea    (%rdx,%rdi,8),%rax
  mov    (%rax),%r12
  mov    %rax,0x10(%rsp)
  mov    0x8(%r12),%rbp
  cmp    0x10(%r12),%rbp
  jg     L565
  lea    (%rdx,%rsi,8),%rax
  lea    (%rcx,%rbp,8),%rbx
  movq   $0x0,0x28(%rsp)
  mov    %rax,0x18(%rsp)
  lea    D41(%rip),%r15
  nopl   0x0(%rax,%rax,1)
L1241:
  cmpq   $0x0,0x130(%rsp)
  mov    (%rbx),%r13
  jne    L1342
  movzbl 0x1(%r13),%eax
  cmp    $0x43,%al
  je     L239
  cmpq   $0x0,0x138(%rsp)
  je     L62
L211:
  cmp    $0x50,%al
  je     L239
L1421:
  mov    (%rsp),%r12
  add    0x8(%rsp),%r12
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  je     L87
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L87
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L1
  mov    (%rbx),%r12
  lea    D302(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
  lea    D249(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
  lea    D364(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
L1170:
  lea    D482(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
  nopl   0x0(%rax)
L1324:
  mov    0x38(%rsp),%r14
  mov    (%rsp),%rdx
  lea    0x88(%rsp),%r9
  lea    0x80(%rsp),%r8
  mov    0x8(%rsp),%rdi
  mov    %rbp,%rsi
  mov    %r14,%rcx
  call   <H_catalog@plt>
  mov    0x18(%rsp),%rax
  mov    (%rax),%rax
  mov    0x8(%rax),%r13
  lea    (%r14,%r13,8),%r12
  cmp    0x10(%rax),%r13
  jg     L734
  mov    %rbx,0x40(%rsp)
  mov    0x130(%rsp),%r14
  mov    %rbp,0x70(%rsp)
  mov    %rax,%rbp
  nopl   0x0(%rax,%rax,1)
L389:
  mov    (%r12),%rbx
  test   %r14,%r14
  jne    L675
  movzbl 0x1(%rbx),%eax
  cmp    $0x43,%al
  je     L1309
  cmpq   $0x0,0x138(%rsp)
  je     L438
L1288:
  cmp    $0x50,%al
  je     L1309
L577:
  mov    (%rsp),%rbp
  add    0x20(%rsp),%rbp
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  je     L766
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L766
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L704
  mov    (%r12),%rbp
  lea    D302(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D249(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D364(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
L333:
  lea    D482(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L913
L216:
  mov    0x18(%rsp),%rax
  mov    (%rax),%rbp
L1309:
  add    $0x1,%r13
  add    $0x8,%r12
  cmp    %r13,0x10(%rbp)
  jge    L389
L572:
  mov    0x10(%rsp),%rax
  mov    0x70(%rsp),%rbp
  mov    0x40(%rsp),%rbx
  mov    (%rax),%r12
  nopl   0x0(%rax)
L239:
  add    $0x1,%rbp
  add    $0x8,%rbx
  cmp    %rbp,0x10(%r12)
  jge    L1241
L134:
  mov    0x30(%rsp),%rax
  mov    0x28(%rsp),%rdx
  mov    %rdx,(%rax)
  mov    0xc8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L320
  add    $0xd8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L1342:
  cmpq   $0x0,0x138(%rsp)
  je     L62
L825:
  movzbl 0x1(%r13),%eax
  cmp    $0x43,%al
  jne    L211
  cmpb   $0x27,0x3(%r13)
  jne    L1421
  jmp    L239
  nopl   (%rax)
L62:
  mov    %r15,%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L239
  lea    D442(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L239
  lea    D455(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L239
  lea    D499(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L825
  add    $0x1,%rbp
  add    $0x8,%rbx
  cmp    %rbp,0x10(%r12)
  jge    L1241
  jmp    L134
  nopl   0x0(%rax)
L87:
  mov    (%rbx),%r12
  lea    D302(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
  lea    D249(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
  lea    D364(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1324
L734:
  mov    0x10(%rsp),%rax
  add    $0x1,%rbp
  add    $0x8,%rbx
  mov    (%rax),%r12
  cmp    %rbp,0x10(%r12)
  jge    L1241
  jmp    L134
  nopl   0x0(%rax,%rax,1)
L1:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L714
  mov    (%rbx),%r12
  lea    D302(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
  lea    D249(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L734
  jmp    L1324
L675:
  cmpq   $0x0,0x138(%rsp)
  je     L438
L335:
  movzbl 0x1(%rbx),%eax
  cmp    $0x43,%al
  jne    L1288
  cmpb   $0x27,0x3(%rbx)
  jne    L577
  jmp    L1309
  cs nopw 0x0(%rax,%rax,1)
L438:
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1309
  lea    D442(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1309
  lea    D455(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1309
  lea    D499(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L335
  add    $0x1,%r13
  add    $0x8,%r12
  cmp    %r13,0x10(%rbp)
  jge    L389
  jmp    L572
  nopl   0x0(%rax,%rax,1)
L766:
  mov    (%r12),%rbp
  lea    D302(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D249(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D364(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
L913:
  mov    0x40(%rsp),%rax
  mov    (%rax),%rbp
  cmpb   $0x43,0x1(%rbp)
  je     L975
L1087:
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1453
  lea    D387(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1204
L1453:
  mov    (%r12),%rbp
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D387(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D455(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D499(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D442(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
L633:
  mov    0x38(%rsp),%rcx
  mov    (%rsp),%rdx
  lea    0x98(%rsp),%r9
  lea    0x90(%rsp),%r8
  mov    0x20(%rsp),%rdi
  mov    %r13,%rsi
  call   <H_catalog@plt>
  cmpq   $0x1,0x80(%rsp)
  jne    L755
  cmpq   $0x1,0x90(%rsp)
  je     L216
L755:
  mov    0x40(%rsp),%rbx
  lea    D251(%rip),%rdi
  mov    (%rbx),%rax
  movsbl 0x1(%rax),%esi
  call   <strchr@plt>
  test   %rax,%rax
  je     L89
  mov    (%rbx),%rdx
  mov    (%r12),%rax
  movzbl 0x3(%rdx),%esi
  movzbl 0x1(%rax),%ecx
  mov    %rdx,%r8
  cmp    $0x50,%sil
  je     L1075
  cmp    $0x27,%sil
  je     L1075
  movsbl %cl,%esi
  lea    D251(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L783
  mov    (%rbx),%rdx
  mov    (%r12),%rax
  mov    %rdx,%r8
L1075:
  movzbl 0x1(%rdx),%r9d
  movzbl 0x1(%rax),%ecx
  cmp    $0x43,%r9b
  je     L614
L241:
  movzbl 0x1(%rax),%ecx
  cmp    $0x43,%cl
  je     L16
L857:
  cmp    $0x4f,%r9b
  je     L268
  movzbl 0x3(%rax),%esi
L1327:
  cmp    $0x4f,%cl
  je     L891
  movzbl 0x3(%r8),%edi
L360:
  cmp    $0x50,%dil
  je     L1414
L405:
  cmp    $0x50,%sil
  jne    L738
  cmp    $0x27,%dil
  jne    L54
L738:
  movsd  D477(%rip),%xmm2
  movsd  0x48(%rsp),%xmm1
  addsd  D76(%rip),%xmm1
  movapd %xmm2,%xmm0
  cmpnlesd %xmm1,%xmm0
  andpd  %xmm0,%xmm1
  andnpd %xmm2,%xmm0
  orpd   %xmm0,%xmm1
L418:
  mov    0x50(%rsp),%rax
  mov    0x70(%rsp),%rcx
  lea    0xa0(%rsp),%rdi
  mov    (%rax,%rcx,8),%rcx
  mov    (%rax,%r13,8),%rdx
  mov    $0x1,%eax
L1297:
  movsd  (%rcx,%rax,8),%xmm0
  subsd  (%rdx,%rax,8),%xmm0
  movsd  %xmm0,(%rdi,%rax,8)
  add    $0x1,%rax
  cmp    $0x4,%rax
  jne    L1297
  movsd  %xmm1,0x78(%rsp)
  call   <veclen@plt>
  movsd  0x78(%rsp),%xmm1
  comisd %xmm0,%xmm1
  jbe    L216
  addq   $0x1,0x28(%rsp)
  mov    0x28(%rsp),%rax
  cmp    $0x200,%rax
  jg     L1126
L57:
  mov    0x28(%rsp),%rbx
  mov    0x58(%rsp),%rax
  movsd  %xmm0,0x78(%rsp)
  mov    (%rax,%rbx,8),%rdi
  mov    0x40(%rsp),%rax
  mov    (%rax),%rsi
  call   <strcpy@plt>
  mov    0x60(%rsp),%rax
  mov    (%r12),%rsi
  mov    (%rax,%rbx,8),%rdi
  call   <strcpy@plt>
  mov    0x68(%rsp),%rax
  movsd  0x78(%rsp),%xmm0
  movsd  %xmm0,(%rax,%rbx,8)
  jmp    L216
  nopl   0x0(%rax,%rax,1)
L704:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L446
  mov    (%r12),%rbp
  lea    D302(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L216
  lea    D249(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L913
  jmp    L216
  nopl   0x0(%rax,%rax,1)
L714:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  je     L568
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  jne    L573
L568:
  mov    (%rbx),%r12
  lea    D302(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1170
  jmp    L734
  nop
L1204:
  lea    D455(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1453
  lea    D499(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L1453
  lea    D442(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L633
  jmp    L1453
  nopw   0x0(%rax,%rax,1)
L975:
  mov    (%r12),%rax
  cmpb   $0x43,0x1(%rax)
  jne    L1087
  jmp    L216
  nopl   0x0(%rax,%rax,1)
L565:
  movq   $0x0,0x28(%rsp)
  jmp    L134
L446:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  jne    L1197
L1409:
  mov    (%r12),%rbp
  lea    D302(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L333
  jmp    L216
L1197:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  je     L1409
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  jne    L913
  jmp    L1409
L573:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  je     L568
  jmp    L1324
L89:
  mov    0x40(%rsp),%rax
  mov    (%rax),%rdx
  mov    (%r12),%rax
  mov    %rdx,%r8
  jmp    L1075
L614:
  movzbl 0x3(%rax),%esi
  cmp    $0x27,%sil
  je     L694
  cmp    $0x50,%sil
  je     L694
  movsbl %cl,%esi
  lea    D251(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L1285
  mov    0x40(%rsp),%rcx
  mov    (%r12),%rax
  mov    (%rcx),%rdx
  movzbl 0x1(%rdx),%r9d
  mov    %rdx,%r8
  jmp    L241
L891:
  cmp    $0x27,%sil
  je     L1118
  movzbl 0x3(%r8),%edi
  cmp    $0x50,%dil
  jne    L405
L816:
  movsd  0x48(%rsp),%xmm1
  addsd  D240(%rip),%xmm1
  movsd  D405(%rip),%xmm0
  comisd %xmm0,%xmm1
  jb     L418
L1408:
  movapd %xmm0,%xmm1
  jmp    L418
L268:
  movzbl 0x3(%rdx),%edi
L1025:
  cmp    $0x27,%dil
  je     L721
  movzbl 0x3(%rax),%esi
  mov    %rdx,%r8
  jmp    L1327
L16:
  movzbl 0x3(%rdx),%edi
  cmp    $0x27,%dil
  je     L177
  cmp    $0x50,%dil
  je     L177
L517:
  movsbl %r9b,%esi
  lea    D251(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L1285
  mov    0x40(%rsp),%rax
  mov    (%rax),%rdx
  mov    (%r12),%rax
  movzbl 0x1(%rdx),%r9d
  movzbl 0x1(%rax),%ecx
  mov    %rdx,%r8
  jmp    L857
L1414:
  cmp    $0x27,%sil
  je     L738
  cmpb   $0x43,0x1(%rax)
  jne    L816
  movzbl 0x3(%rax),%esi
  jmp    L405
L1113:
  mov    0x40(%rsp),%rcx
  mov    (%rcx),%rdx
  movzbl 0x1(%rax),%ecx
  movzbl 0x1(%rdx),%r9d
  mov    %rdx,%r8
  cmp    $0x43,%r9b
  jne    L241
L694:
  cmp    $0x43,%cl
  jne    L1327
  movzbl 0x3(%rdx),%edi
  cmp    $0x50,%dil
  je     L473
  cmp    $0x27,%dil
  je     L473
  mov    $0x43,%r9d
  jmp    L517
L1126:
  lea    D497(%rip),%rdi
  movsd  %xmm0,0x78(%rsp)
  call   <nrerror@plt>
  movsd  0x78(%rsp),%xmm0
  jmp    L57
L54:
  cmpb   $0x43,0x1(%r8)
  jne    L816
  jmp    L738
L177:
  cmp    $0x4f,%r9b
  je     L1504
L473:
  movzbl 0x3(%rax),%esi
  jmp    L360
L1285:
  movsd  0x48(%rsp),%xmm1
  addsd  D283(%rip),%xmm1
  movsd  D405(%rip),%xmm0
  comisd %xmm0,%xmm1
  jae    L1408
  jmp    L418
L783:
  mov    (%r12),%rax
  movzbl 0x3(%rax),%esi
  cmp    $0x27,%sil
  je     L1113
  cmp    $0x50,%sil
  je     L1113
L1413:
  movsd  0x48(%rsp),%xmm1
  addsd  D459(%rip),%xmm1
  movsd  D405(%rip),%xmm0
  comisd %xmm0,%xmm1
  jb     L418
  jmp    L1408
L1504:
  movzbl 0x1(%rax),%ecx
  jmp    L1025
L1118:
  movsbl 0x1(%r8),%esi
  lea    D251(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  mov    0x40(%rsp),%rax
  mov    (%rax),%r8
  movzbl 0x3(%r8),%edi
  je     L1412
  cmp    $0x50,%dil
  je     L1412
  cmp    $0x27,%dil
  jne    L1413
L1412:
  mov    (%r12),%rax
  movzbl 0x3(%rax),%esi
  jmp    L360
L721:
  movsbl %cl,%esi
  lea    D251(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  mov    (%r12),%rax
  jne    L85
  mov    0x40(%rsp),%rdx
  movzbl 0x1(%rax),%ecx
  movzbl 0x3(%rax),%esi
  mov    (%rdx),%r8
  jmp    L1327
L85:
  movzbl 0x3(%rax),%esi
  cmp    $0x27,%sil
  je     L163
  cmp    $0x50,%sil
  jne    L1413
L163:
  mov    0x40(%rsp),%rdx
  movzbl 0x1(%rax),%ecx
  mov    (%rdx),%r8
  jmp    L1327
L320:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D41
data_type: string
name: extract_symbolic_data
arguments: data_label: D302
data_type: string
name: extract_symbolic_data
arguments: data_label: D249
data_type: string
name: extract_symbolic_data
arguments: data_label: D364
data_type: string
name: extract_symbolic_data
arguments: data_label: D482
data_type: string
name: extract_symbolic_data
arguments: data_label: D442
data_type: string
name: extract_symbolic_data
arguments: data_label: D455
data_type: string
name: extract_symbolic_data
arguments: data_label: D499
data_type: string
name: extract_symbolic_data
arguments: data_label: D387
data_type: string
name: extract_symbolic_data
arguments: data_label: D251
data_type: string
name: extract_symbolic_data
arguments: data_label: D477
data_type: f64
name: extract_symbolic_data
arguments: data_label: D76
data_type: f64
name: extract_symbolic_data
arguments: data_label: D240
data_type: f64
name: extract_symbolic_data
arguments: data_label: D405
data_type: f64
name: extract_symbolic_data
arguments: data_label: D497
data_type: string
name: extract_symbolic_data
arguments: data_label: D283
data_type: f64
name: extract_symbolic_data
arguments: data_label: D459
data_type: f64

tool: D41:  O3'

tool: D302:  C4 

tool: D249:  C5 

tool: D364:  C6 

tool: D482:  C2 

tool: D442:  O2P

tool: D455:  O5'

tool: D499:  O1P

tool: D387:  O4'

tool: D251: NO

tool: D477: 3.8

tool: D76: 3.1

tool: D240: 3.2

tool: D405: 4

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

tool: D283: 3.6

tool: D459: 3.4

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