user: What would the C source look like for the assembly code provided here?

```asm
<ic_b2c_compile_type_union_header>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  movq   $0x0,-0x10(%rbp)
  movq   $0x0,-0x8(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L70
  lea    D55(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  jmp    L83
L70:
  cmpq   $0x0,-0x20(%rbp)
  jne    L34
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  jmp    L83
L34:
  cmpq   $0x0,-0x28(%rbp)
  jne    L21
  lea    D0(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  jmp    L83
L21:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <ic_decl_type_union_mangled_name@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L64
  lea    D21(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  jmp    L83
L64:
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <ic_symbol_contents@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L11
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  jmp    L83
L11:
  mov    -0x8(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  lea    D13(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x8(%rbp),%rcx
  mov    -0x8(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  lea    D40(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    $0x1,%eax
L83:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D55
type: string
name: disassemble_data
arguments: data_tag: D64
type: string
name: disassemble_data
arguments: data_tag: D0
type: string
name: disassemble_data
arguments: data_tag: D21
type: string
name: disassemble_data
arguments: data_tag: D14
type: string
name: disassemble_data
arguments: data_tag: D13
type: string
name: disassemble_data
arguments: data_tag: D40
type: string

tool: D55: ic_b2c_compile_type_union_header: kludge was null

tool: D64: ic_b2c_compile_type_union_header: tdecl_union was null

tool: D0: ic_b2c_compile_type_union_header: f was null

tool: D21: ic_b2c_compile_type_union_header: call to ic_decl_type_union_mangled_name failed

tool: D14: ic_b2c_compile_type_union_header: call to ic_symbol_contents failed

tool: D13: enum %s_tag;


tool: D40: typedef struct %s * %s;


assistant: ```c
unsigned int ic_b2c_compile_type_union_header(struct ic_kludge *kludge, struct ic_decl_type_union *tdecl_union, FILE *f) {
  struct ic_symbol *mangled_type_name = 0;
  char *mangled_type_name_ch = 0;
  if (!kludge) {
    puts("ic_b2c_compile_type_union_header: kludge was null");
    return 0;
  }
  if (!tdecl_union) {
    puts("ic_b2c_compile_type_union_header: tdecl_union was null");
    return 0;
  }
  if (!f) {
    puts("ic_b2c_compile_type_union_header: f was null");
    return 0;
  }
  mangled_type_name = ic_decl_type_union_mangled_name(tdecl_union);
  if (!mangled_type_name) {
    puts("ic_b2c_compile_type_union_header: call to ic_decl_type_union_mangled_name failed");
    return 0;
  }
  mangled_type_name_ch = ic_symbol_contents(mangled_type_name);
  if (!mangled_type_name_ch) {
    puts("ic_b2c_compile_type_union_header: call to ic_symbol_contents failed");
    return 0;
  }
  fprintf(f, "enum %s_tag;\n", mangled_type_name_ch);
  fprintf(f, "typedef struct %s * %s;\n", mangled_type_name_ch, mangled_type_name_ch);
  return 1;
}
```