user: Please show me the C implementation that matches the assembly code listed below:

```asm
<do_log>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xe0,%rsp
  mov    %rdi,-0xd8(%rbp)
  mov    %rsi,-0xa8(%rbp)
  mov    %rdx,-0xa0(%rbp)
  mov    %rcx,-0x98(%rbp)
  mov    %r8,-0x90(%rbp)
  mov    %r9,-0x88(%rbp)
  test   %al,%al
  je     L56
  movaps %xmm0,-0x80(%rbp)
  movaps %xmm1,-0x70(%rbp)
  movaps %xmm2,-0x60(%rbp)
  movaps %xmm3,-0x50(%rbp)
  movaps %xmm4,-0x40(%rbp)
  movaps %xmm5,-0x30(%rbp)
  movaps %xmm6,-0x20(%rbp)
  movaps %xmm7,-0x10(%rbp)
L56:
  mov    %fs:0x28,%rax
  mov    %rax,-0xb8(%rbp)
  xor    %eax,%eax
  cmpq   $0x0,-0xd8(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    D27(%rip),%rax
  mov    %rax,%rdi
  call   <is_file@plt>
  test   %rax,%rax
  je     L48
  lea    D54(%rip),%rax
  mov    %rax,%rsi
  lea    D27(%rip),%rax
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0xc8(%rbp)
  jmp    L30
L48:
  lea    D33(%rip),%rax
  mov    %rax,%rsi
  lea    D27(%rip),%rax
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0xc8(%rbp)
L30:
  cmpq   $0x0,-0xc8(%rbp)
  jne    L57
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <warning@plt>
  jmp    L47
L57:
  mov    $0x0,%edi
  call   <time@plt>
  mov    %eax,-0xd0(%rbp)
  lea    -0xd0(%rbp),%rax
  mov    %rax,%rdi
  call   <ctime@plt>
  mov    %rax,-0xc0(%rbp)
  mov    -0xc0(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0xc0(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0xd8(%rbp),%rdx
  mov    -0xcc(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <va_start@plt>
  mov    -0xc0(%rbp),%rdx
  mov    -0xc8(%rbp),%rax
  lea    D39(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0xcc(%rbp),%edx
  mov    -0xd8(%rbp),%rcx
  mov    -0xc8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <vfprintf@plt>
  mov    -0xc8(%rbp),%rax
  mov    %rax,%rsi
  mov    $0xa,%edi
  call   <fputc@plt>
  mov    -0xcc(%rbp),%eax
  mov    %eax,%edi
  call   <va_end@plt>
  mov    -0xc8(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
L47:
  mov    -0xb8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L31
  call   <__stack_chk_fail@plt>
L31:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: label: D27
type_guessed: string
name: unpack_data
arguments: label: D54
type_guessed: string
name: unpack_data
arguments: label: D33
type_guessed: string
name: unpack_data
arguments: label: D12
type_guessed: string
name: unpack_data
arguments: label: D39
type_guessed: string

tool: D27: /var/log/ilenia

tool: D54: a

tool: D33: w

tool: D12: Cannot open or create the log file!

tool: D39: %s: 

assistant: ```c
void do_log(const char *format, ...) {
  FILE *stream;
  va_list ap;
  assert(format != NULL);
  if (is_file("/var/log/ilenia"))
    stream = fopen("/var/log/ilenia", "a");
  else
    stream = fopen("/var/log/ilenia", "w");
  if (stream == NULL) {
    warning("Cannot open or create the log file!");
    return;
  }
  time_t t = time(NULL);
  char *times = ctime(&t);
  *(times + strlen(times) - 1) = 0;
  va_start(ap, format);
  fprintf(stream, "%s: ", times);
  vfprintf(stream, format, ap);
  fprintf(stream, "\n");
  va_end(ap);
  fclose(stream);
}
```