user: Converte this assembly snippet into its equivalent C code:

```asm
<offset_test>:
  endbr64
  push   %r15
  xor    %eax,%eax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  lea    D3(%rip),%rbp
  push   %rbx
  sub    $0x18,%rsp
  call   <prepare_data@plt>
  mov    %rbp,%rdi
  call   <ol_lrc_new@plt>
  mov    $0xffffff9c,%esi
  mov    %rax,%rdi
  mov    %rax,%r14
  call   <ol_lrc_set_offset@plt>
  mov    %rbp,%rdi
  call   <ol_lrc_new@plt>
  mov    %r14,%rdi
  mov    %rax,%r15
  call   <ol_lrc_item_count@plt>
  mov    %r15,%rdi
  mov    %eax,%ebx
  call   <ol_lrc_item_count@plt>
  cmp    %eax,%ebx
  je     L3
  lea    D69(%rip),%rdx
  mov    $0x3b,%esi
  lea    D13(%rip),%rdi
  call   <printf@plt>
L3:
  mov    %r14,%rdi
  call   <ol_lrc_item_count@plt>
  mov    %eax,0xc(%rsp)
  test   %eax,%eax
  jle    L54
  xor    %ebx,%ebx
  jmp    L24
  nopl   0x0(%rax)
L45:
  add    $0x1,%ebx
  cmp    %ebx,0xc(%rsp)
  je     L54
L24:
  mov    %ebx,%esi
  mov    %r14,%rdi
  call   <ol_lrc_get_item@plt>
  mov    %ebx,%esi
  mov    %r15,%rdi
  mov    %rax,%rbp
  call   <ol_lrc_get_item@plt>
  mov    %rbp,%rdi
  mov    %rax,%r12
  call   <ol_lrc_item_get_time@plt>
  mov    %r12,%rdi
  mov    %rax,%r13
  call   <ol_lrc_item_get_time@plt>
  cmp    %rax,%r13
  je     L10
  lea    D6(%rip),%rdx
  mov    $0x43,%esi
  lea    D13(%rip),%rdi
  call   <printf@plt>
L10:
  mov    %r12,%rdi
  call   <ol_lrc_item_get_lyric@plt>
  mov    %rbp,%rdi
  mov    %eax,%r12d
  call   <ol_lrc_item_get_lyric@plt>
  mov    %r12d,%esi
  mov    %eax,%edi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L45
  lea    D51(%rip),%rdx
  mov    $0x45,%esi
  lea    D13(%rip),%rdi
  add    $0x1,%ebx
  call   <printf@plt>
  cmp    %ebx,0xc(%rsp)
  jne    L24
L54:
  mov    %r14,%rdi
  call   <ol_lrc_free@plt>
  add    $0x18,%rsp
  mov    %r15,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1150 <ol_lrc_free@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D3
type_infered: string
name: disassemble_data
arguments: tag: D69
type_infered: string
name: disassemble_data
arguments: tag: D13
type_infered: string
name: disassemble_data
arguments: tag: D6
type_infered: string
name: disassemble_data
arguments: tag: D51
type_infered: string

tool: D3: /tmp/lrc_basic.lrc

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

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


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

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