user: Converte this assembly snippet into its equivalent C code:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xf8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xe8(%rsp)
  xor    %eax,%eax
  cmp    $0x9,%edi
  je     L13
  lea    D9(%rip),%rdi
  call   <puts@plt>
  xor    %edi,%edi
  call   <exit@plt>
L13:
  lea    0x40(%rsp),%r14
  mov    %rsi,%rbp
  mov    0x8(%rsi),%rsi
  lea    0x90(%rsp),%r13
  mov    %r14,%rdi
  call   <strcpy@plt>
  mov    0x10(%rbp),%rsi
  mov    %r13,%rdi
  call   <strcpy@plt>
  mov    %r14,%rdi
  xor    %eax,%eax
  call   <does_not_exist@plt>
  mov    %r14,%rsi
  test   %eax,%eax
  jne    L5
  xor    %eax,%eax
  mov    %r13,%rdi
  call   <does_not_exist@plt>
  test   %eax,%eax
  je     L27
  mov    %r13,%rsi
L5:
  lea    D8(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %edi,%edi
  call   <exit@plt>
L27:
  mov    0x18(%rbp),%rdi
  xor    %eax,%eax
  call   <atoi@plt>
  mov    0x20(%rbp),%rdi
  mov    %eax,(%rsp)
  xor    %eax,%eax
  call   <atoi@plt>
  mov    0x28(%rbp),%rdi
  mov    %eax,0x4(%rsp)
  xor    %eax,%eax
  call   <atoi@plt>
  mov    0x30(%rbp),%rdi
  mov    %eax,%ebx
  xor    %eax,%eax
  call   <atoi@plt>
  mov    0x38(%rbp),%rdi
  mov    %eax,%r15d
  xor    %eax,%eax
  call   <atoi@plt>
  mov    0x40(%rbp),%rdi
  mov    %eax,0x8(%rsp)
  xor    %eax,%eax
  call   <atoi@plt>
  lea    0x30(%rsp),%rdx
  lea    0x20(%rsp),%rsi
  mov    %r14,%rdi
  mov    %eax,0xc(%rsp)
  xor    %eax,%eax
  call   <get_image_size@plt>
  lea    0x38(%rsp),%rdx
  mov    %r13,%rdi
  xor    %eax,%eax
  lea    0x28(%rsp),%rsi
  call   <get_image_size@plt>
  mov    0x30(%rsp),%rsi
  mov    0x20(%rsp),%rdi
  xor    %eax,%eax
  call   <allocate_image_array@plt>
  mov    0x38(%rsp),%rsi
  mov    0x28(%rsp),%rdi
  movslq %eax,%r12
  xor    %eax,%eax
  call   <allocate_image_array@plt>
  mov    %r12,%rsi
  mov    %r14,%rdi
  movslq %eax,%rbp
  xor    %eax,%eax
  call   <read_image_array@plt>
  mov    %rbp,%rsi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <read_image_array@plt>
  mov    %ebx,%edx
  push   %rcx
  mov    %r15d,%ecx
  lea    0x24(%rsp),%rax
  push   %rax
  xor    %eax,%eax
  push   0x48(%rsp)
  push   0x40(%rsp)
  push   0x50(%rsp)
  push   0x48(%rsp)
  mov    0x3c(%rsp),%r9d
  mov    0x38(%rsp),%r8d
  mov    0x30(%rsp),%edi
  mov    0x34(%rsp),%esi
  call   <check_cut_and_paste_limits@plt>
  mov    0x4c(%rsp),%esi
  add    $0x30,%rsp
  xor    %eax,%eax
  lea    D13(%rip),%rdi
  call   <printf@plt>
  cmpl   $0x0,0x1c(%rsp)
  jne    L31
L33:
  mov    %rbp,%rsi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <write_image_array@plt>
  mov    0x28(%rsp),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <free_image_array@plt>
  mov    0x20(%rsp),%rsi
  xor    %eax,%eax
  mov    %r12,%rdi
  call   <free_image_array@plt>
  mov    0xe8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L3
  add    $0xf8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L31:
  mov    0xc(%rsp),%eax
  mov    %r15d,%r9d
  mov    %ebx,%r8d
  mov    %rbp,%rsi
  mov    %r12,%rdi
  push   %rax
  mov    0x10(%rsp),%eax
  push   %rax
  mov    0x14(%rsp),%ecx
  xor    %eax,%eax
  mov    0x10(%rsp),%edx
  call   <paste_image_piece@plt>
  pop    %rax
  pop    %rdx
  jmp    L33
L3:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D9
datatype: string
name: disassemble_data
arguments: label: D8
datatype: string
name: disassemble_data
arguments: label: D13
datatype: string

tool: D9: 

 usage: maincp in-file out_file in-il in-ie in-ll in-le out-il out-ie

 The image portion is pasted from the 
 in-file into the out-file

tool: D8: 
ERROR input file %s does not exist

tool: D13: 
MAIN> is_ok=%d

assistant: ```c
int main(argc, argv)
int argc;
char *argv[];
{
  char name1[80], name2[80];
  int i, is_ok, il1, ie1, ll1, le1, il2, ie2, ll2, le2;
  long length1, length2, width1, width2;
  short **the_image, **out_image;
  if (argc != 9) {
    printf("\n"
           "\n usage: maincp in-file out_file "
           "in-il in-ie in-ll in-le out-il out-ie"
           "\n"
           "\n The image portion is pasted from the "
           "\n in-file into the out-file"
           "\n");
    exit(0);
  }
  strcpy(name1, argv[1]);
  strcpy(name2, argv[2]);
  if (does_not_exist(name1)) {
    printf("\nERROR input file %s does not exist", name1);
    exit(0);
  }
  if (does_not_exist(name2)) {
    printf("\nERROR input file %s does not exist", name2);
    exit(0);
  }
  il1 = atoi(argv[3]);
  ie1 = atoi(argv[4]);
  ll1 = atoi(argv[5]);
  le1 = atoi(argv[6]);
  il2 = atoi(argv[7]);
  ie2 = atoi(argv[8]);
  get_image_size(name1, &length1, &width1);
  get_image_size(name2, &length2, &width2);
  the_image = allocate_image_array(length1, width1);
  out_image = allocate_image_array(length2, width2);
  read_image_array(name1, the_image);
  read_image_array(name2, out_image);
  check_cut_and_paste_limits(il1, ie1, ll1, le1, il2, ie2, length1, width1, length2, width2, &is_ok);
  printf("\nMAIN> is_ok=%d", is_ok);
  if (is_ok)
    paste_image_piece(the_image, out_image, il1, ie1, ll1, le1, il2, ie2);
  write_image_array(name2, out_image);
  free_image_array(out_image, length2);
  free_image_array(the_image, length1);
}
```