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

```asm
<OC_mkNeededness>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %edi,-0x44(%rbp)
  mov    %esi,-0x48(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,%edi
  call   <UTIL_itoa@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x44(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jne    L12
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x14,%rax
  mov    %rax,%rdi
  call   <UTIL_mallocStr@plt>
  mov    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  lea    D6(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x30(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x38(%rbp),%rax
  lea    D44(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  jmp    L2
L12:
  mov    -0x44(%rbp),%eax
  mov    %eax,%edi
  call   <UTIL_itoa@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,%rbx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    %rbx,%rax
  add    $0x3c,%rax
  mov    %rax,%rdi
  call   <UTIL_mallocStr@plt>
  mov    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  lea    D4(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x30(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x38(%rbp),%rax
  lea    D49(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x28(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x38(%rbp),%rax
  lea    D10(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
L2:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <OC_mkSome@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <OC_mkRef@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x18(%rbp),%rax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D6
data_type: string
name: unpack_data
arguments: tag: D44
data_type: string
name: unpack_data
arguments: tag: D4
data_type: string
name: unpack_data
arguments: tag: D49
data_type: string
name: unpack_data
arguments: tag: D10
data_type: string

tool: D6: (Array.make 

tool: D44:  true)

tool: D4: (Array.init 

tool: D49:  (fun x -> if x >= 

tool: D10:  then false else true))

assistant: ```c
char *OC_mkNeededness(int neededness, int tyenvsize) {
  char *length = UTIL_itoa(tyenvsize);
  char *init;
  char *some;
  char *ref;
  if (neededness == tyenvsize) {
    init = UTIL_mallocStr(strlen(length) + 20);
    strcpy(init, "(Array.make ");
    strcat(init, length);
    free(length);
    strcat(init, " true)");
  } else {
    char *num = UTIL_itoa(neededness);
    init = UTIL_mallocStr(strlen(length) + strlen(num) + 60);
    strcpy(init, "(Array.init ");
    strcat(init, length);
    free(length);
    strcat(init, " (fun x -> if x >= ");
    strcat(init, num);
    free(num);
    strcat(init, " then false else true))");
  }
  some = OC_mkSome(init);
  free(init);
  ref = OC_mkRef(some);
  free(some);
  return ref;
}
```