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

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  lea    0x1c(%rsp),%r12
  lea    0x18(%rsp),%rbp
  mov    %r12,%rcx
  mov    %rbp,%rdx
  lea    D13(%rip),%rsi
  lea    D64(%rip),%rdi
  call   <sscanf@plt>
  lea    0x20(%rsp),%rbx
  mov    0x1c(%rsp),%ecx
  mov    0x18(%rsp),%edx
  lea    D118(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  mov    %rbx,%rdi
  call   <puts@plt>
  lea    D3(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  mov    %eax,0xc(%rsp)
  lea    0x14(%rsp),%r15
  mov    %r12,%r8
  mov    %rbp,%rcx
  mov    %r15,%rdx
  lea    D25(%rip),%r14
  mov    %r14,%rsi
  lea    D112(%rip),%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    0x1c(%rsp),%r8d
  mov    0x18(%rsp),%ecx
  mov    0x14(%rsp),%edx
  lea    D59(%rip),%r13
  mov    %r13,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  lea    D17(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  or     0xc(%rsp),%eax
  mov    %eax,0xc(%rsp)
  mov    %rbx,%rdi
  call   <puts@plt>
  mov    %r12,%r8
  mov    %rbp,%rcx
  mov    %r15,%rdx
  mov    %r14,%rsi
  lea    D55(%rip),%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    0x1c(%rsp),%r8d
  mov    0x18(%rsp),%ecx
  mov    0x14(%rsp),%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <sprintf@plt>
  lea    D20(%rip),%rsi
  mov    %rbx,%rdi
  call   <strcmp@plt>
  mov    0xc(%rsp),%ebp
  or     %eax,%ebp
  mov    %rbx,%rdi
  call   <puts@plt>
  test   %ebp,%ebp
  lea    D86(%rip),%rdi
  lea    D102(%rip),%rax
  cmove  %rax,%rdi
  call   <puts@plt>
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L9
  mov    %ebp,%eax
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L9:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: tag: D13
data_type: string
name: unpack_data
arguments: tag: D64
data_type: string
name: unpack_data
arguments: tag: D118
data_type: string
name: unpack_data
arguments: tag: D3
data_type: string
name: unpack_data
arguments: tag: D25
data_type: string
name: unpack_data
arguments: tag: D112
data_type: string
name: unpack_data
arguments: tag: D59
data_type: string
name: unpack_data
arguments: tag: D17
data_type: string
name: unpack_data
arguments: tag: D55
data_type: string
name: unpack_data
arguments: tag: D20
data_type: string
name: unpack_data
arguments: tag: D86
data_type: string
name: unpack_data
arguments: tag: D102
data_type: string

tool: D13: %x %x

tool: D64: 0x10 10

tool: D118: %d %d

tool: D3: 16 16

tool: D25: P%1d%4d%4d

tool: D112: P012349876

tool: D59: %d %d %d

tool: D17: 0 1234 9876

tool: D55: P112349876

tool: D20: 1 1234 9876

tool: D86: Test failed

tool: D102: Test passed

assistant: ```c
int main(int argc, char *argv[]) {
  char buf[100];
  int point, x, y;
  int status = 0;
  sscanf("0x10 10", "%x %x", &x, &y);
  sprintf(buf, "%d %d", x, y);
  puts(buf);
  status |= strcmp(buf, "16 16");
  sscanf("P012349876", "P%1d%4d%4d", &point, &x, &y);
  sprintf(buf, "%d %d %d", point, x, y);
  status |= strcmp(buf, "0 1234 9876");
  puts(buf);
  sscanf("P112349876", "P%1d%4d%4d", &point, &x, &y);
  sprintf(buf, "%d %d %d", point, x, y);
  status |= strcmp(buf, "1 1234 9876");
  puts(buf);
  puts(status ? "Test failed" : "Test passed");
  return status;
}
```