user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<offset_test>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    $0x0,%eax
  call   <prepare_data@plt>
  lea    D14(%rip),%rbx
  mov    %rbx,%rdi
  call   <ol_lrc_new@plt>
  mov    %rax,%r14
  mov    $0xffffff9c,%esi
  mov    %rax,%rdi
  call   <ol_lrc_set_offset@plt>
  mov    %rbx,%rdi
  call   <ol_lrc_new@plt>
  mov    %rax,%r15
  mov    %r14,%rdi
  call   <ol_lrc_item_count@plt>
  mov    %eax,%ebx
  mov    %r15,%rdi
  call   <ol_lrc_item_count@plt>
  cmp    %eax,%ebx
  jne    L35
L33:
  mov    %r14,%rdi
  call   <ol_lrc_item_count@plt>
  mov    %eax,0xc(%rsp)
  test   %eax,%eax
  jle    L3
  mov    $0x0,%ebx
  jmp    L19
L35:
  lea    D33(%rip),%rdx
  mov    $0x3b,%esi
  lea    D29(%rip),%rdi
  call   <printf@plt>
  jmp    L33
L2:
  mov    %r12,%rdi
  call   <ol_lrc_item_get_lyric@plt>
  mov    %eax,%r12d
  mov    %rbp,%rdi
  call   <ol_lrc_item_get_lyric@plt>
  mov    %eax,%edi
  mov    %r12d,%esi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L24
L18:
  add    $0x1,%ebx
  cmp    %ebx,0xc(%rsp)
  je     L3
L19:
  mov    %ebx,%esi
  mov    %r14,%rdi
  call   <ol_lrc_get_item@plt>
  mov    %rax,%rbp
  mov    %ebx,%esi
  mov    %r15,%rdi
  call   <ol_lrc_get_item@plt>
  mov    %rax,%r12
  mov    %rbp,%rdi
  call   <ol_lrc_item_get_time@plt>
  mov    %rax,%r13
  mov    %r12,%rdi
  call   <ol_lrc_item_get_time@plt>
  cmp    %rax,%r13
  je     L2
  lea    D43(%rip),%rdx
  mov    $0x43,%esi
  lea    D29(%rip),%rdi
  call   <printf@plt>
  jmp    L2
L24:
  lea    D3(%rip),%rdx
  mov    $0x45,%esi
  lea    D29(%rip),%rdi
  call   <printf@plt>
  jmp    L18
L3:
  mov    %r14,%rdi
  call   <ol_lrc_free@plt>
  mov    %r15,%rdi
  call   <ol_lrc_free@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D14
data_type: string
name: parse_data
arguments: data_tag: D33
data_type: string
name: parse_data
arguments: data_tag: D29
data_type: string
name: parse_data
arguments: data_tag: D43
data_type: string
name: parse_data
arguments: data_tag: D3
data_type: string

tool: D14: /tmp/lrc_basic.lrc

tool: D33: ol_lrc_item_count (lrc1) == ol_lrc_item_count (lrc2)

tool: D29: ERROR[%d]: EXPECT %s failed


tool: D43: ol_lrc_item_get_time (item1) == ol_lrc_item_get_time (item2)

tool: D3: strcmp (ol_lrc_item_get_lyric (item1), ol_lrc_item_get_lyric (item2)) == 0

assistant: ```c
void offset_test() {
  prepare_data();
  struct OlLrc *lrc1 = ol_lrc_new("/tmp/"
                                  "lrc_basic.lrc");
  ol_lrc_set_offset(lrc1, -100);
  struct OlLrc *lrc2 = ol_lrc_new("/tmp/"
                                  "lrc_basic.lrc");
  if (!(ol_lrc_item_count(lrc1) == ol_lrc_item_count(lrc2))) {
    printf("ERROR[%d]: EXPECT %s failed\n", 59, "ol_lrc_item_count (lrc1) == ol_lrc_item_count (lrc2)");
  };
  int i, cnt;
  cnt = ol_lrc_item_count(lrc1);
  for (i = 0; i < cnt; i++) {
    const struct OlLrcItem *item1 = ol_lrc_get_item(lrc1, i);
    const struct OlLrcItem *item2 = ol_lrc_get_item(lrc2, i);
    if (!(ol_lrc_item_get_time(item1) == ol_lrc_item_get_time(item2))) {
      printf("ERROR[%d]: EXPECT %s failed\n", 67, "ol_lrc_item_get_time (item1) == ol_lrc_item_get_time (item2)");
    };
    if (!(strcmp(ol_lrc_item_get_lyric(item1), ol_lrc_item_get_lyric(item2)) == 0)) {
      printf("ERROR[%d]: EXPECT %s failed\n", 69, "strcmp (ol_lrc_item_get_lyric (item1), ol_lrc_item_get_lyric (item2)) == 0");
    };
  }
  ol_lrc_free(lrc1);
  ol_lrc_free(lrc2);
}
```