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

```asm
<parse_pool>:
  endbr64
  push   %r15
  lea    D7(%rip),%rsi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  lea    0x85(%rsp),%r14
  call   <parse@plt>
  lea    D123(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%r12
  call   <parse@plt>
  lea    D154(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%r13
  call   <parse@plt>
  lea    D158(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x78(%rsp)
  call   <parse@plt>
  lea    D114(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x70(%rsp)
  call   <parse@plt>
  lea    D34(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x8(%rsp)
  call   <parse@plt>
  lea    D63(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x10(%rsp)
  call   <parse@plt>
  lea    D26(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x18(%rsp)
  call   <parse@plt>
  lea    D12(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x20(%rsp)
  call   <parse@plt>
  lea    D161(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x28(%rsp)
  call   <parse@plt>
  lea    D70(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x30(%rsp)
  call   <parse@plt>
  lea    D205(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x38(%rsp)
  call   <parse@plt>
  lea    D193(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x40(%rsp)
  call   <parse@plt>
  lea    D74(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x48(%rsp)
  call   <parse@plt>
  lea    D191(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%r15
  call   <parse@plt>
  lea    D42(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,%rbx
  call   <parse@plt>
  lea    D190(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x50(%rsp)
  call   <parse@plt>
  lea    D155(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x58(%rsp)
  call   <parse@plt>
  lea    D62(%rip),%rsi
  mov    %rbp,%rdi
  mov    %rax,0x60(%rsp)
  call   <parse@plt>
  mov    $0x2,%ecx
  mov    %r14,%rdx
  mov    %rbp,%rdi
  lea    D15(%rip),%rsi
  mov    %rax,0x68(%rsp)
  call   <parse_string@plt>
  cmpb   $0x53,0x86(%rsp)
  movb   $0x0,0x87(%rsp)
  je     L5
  xor    %eax,%eax
  test   %rbx,%rbx
  mov    0x70(%rsp),%r9
  mov    0x78(%rsp),%r8
  je     L0
  lea    (%r15,%r15,4),%rax
  xor    %edx,%edx
  lea    (%rax,%rax,4),%rax
  shl    $0x2,%rax
  div    %rbx
L0:
  push   0x68(%rsp)
  push   0x68(%rsp)
  push   0x68(%rsp)
  push   0x68(%rsp)
  push   %rax
  push   %rbx
  push   %r15
  push   0x80(%rsp)
  push   0x80(%rsp)
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  push   0x80(%rsp)
  lea    D164(%rip),%rdi
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  push   0x80(%rsp)
  call   <printf@plt>
  sub    $0xffffffffffffff80,%rsp
L5:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L27
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L27:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D7
type: string
name: parse_data
arguments: label: D123
type: string
name: parse_data
arguments: label: D154
type: string
name: parse_data
arguments: label: D158
type: string
name: parse_data
arguments: label: D114
type: string
name: parse_data
arguments: label: D34
type: string
name: parse_data
arguments: label: D63
type: string
name: parse_data
arguments: label: D26
type: string
name: parse_data
arguments: label: D12
type: string
name: parse_data
arguments: label: D161
type: string
name: parse_data
arguments: label: D70
type: string
name: parse_data
arguments: label: D205
type: string
name: parse_data
arguments: label: D193
type: string
name: parse_data
arguments: label: D74
type: string
name: parse_data
arguments: label: D191
type: string
name: parse_data
arguments: label: D42
type: string
name: parse_data
arguments: label: D190
type: string
name: parse_data
arguments: label: D155
type: string
name: parse_data
arguments: label: D62
type: string
name: parse_data
arguments: label: D15
type: string
name: parse_data
arguments: label: D164
type: string

tool: D7: CI

tool: D123: PI

tool: D154: Pc

tool: D158: Pm

tool: D114: Oc

tool: D34: Om

tool: D63: Nc

tool: D26: Nm

tool: D12: ps

tool: D161: pt

tool: D70: px

tool: D205: pd

tool: D193: pr

tool: D74: gs

tool: D191: gt

tool: D42: fs

tool: D190: ft

tool: D155: os

tool: D62: ot

tool: D15: PT

tool: D164: domid%lu,id%lu[%s]:pgp=%llu(max=%llu) obj=%llu(%llu) objnode=%llu(%llu) puts=%llu/%llu/%llu(dup=%llu/%llu) gets=%llu/%llu(%llu%%) flush=%llu/%llu flobj=%llu/%llu


assistant: ```c
void parse_pool(char *s) {
  char pool_type[3];
  unsigned long cli_id = parse(s, "CI");
  unsigned long pool_id = parse(s, "PI");
  unsigned long long pgp_count = parse(s, "Pc");
  unsigned long long max_pgp_count = parse(s, "Pm");
  unsigned long long obj_count = parse(s, "Oc");
  unsigned long long max_obj_count = parse(s, "Om");
  unsigned long long objnode_count = parse(s, "Nc");
  unsigned long long max_objnode_count = parse(s, "Nm");
  unsigned long long good_puts = parse(s, "ps");
  unsigned long long puts = parse(s, "pt");
  unsigned long long no_mem_puts = parse(s, "px");
  unsigned long long dup_puts_flushed = parse(s, "pd");
  unsigned long long dup_puts_replaced = parse(s, "pr");
  unsigned long long found_gets = parse(s, "gs");
  unsigned long long gets = parse(s, "gt");
  unsigned long long flushs_found = parse(s, "fs");
  unsigned long long flushs = parse(s, "ft");
  unsigned long long flush_objs_found = parse(s, "os");
  unsigned long long flush_objs = parse(s, "ot");
  parse_string(s, "PT", pool_type, 2);
  pool_type[2] = '\0';
  if (pool_type[1] == 'S')
    return;
  printf("domid%lu,id%lu[%s]:pgp=%llu(max=%llu) obj=%llu(%llu) "
         "objnode=%llu(%llu) puts=%llu/%llu/%llu(dup=%llu/%llu) "
         "gets=%llu/%llu(%llu%%) "
         "flush=%llu/%llu flobj=%llu/%llu\n",
         cli_id, pool_id, pool_type, pgp_count, max_pgp_count, obj_count, max_obj_count, objnode_count, max_objnode_count, good_puts, puts, no_mem_puts, dup_puts_flushed, dup_puts_replaced, found_gets, gets, gets ? (found_gets * 100LL) / gets : 0, flushs_found, flushs, flush_objs_found, flush_objs);
}
```