user: Translate the below assembly code into C programming language:

```asm
<make_binary>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %ecx,-0x3c(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x1c(%rbp)
  movl   $0x0,-0x14(%rbp)
  jmp    L6
L76:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L69
  addl   $0x1,-0x1c(%rbp)
  jmp    L144
L69:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L144
  mov    -0x10(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <nextpar@plt>
  mov    %rax,-0x8(%rbp)
  cmpl   $0x0,-0x3c(%rbp)
  je     L55
  mov    -0x8(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rsi
  mov    -0x28(%rbp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <make_binary>
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  add    %rax,-0x38(%rbp)
  mov    -0x18(%rbp),%eax
  add    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  jmp    L144
L55:
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x10(%rbp)
L144:
  addq   $0x1,-0x10(%rbp)
L6:
  mov    -0x10(%rbp),%rax
  cmp    -0x38(%rbp),%rax
  jb     L76
  cmpl   $0x1,-0x1c(%rbp)
  jle    L35
  mov    -0x38(%rbp),%rax
  sub    -0x30(%rbp),%rax
  add    $0x1,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    $0x3a,%esi
  mov    %rax,%rdi
  call   <memchr@plt>
  test   %rax,%rax
  jne    L103
  lea    D15(%rip),%rax
  mov    %rax,%rdi
  call   <err_message@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L103:
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x18(%rbp)
L96:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L131
  addl   $0x1,-0x18(%rbp)
  cmpl   $0x2,-0x18(%rbp)
  jne    L148
  jmp    L26
L131:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L148
  mov    -0x10(%rbp),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <nextpar@plt>
  mov    %rax,-0x10(%rbp)
L148:
  addq   $0x1,-0x10(%rbp)
  jmp    L96
L26:
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x10(%rbp),%rax
  lea    0x4(%rax),%rcx
  mov    -0x10(%rbp),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <memmove@plt>
  mov    -0x10(%rbp),%rax
  sub    -0x30(%rbp),%rax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x30(%rbp),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <memmove@plt>
  mov    -0x30(%rbp),%rax
  movb   $0x28,(%rax)
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  mov    $0x3,%edx
  lea    D2(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addq   $0x4,-0x38(%rbp)
  addl   $0x4,-0x14(%rbp)
  cmpl   $0x2,-0x1c(%rbp)
  jle    L35
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    -0x28(%rbp),%rax
  mov    $0x0,%ecx
  mov    %rax,%rdi
  call   <make_binary>
  add    %eax,-0x14(%rbp)
L35:
  mov    -0x14(%rbp),%eax
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D15
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D2
type_infered: string

tool: D15: Cannot process multibranched tree without branch lengths

tool: D2: ):0

assistant: ```c
int make_binary(char *arbre, char *debut, char *fin, int go_down) {
  int virg, l, retval;
  char *p, *q;
  p = debut;
  virg = 0;
  retval = 0;
  while (p < fin) {
    if (*p == ',')
      virg++;
    else if (*p == '(') {
      q = nextpar(p, p);
      if (go_down) {
        l = make_binary(arbre, p + 1, q - 1, (!0));
        fin += l;
        retval += l;
        p = q + l;
      } else
        p = q;
    }
    p++;
  }
  if (virg > 1) {
    if (memchr(debut, ':', fin - debut + 1) == NULL) {
      err_message("Cannot process multibranched tree without branch lengths");
      exit(1);
    }
    p = debut;
    l = 0;
    while ((!0)) {
      if (*p == ',') {
        l++;
        if (l == 2)
          break;
      } else if (*p == '(') {
        p = nextpar(p, p);
      }
      p++;
    }
    l = strlen(p);
    memmove(p + 4, p, l + 1);
    memmove(debut + 1, debut, p - debut);
    *debut = '(';
    memcpy(p + 1, "):0", 3);
    fin += 4;
    retval += 4;
    if (virg > 2)
      retval += make_binary(arbre, debut, fin, 0);
  }
  return retval;
}
```