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

```asm
<gfun_cpp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rcx
  mov    -0x20(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <find_gct@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L55
  mov    $0xffffffff,%eax
  jmp    L83
L55:
  mov    -0x38(%rbp),%rsi
  mov    -0x30(%rbp),%rcx
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rsi,%r8
  lea    D151(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rcx
  mov    $0x1e,%edx
  mov    $0x1,%esi
  lea    D127(%rip),%rax
  mov    %rax,%rdi
  call   <fwrite@plt>
  mov    -0x20(%rbp),%rax
  lea    D111(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L69
  mov    -0x20(%rbp),%rax
  lea    D68(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L69
  mov    -0x20(%rbp),%rax
  lea    D10(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L53
L69:
  mov    -0x28(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  lea    D154(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x30(%rbp),%rdx
  mov    -0x8(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  lea    D122(%rip),%rcx
  mov    %rax,%rdi
  call   <generate_arg@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rcx
  mov    $0x2,%edx
  mov    $0x1,%esi
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  call   <fwrite@plt>
  mov    -0x38(%rbp),%rdx
  mov    -0x8(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  lea    D11(%rip),%rcx
  mov    %rax,%rdi
  call   <generate_arg@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    $0x29,%edi
  call   <fputc@plt>
  jmp    L88
L53:
  mov    -0x20(%rbp),%rax
  lea    D159(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L29
  mov    -0x30(%rbp),%rax
  lea    D105(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L29
  mov    -0x38(%rbp),%rdx
  mov    -0x8(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  lea    D11(%rip),%rcx
  mov    %rax,%rdi
  call   <generate_arg@plt>
  mov    -0x28(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  lea    D98(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x30(%rbp),%rdx
  mov    -0x8(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  lea    D122(%rip),%rcx
  mov    %rax,%rdi
  call   <generate_arg@plt>
  jmp    L88
L29:
  mov    -0x30(%rbp),%rdx
  mov    -0x8(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  lea    D122(%rip),%rcx
  mov    %rax,%rdi
  call   <generate_arg@plt>
  mov    -0x28(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  lea    D98(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x38(%rbp),%rdx
  mov    -0x8(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  lea    D11(%rip),%rcx
  mov    %rax,%rdi
  call   <generate_arg@plt>
L88:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rcx
  mov    $0x6,%edx
  mov    $0x1,%esi
  lea    D97(%rip),%rax
  mov    %rax,%rdi
  call   <fwrite@plt>
  mov    $0x0,%eax
L83:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D151
data_type: string
name: retrieve_data
arguments: data_label: D127
data_type: string
name: retrieve_data
arguments: data_label: D111
data_type: string
name: retrieve_data
arguments: data_label: D68
data_type: string
name: retrieve_data
arguments: data_label: D10
data_type: string
name: retrieve_data
arguments: data_label: D154
data_type: string
name: retrieve_data
arguments: data_label: D122
data_type: string
name: retrieve_data
arguments: data_label: D149
data_type: string
name: retrieve_data
arguments: data_label: D11
data_type: string
name: retrieve_data
arguments: data_label: D159
data_type: string
name: retrieve_data
arguments: data_label: D105
data_type: string
name: retrieve_data
arguments: data_label: D98
data_type: string
name: retrieve_data
arguments: data_label: D97
data_type: string

tool: D151: tuple_cell op_numeric_%s_%s_%s(const tuple_cell &a1, const tuple_cell &a2)
{


tool: D127:     return tuple_cell::atomic(

tool: D111: divide

tool: D68: integer_divide

tool: D10: mod

tool: D154: %s(

tool: D122: a1

tool: D149: , 

tool: D11: a2

tool: D159: equal

tool: D105: xs_double

tool: D98:  %s 

tool: D97: );
}



assistant: ```c
int gfun_cpp(FILE *f, const char *op, const char *ops, const char *type1, const char *type2) {
  const char *gct = find_gct(op, type1, type2);
  if (!gct)
    return -1;
  fprintf(f, "tuple_cell op_numeric_%s_%s_%s(const tuple_cell &a1, const tuple_cell &a2)\n{\n", op, type1, type2);
  fprintf(f, "    return tuple_cell::atomic(");
  if (!strcmp(op, "divide") || !strcmp(op, "integer_divide") || !strcmp(op, "mod")) {
    fprintf(f, "%s(", ops);
    generate_arg(f, gct, type1, "a1");
    fprintf(f, ", ");
    generate_arg(f, gct, type2, "a2");
    fprintf(f, ")");
  } else if (!strcmp(op, "equal") && !strcmp(type1, "xs_double")) {
    generate_arg(f, gct, type2, "a2");
    fprintf(f, " %s ", ops);
    generate_arg(f, gct, type1, "a1");
  } else {
    generate_arg(f, gct, type1, "a1");
    fprintf(f, " %s ", ops);
    generate_arg(f, gct, type2, "a2");
  }
  fprintf(f, ");\n}\n\n");
  return 0;
}
```