user: What is the c source code of the assembly code below:

```asm
<shen_castan_aux>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %edx,-0x40(%rbp)
  mov    %ecx,-0x44(%rbp)
  mov    %r8,-0x50(%rbp)
  mov    -0x3c(%rbp),%eax
  imul   -0x40(%rbp),%eax
  mov    -0x44(%rbp),%edx
  imul   %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  cltq
  mov    $0x4,%esi
  mov    %rax,%rdi
  call   <calloc@plt>
  mov    %rax,-0x28(%rbp)
  mov    $0x0,%ebx
  jmp    L38
L2:
  movslq %ebx,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  movslq %ebx,%rax
  lea    0x0(,%rax,4),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  pxor   %xmm0,%xmm0
  cvtsi2ss %edx,%xmm0
  movss  %xmm0,(%rax)
  add    $0x1,%ebx
L38:
  cmp    -0x2c(%rbp),%ebx
  jl     L2
  mov    -0x2c(%rbp),%eax
  cltq
  mov    $0x4,%esi
  mov    %rax,%rdi
  call   <calloc@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x44(%rbp),%edi
  mov    -0x3c(%rbp),%ecx
  mov    -0x40(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x28(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <compute_ISEF@plt>
  mov    -0x44(%rbp),%edi
  mov    -0x3c(%rbp),%ecx
  mov    -0x40(%rbp),%edx
  mov    -0x28(%rbp),%rsi
  mov    -0x20(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <compute_bli@plt>
  cltq
  mov    %rax,-0x18(%rbp)
  mov    -0x44(%rbp),%r8d
  mov    -0x3c(%rbp),%edi
  mov    -0x40(%rbp),%ecx
  mov    -0x18(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x28(%rbp),%rax
  mov    %r8d,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <locate_zero_crossings@plt>
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x44(%rbp),%edi
  mov    -0x3c(%rbp),%ecx
  mov    -0x40(%rbp),%edx
  mov    -0x50(%rbp),%rsi
  mov    -0x28(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <threshold_edges@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    $0x0,%ebx
  jmp    L33
L32:
  movslq %ebx,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jle    L53
  mov    $0x0,%edx
  jmp    L50
L53:
  mov    $0xff,%edx
L50:
  movslq %ebx,%rax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  mov    %edx,(%rax)
  add    $0x1,%ebx
L33:
  cmp    -0x2c(%rbp),%ebx
  jl     L32
  nop
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void shen_castan_aux(int *image, int width, int height, int depth, int *ret) {
  register int i;
  float *buffer;
  float *smoothed_buffer;
  int *bli_buffer, plane_size = width * height * depth;
  buffer = (float *)calloc(plane_size, sizeof(float));
  for (i = 0; i < plane_size; i++) {
    buffer[i] = (float)image[i];
  }
  smoothed_buffer = (float *)calloc(plane_size, sizeof(float));
  compute_ISEF(buffer, smoothed_buffer, height, width, depth);
  bli_buffer = compute_bli(smoothed_buffer, buffer, height, width, depth);
  locate_zero_crossings(buffer, smoothed_buffer, bli_buffer, height, width, depth);
  free(smoothed_buffer);
  free(bli_buffer);
  threshold_edges(buffer, ret, height, width, depth);
  free(buffer);
  for (i = 0; i < plane_size; i++)
    ret[i] = (ret[i] > 0) ? 0 : 255;
}
```