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

```asm
<make_binary>:
  endbr64
  push   %r15
  lea    0x1(%rsi),%rax
  mov    %ecx,%r9d
  push   %r14
  push   %r13
  xor    %r13d,%r13d
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x28,%rsp
  mov    %rdi,0x10(%rsp)
  mov    %rax,(%rsp)
L126:
  cmp    %rbx,%rbp
  jae    L120
  mov    %rbp,%r15
  xor    %r14d,%r14d
  xor    %r12d,%r12d
L180:
  movzbl (%r15),%eax
  cmp    $0x2c,%al
  je     L165
  cmp    $0x28,%al
  je     L44
L88:
  add    $0x1,%r15
  cmp    %r15,%rbx
  ja     L180
  cmp    $0x1,%r12d
  jle    L20
  mov    %rbx,%rdx
  mov    $0x3a,%esi
  mov    %rbp,%rdi
  sub    %rbp,%rdx
  add    $0x1,%edx
  call   <memchr@plt>
  test   %rax,%rax
  je     L52
L110:
  mov    %rbp,%rdi
  xor    %r15d,%r15d
  jmp    L69
  nopl   0x0(%rax,%rax,1)
L76:
  cmp    $0x28,%al
  je     L109
L159:
  add    $0x1,%rdi
L69:
  movzbl (%rdi),%eax
  cmp    $0x2c,%al
  jne    L76
  cmp    $0x1,%r15d
  je     L192
  movzbl 0x1(%rdi),%eax
  lea    0x1(%rdi),%r15
  cmp    $0x2c,%al
  je     L172
  mov    %r15,%rdi
  mov    $0x1,%r15d
  cmp    $0x28,%al
  jne    L159
L109:
  mov    %rdi,%rsi
  call   <nextpar@plt>
  mov    %rax,%rdi
  jmp    L159
  nopl   0x0(%rax,%rax,1)
L165:
  add    $0x1,%r12d
  jmp    L88
L192:
  mov    %rdi,%r15
  nopl   0x0(%rax)
L172:
  mov    %r15,%rdi
  add    $0x4,%rbx
  lea    0x4(%r14,%r13,1),%r13d
  call   <strlen@plt>
  lea    0x4(%r15),%rdi
  mov    %r15,%rsi
  lea    0x1(%rax),%edx
  call   <memmove@plt>
  mov    (%rsp),%rdi
  mov    %r15d,%edx
  mov    %rbp,%rsi
  sub    %ebp,%edx
  call   <memmove@plt>
  movb   $0x28,0x0(%rbp)
  lea    0x1(%r15),%rdi
  mov    $0x3,%edx
  lea    D4(%rip),%rsi
  call   <memcpy@plt>
  xor    %r9d,%r9d
  cmp    $0x2,%r12d
  jne    L126
L120:
  add    $0x28,%rsp
  mov    %r13d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L44:
  mov    %r15,%rsi
  mov    %r15,%rdi
  mov    %r9d,0x8(%rsp)
  call   <nextpar@plt>
  mov    0x8(%rsp),%r9d
  test   %r9d,%r9d
  jne    L29
  mov    %rax,%r15
  jmp    L88
L29:
  mov    0x10(%rsp),%rdi
  lea    -0x1(%rax),%rdx
  lea    0x1(%r15),%rsi
  mov    $0x1,%ecx
  mov    %r9d,0x1c(%rsp)
  mov    %rax,0x8(%rsp)
  call   <make_binary>
  mov    0x8(%rsp),%r8
  mov    0x1c(%rsp),%r9d
  movslq %eax,%rdx
  add    %eax,%r14d
  add    %rdx,%rbx
  lea    (%r8,%rdx,1),%r15
  jmp    L88
L52:
  lea    D8(%rip),%rdi
  call   <err_message@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L110
L20:
  add    %r14d,%r13d
  jmp    L120
```

tool_calls: name: unpack_data
arguments: data_tag: D4
type_infered: string
name: unpack_data
arguments: data_tag: D8
type_infered: string

tool: D4: ):0

tool: D8: Cannot process multibranched tree without branch lengths

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;
}
```