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

```asm
<parse_pool>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc0,%rsp
  mov    %rdi,-0xb8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xb8(%rbp),%rax
  lea    D187(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0xa8(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D47(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0xa0(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D102(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x98(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D53(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x90(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D33(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x88(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D31(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x80(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D75(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x78(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D40(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x70(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D200(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x68(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D140(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x60(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D32(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D203(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x50(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D44(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x48(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D129(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x40(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D150(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x38(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D48(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D183(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D36(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0xb8(%rbp),%rax
  lea    D193(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <parse@plt>
  mov    %rax,-0x18(%rbp)
  lea    -0xb(%rbp),%rdx
  mov    -0xb8(%rbp),%rax
  mov    $0x2,%ecx
  lea    D13(%rip),%rsi
  mov    %rax,%rdi
  call   <parse_string@plt>
  movb   $0x0,-0x9(%rbp)
  movzbl -0xa(%rbp),%eax
  cmp    $0x53,%al
  je     L17
  cmpq   $0x0,-0x38(%rbp)
  je     L5
  mov    -0x40(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    $0x0,%edx
  divq   -0x38(%rbp)
  mov    %rax,%r8
  jmp    L12
L5:
  mov    $0x0,%r8d
L12:
  mov    -0x90(%rbp),%rdi
  mov    -0x98(%rbp),%rsi
  lea    -0xb(%rbp),%rcx
  mov    -0xa0(%rbp),%rdx
  mov    -0xa8(%rbp),%rax
  push   -0x18(%rbp)
  push   -0x20(%rbp)
  push   -0x28(%rbp)
  push   -0x30(%rbp)
  push   %r8
  push   -0x38(%rbp)
  push   -0x40(%rbp)
  push   -0x48(%rbp)
  push   -0x50(%rbp)
  push   -0x58(%rbp)
  push   -0x60(%rbp)
  push   -0x68(%rbp)
  push   -0x70(%rbp)
  push   -0x78(%rbp)
  push   -0x80(%rbp)
  push   -0x88(%rbp)
  mov    %rdi,%r9
  mov    %rsi,%r8
  mov    %rax,%rsi
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  sub    $0xffffffffffffff80,%rsp
  jmp    L1
L17:
  nop
L1:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L48
  call   <__stack_chk_fail@plt>
L48:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D187
type: string
name: retrieve_data
arguments: tag: D47
type: string
name: retrieve_data
arguments: tag: D102
type: string
name: retrieve_data
arguments: tag: D53
type: string
name: retrieve_data
arguments: tag: D33
type: string
name: retrieve_data
arguments: tag: D31
type: string
name: retrieve_data
arguments: tag: D75
type: string
name: retrieve_data
arguments: tag: D40
type: string
name: retrieve_data
arguments: tag: D200
type: string
name: retrieve_data
arguments: tag: D140
type: string
name: retrieve_data
arguments: tag: D32
type: string
name: retrieve_data
arguments: tag: D203
type: string
name: retrieve_data
arguments: tag: D44
type: string
name: retrieve_data
arguments: tag: D129
type: string
name: retrieve_data
arguments: tag: D150
type: string
name: retrieve_data
arguments: tag: D48
type: string
name: retrieve_data
arguments: tag: D183
type: string
name: retrieve_data
arguments: tag: D36
type: string
name: retrieve_data
arguments: tag: D193
type: string
name: retrieve_data
arguments: tag: D13
type: string
name: retrieve_data
arguments: tag: D25
type: string

tool: D187: CI

tool: D47: PI

tool: D102: Pc

tool: D53: Pm

tool: D33: Oc

tool: D31: Om

tool: D75: Nc

tool: D40: Nm

tool: D200: ps

tool: D140: pt

tool: D32: px

tool: D203: pd

tool: D44: pr

tool: D129: gs

tool: D150: gt

tool: D48: fs

tool: D183: ft

tool: D36: os

tool: D193: ot

tool: D13: PT

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