user: Translate the below assembly code into C programming language:

```asm
<offset_test>:
  endbr64
  push   %r15
  xor    %eax,%eax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  lea    D53(%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     L49
  lea    D7(%rip),%rdx
  mov    $0x3b,%esi
  lea    D45(%rip),%rdi
  call   <printf@plt>
L49:
  mov    %r14,%rdi
  call   <ol_lrc_item_count@plt>
  mov    %eax,0xc(%rsp)
  test   %eax,%eax
  jle    L3
  xor    %ebx,%ebx
  jmp    L41
  nopl   0x0(%rax)
L59:
  add    $0x1,%ebx
  cmp    %ebx,0xc(%rsp)
  je     L3
L41:
  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     L66
  lea    D61(%rip),%rdx
  mov    $0x43,%esi
  lea    D45(%rip),%rdi
  call   <printf@plt>
L66:
  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     L59
  lea    D42(%rip),%rdx
  mov    $0x45,%esi
  lea    D45(%rip),%rdi
  add    $0x1,%ebx
  call   <printf@plt>
  cmp    %ebx,0xc(%rsp)
  jne    L41
L3:
  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: parse_data
arguments: data_label: D53
type: string
name: parse_data
arguments: data_label: D7
type: string
name: parse_data
arguments: data_label: D45
type: string
name: parse_data
arguments: data_label: D61
type: string
name: parse_data
arguments: data_label: D42
type: string

tool: D53: /tmp/lrc_basic.lrc

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

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


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

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