user: 下面的汇编指令对应的C源代码是什么:

```asm
<Hbond_pair>:
  endbr64
  push   %r15
  mov    %rdx,%rax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xd8,%rsp
  mov    0x110(%rsp),%rdx
  mov    %rdi,0x8(%rsp)
  mov    %rsi,0x20(%rsp)
  mov    %rdx,0x30(%rsp)
  mov    0x118(%rsp),%rdx
  mov    %rcx,0x38(%rsp)
  mov    %rdx,0x58(%rsp)
  mov    0x120(%rsp),%rdx
  mov    %r8,(%rsp)
  mov    %rdx,0x60(%rsp)
  mov    0x128(%rsp),%rdx
  mov    %r9,0x50(%rsp)
  mov    %rdx,0x68(%rsp)
  movsd  %xmm0,0x48(%rsp)
  mov    %fs:0x28,%rdx
  mov    %rdx,0xc8(%rsp)
  xor    %edx,%edx
  lea    (%rax,%rdi,8),%rdx
  mov    %rdx,0x10(%rsp)
  mov    (%rdx),%rdx
  mov    0x8(%rdx),%rbp
  mov    0x10(%rdx),%r12
  cmp    %r12,%rbp
  jg     L556
  lea    (%rax,%rsi,8),%rax
  lea    (%rcx,%rbp,8),%rbx
  movq   $0x0,0x28(%rsp)
  mov    %rax,0x18(%rsp)
  lea    D388(%rip),%r14
  nopw   0x0(%rax,%rax,1)
L872:
  cmpq   $0x0,0x130(%rsp)
  mov    (%rbx),%r13
  jne    L1028
  movzbl 0x1(%r13),%eax
  cmp    $0x43,%al
  je     L293
  cmpq   $0x0,0x138(%rsp)
  je     L142
L477:
  cmp    $0x50,%al
  je     L293
L1469:
  mov    (%rsp),%r12
  add    0x8(%rsp),%r12
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  je     L551
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L551
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L1260
  mov    (%rbx),%r12
  lea    D7(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
  lea    D71(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
  lea    D348(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
L553:
  lea    D18(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
  nopl   0x0(%rax)
L38:
  mov    0x38(%rsp),%r15
  mov    (%rsp),%rdx
  lea    0x88(%rsp),%r9
  lea    0x80(%rsp),%r8
  mov    0x8(%rsp),%rdi
  mov    %rbp,%rsi
  mov    %r15,%rcx
  call   <H_catalog@plt>
  mov    0x18(%rsp),%rax
  mov    (%rax),%rax
  mov    0x8(%rax),%r13
  mov    0x10(%rax),%rax
  lea    (%r15,%r13,8),%r12
  cmp    %rax,%r13
  jg     L480
  mov    %rbx,0x40(%rsp)
  mov    0x130(%rsp),%r15
  mov    %rbp,0x70(%rsp)
  mov    %rax,%rbp
  nopl   0x0(%rax,%rax,1)
L607:
  mov    (%r12),%rbx
  test   %r15,%r15
  jne    L1226
  movzbl 0x1(%rbx),%eax
  cmp    $0x43,%al
  je     L21
  cmpq   $0x0,0x138(%rsp)
  je     L394
L7:
  cmp    $0x50,%al
  je     L21
L621:
  mov    (%rsp),%rbp
  add    0x20(%rsp),%rbp
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x41,%al
  je     L529
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x49,%al
  je     L529
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x47,%al
  jne    L1087
  mov    (%r12),%rbp
  lea    D7(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D71(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D348(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
L1111:
  lea    D18(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1140
  nopl   0x0(%rax,%rax,1)
L325:
  mov    0x18(%rsp),%rax
  mov    (%rax),%rax
  mov    0x10(%rax),%rbp
L21:
  add    $0x1,%r13
  add    $0x8,%r12
  cmp    %rbp,%r13
  jle    L607
L1454:
  mov    0x10(%rsp),%rax
  mov    0x70(%rsp),%rbp
  mov    0x40(%rsp),%rbx
  mov    (%rax),%rax
  mov    0x10(%rax),%r12
  nopl   0x0(%rax,%rax,1)
L293:
  add    $0x1,%rbp
  add    $0x8,%rbx
  cmp    %r12,%rbp
  jle    L872
L1449:
  mov    0x30(%rsp),%rax
  mov    0x28(%rsp),%rcx
  mov    %rcx,(%rax)
  mov    0xc8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L961
  add    $0xd8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L1028:
  cmpq   $0x0,0x138(%rsp)
  je     L142
L282:
  movzbl 0x1(%r13),%eax
  cmp    $0x43,%al
  jne    L477
  cmpb   $0x27,0x3(%r13)
  jne    L1469
  jmp    L293
  nopl   (%rax)
L142:
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L293
  lea    D351(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L293
  lea    D35(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L293
  lea    D194(%rip),%rsi
  mov    %r13,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L282
  add    $0x1,%rbp
  add    $0x8,%rbx
  cmp    %r12,%rbp
  jle    L872
  jmp    L1449
  xchg   %ax,%ax
L551:
  mov    (%rbx),%r12
  lea    D7(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
  lea    D71(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
  lea    D348(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L38
L480:
  mov    0x10(%rsp),%rax
  add    $0x1,%rbp
  add    $0x8,%rbx
  mov    (%rax),%rax
  mov    0x10(%rax),%r12
  cmp    %r12,%rbp
  jle    L872
  jmp    L1449
  nopw   0x0(%rax,%rax,1)
L1260:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L853
  mov    (%rbx),%r12
  lea    D7(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
  lea    D71(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L480
  jmp    L38
  nopl   0x0(%rax,%rax,1)
L1226:
  cmpq   $0x0,0x138(%rsp)
  je     L394
L195:
  movzbl 0x1(%rbx),%eax
  cmp    $0x43,%al
  jne    L7
  cmpb   $0x27,0x3(%rbx)
  jne    L621
  jmp    L21
  cs nopw 0x0(%rax,%rax,1)
L394:
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L21
  lea    D351(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L21
  lea    D35(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L21
  lea    D194(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L195
  add    $0x1,%r13
  add    $0x8,%r12
  cmp    %rbp,%r13
  jle    L607
  jmp    L1454
  nopw   0x0(%rax,%rax,1)
L529:
  mov    (%r12),%rbp
  lea    D7(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D71(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D348(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
L1140:
  mov    0x40(%rsp),%rax
  mov    (%rax),%rbp
  cmpb   $0x43,0x1(%rbp)
  je     L19
L524:
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L881
  lea    D233(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L8
L881:
  mov    (%r12),%rbp
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D233(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D35(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D194(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D351(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
L278:
  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    L1390
  cmpq   $0x1,0x90(%rsp)
  je     L325
L1390:
  mov    0x40(%rsp),%rbx
  lea    D316(%rip),%rdi
  mov    (%rbx),%rax
  movsbl 0x1(%rax),%esi
  call   <strchr@plt>
  test   %rax,%rax
  je     L930
  mov    (%rbx),%rdx
  mov    (%r12),%rax
  movzbl 0x3(%rdx),%esi
  movzbl 0x1(%rax),%ecx
  cmp    $0x50,%sil
  je     L393
  cmp    $0x27,%sil
  je     L393
  movsbl %cl,%esi
  lea    D316(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L1464
  mov    (%rbx),%rdx
  mov    (%r12),%rax
L393:
  movzbl 0x1(%rdx),%r8d
  movzbl 0x1(%rax),%ecx
  cmp    $0x43,%r8b
  je     L828
L623:
  movzbl 0x1(%rax),%ecx
  cmp    $0x43,%cl
  je     L742
L1409:
  cmp    $0x4f,%r8b
  je     L1012
L597:
  movzbl 0x3(%rax),%esi
L1445:
  cmp    $0x4f,%cl
  je     L1246
  movzbl 0x3(%rdx),%edi
L1295:
  cmp    $0x50,%dil
  je     L493
L1081:
  cmp    $0x50,%sil
  jne    L1095
  cmp    $0x27,%dil
  jne    L14
L1095:
  movsd  D59(%rip),%xmm2
  movsd  0x48(%rsp),%xmm1
  addsd  D85(%rip),%xmm1
  movapd %xmm2,%xmm0
  cmpnlesd %xmm1,%xmm0
  andpd  %xmm0,%xmm1
  andnpd %xmm2,%xmm0
  orpd   %xmm0,%xmm1
L1088:
  mov    0x50(%rsp),%rax
  mov    0x70(%rsp),%rcx
  lea    0xa0(%rsp),%rdi
  movsd  %xmm1,0x78(%rsp)
  mov    (%rax,%rcx,8),%rdx
  mov    (%rax,%r13,8),%rax
  movsd  0x8(%rdx),%xmm0
  subsd  0x8(%rax),%xmm0
  movsd  %xmm0,0xa8(%rsp)
  movsd  0x10(%rdx),%xmm0
  subsd  0x10(%rax),%xmm0
  movsd  %xmm0,0xb0(%rsp)
  movsd  0x18(%rdx),%xmm0
  subsd  0x18(%rax),%xmm0
  movsd  %xmm0,0xb8(%rsp)
  call   <veclen@plt>
  movsd  0x78(%rsp),%xmm1
  comisd %xmm0,%xmm1
  jbe    L325
  addq   $0x1,0x28(%rsp)
  mov    0x28(%rsp),%rax
  cmp    $0x200,%rax
  jg     L1339
L1185:
  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    L325
  nopl   0x0(%rax)
L1087:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x50,%al
  jne    L475
  mov    (%r12),%rbp
  lea    D7(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L325
  lea    D71(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1140
  jmp    L325
  nopl   0x0(%rax,%rax,1)
L853:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  je     L804
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  jne    L145
L804:
  mov    (%rbx),%r12
  lea    D7(%rip),%rsi
  mov    %r12,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L553
  jmp    L480
  nop
L8:
  lea    D35(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L881
  lea    D194(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L881
  lea    D351(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L278
  jmp    L881
  nopw   0x0(%rax,%rax,1)
L19:
  mov    (%r12),%rax
  cmpb   $0x43,0x1(%rax)
  jne    L524
  jmp    L325
  nopl   0x0(%rax,%rax,1)
L556:
  movq   $0x0,0x28(%rsp)
  jmp    L1449
L475:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x55,%al
  jne    L831
L102:
  mov    (%r12),%rbp
  lea    D7(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L1111
  jmp    L325
L831:
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x43,%al
  je     L102
  movsbl 0x0(%rbp),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  jne    L1140
  jmp    L102
L145:
  movsbl (%r12),%edi
  call   <toupper@plt>
  cmp    $0x54,%al
  je     L804
  jmp    L38
L930:
  mov    0x40(%rsp),%rax
  mov    (%rax),%rdx
  mov    (%r12),%rax
  jmp    L393
L828:
  movzbl 0x3(%rax),%esi
  cmp    $0x27,%sil
  je     L60
  cmp    $0x50,%sil
  je     L60
  movsbl %cl,%esi
  lea    D316(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L1043
  mov    0x40(%rsp),%rcx
  mov    (%r12),%rax
  mov    (%rcx),%rdx
  movzbl 0x1(%rdx),%r8d
  jmp    L623
L1246:
  cmp    $0x27,%sil
  je     L70
  movzbl 0x3(%rdx),%edi
  cmp    $0x50,%dil
  jne    L1081
L104:
  movsd  0x48(%rsp),%xmm1
  addsd  D4(%rip),%xmm1
  movsd  D181(%rip),%xmm0
  comisd %xmm0,%xmm1
  jb     L1088
L1471:
  movapd %xmm0,%xmm1
  jmp    L1088
L1012:
  movzbl 0x3(%rdx),%edi
L869:
  cmp    $0x27,%dil
  jne    L597
  movsbl %cl,%esi
  lea    D316(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  mov    (%r12),%rax
  jne    L68
  mov    0x40(%rsp),%rdx
  movzbl 0x1(%rax),%ecx
  movzbl 0x3(%rax),%esi
  mov    (%rdx),%rdx
  jmp    L1445
L742:
  movzbl 0x3(%rdx),%edi
  cmp    $0x27,%dil
  je     L2
  cmp    $0x50,%dil
  je     L2
L1014:
  movsbl %r8b,%esi
  lea    D316(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  jne    L1043
  mov    0x40(%rsp),%rax
  mov    (%rax),%rdx
  mov    (%r12),%rax
  movzbl 0x1(%rdx),%r8d
  movzbl 0x1(%rax),%ecx
  jmp    L1409
L493:
  cmp    $0x27,%sil
  je     L1095
  cmpb   $0x43,0x1(%rax)
  je     L1081
  jmp    L104
L228:
  mov    0x40(%rsp),%rcx
  mov    (%rcx),%rdx
  movzbl 0x1(%rax),%ecx
  movzbl 0x1(%rdx),%r8d
  cmp    $0x43,%r8b
  jne    L623
L60:
  cmp    $0x43,%cl
  jne    L1445
  movzbl 0x3(%rdx),%edi
  cmp    $0x50,%dil
  je     L1122
  cmp    $0x27,%dil
  je     L1122
  mov    $0x43,%r8d
  jmp    L1014
L1339:
  lea    D298(%rip),%rdi
  movsd  %xmm0,0x78(%rsp)
  call   <nrerror@plt>
  movsd  0x78(%rsp),%xmm0
  jmp    L1185
L14:
  cmpb   $0x43,0x1(%rdx)
  jne    L104
  jmp    L1095
L2:
  cmp    $0x4f,%r8b
  je     L869
L1122:
  movzbl 0x3(%rax),%esi
  jmp    L1295
L1043:
  movsd  0x48(%rsp),%xmm1
  addsd  D132(%rip),%xmm1
  movsd  D181(%rip),%xmm0
  comisd %xmm0,%xmm1
  jae    L1471
  jmp    L1088
L1464:
  mov    (%r12),%rax
  movzbl 0x3(%rax),%esi
  cmp    $0x27,%sil
  je     L228
  cmp    $0x50,%sil
  je     L228
L677:
  movsd  0x48(%rsp),%xmm1
  addsd  D464(%rip),%xmm1
  movsd  D181(%rip),%xmm0
  comisd %xmm0,%xmm1
  jb     L1088
  jmp    L1471
L70:
  movsbl 0x1(%rdx),%esi
  lea    D316(%rip),%rdi
  call   <strchr@plt>
  test   %rax,%rax
  mov    0x40(%rsp),%rax
  mov    (%rax),%rdx
  movzbl 0x3(%rdx),%edi
  je     L1282
  cmp    $0x27,%dil
  je     L1282
  cmp    $0x50,%dil
  jne    L677
L1282:
  mov    (%r12),%rax
  movzbl 0x3(%rax),%esi
  jmp    L1295
L68:
  movzbl 0x3(%rax),%esi
  cmp    $0x50,%sil
  je     L337
  cmp    $0x27,%sil
  jne    L677
L337:
  mov    0x40(%rsp),%rdx
  movzbl 0x1(%rax),%ecx
  mov    (%rdx),%rdx
  jmp    L1445
L961:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D388
datatype: string
name: extract_symbolic_data
arguments: data_label: D7
datatype: string
name: extract_symbolic_data
arguments: data_label: D71
datatype: string
name: extract_symbolic_data
arguments: data_label: D348
datatype: string
name: extract_symbolic_data
arguments: data_label: D18
datatype: string
name: extract_symbolic_data
arguments: data_label: D351
datatype: string
name: extract_symbolic_data
arguments: data_label: D35
datatype: string
name: extract_symbolic_data
arguments: data_label: D194
datatype: string
name: extract_symbolic_data
arguments: data_label: D233
datatype: string
name: extract_symbolic_data
arguments: data_label: D316
datatype: string
name: extract_symbolic_data
arguments: data_label: D59
datatype: f64
name: extract_symbolic_data
arguments: data_label: D85
datatype: f64
name: extract_symbolic_data
arguments: data_label: D4
datatype: f64
name: extract_symbolic_data
arguments: data_label: D181
datatype: f64
name: extract_symbolic_data
arguments: data_label: D298
datatype: string
name: extract_symbolic_data
arguments: data_label: D132
datatype: f64
name: extract_symbolic_data
arguments: data_label: D464
datatype: f64

tool: D388:  O3'

tool: D7:  C4 

tool: D71:  C5 

tool: D348:  C6 

tool: D18:  C2 

tool: D351:  O2P

tool: D35:  O5'

tool: D194:  O1P

tool: D233:  O4'

tool: D316: NO

tool: D59: 3.8

tool: D85: 3.1

tool: D4: 3.2

tool: D181: 4

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

tool: D132: 3.6

tool: D464: 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;
}
```