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

```asm
<parse_extra>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %rdx,0x8(%rsp)
  mov    %rcx,0x10(%rsp)
  mov    %r8,0x18(%rsp)
  mov    %r9,0x20(%rsp)
  lea    D186(%rip),%r12
  lea    D200(%rip),%r13
  lea    D120(%rip),%r14
  lea    D154(%rip),%r15
  jmp    L277
L25:
  mov    $0x4,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L110
  mov    $0x6,%edx
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L110
  mov    $0x4,%edx
  lea    D99(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L110
  mov    $0x5,%edx
  lea    D132(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L110
  mov    $0x4,%edx
  lea    D32(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L110
  mov    $0xb,%edx
  lea    D14(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L332
  mov    0x70(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L75
  mov    %rbx,%rsi
  lea    D41(%rip),%rdi
  call   <syntax@plt>
L75:
  lea    0xb(%rbx),%rax
  mov    %rax,0x28(%rsp)
  mov    %rax,%rdi
  call   <atoi@plt>
  sub    $0x4,%eax
  cmp    $0xfb,%eax
  ja     L235
  mov    0x70(%rsp),%rax
  mov    0x28(%rsp),%rcx
  mov    %rcx,(%rax)
  jmp    L163
L235:
  mov    %rbx,%rsi
  lea    D201(%rip),%rdi
  call   <syntax@plt>
  jmp    L163
L332:
  mov    $0x7,%edx
  lea    D68(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L228
L28:
  mov    0x8(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L11
  mov    %rbx,%rsi
  lea    D71(%rip),%rdi
  call   <syntax@plt>
L11:
  cmpb   $0x3d,0x1(%rbx)
  setne  %al
  movzbl %al,%eax
  lea    0x2(%rax,%rax,4),%rax
  add    %rbx,%rax
  mov    0x8(%rsp),%rcx
  mov    %rax,(%rcx)
  jmp    L163
L228:
  mov    $0x2,%edx
  lea    D137(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L28
  mov    $0x7,%edx
  lea    D53(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L101
  mov    0x20(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L300
  mov    %rbx,%rsi
  lea    D122(%rip),%rdi
  call   <syntax@plt>
L300:
  lea    0x7(%rbx),%rax
  mov    0x20(%rsp),%rcx
  mov    %rax,(%rcx)
  jmp    L163
L101:
  mov    $0xb,%edx
  lea    D182(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L74
  mov    0x10(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L31
  mov    %rbx,%rsi
  lea    D139(%rip),%rdi
  call   <syntax@plt>
L31:
  lea    0xb(%rbx),%rax
  mov    0x10(%rsp),%rcx
  mov    %rax,(%rcx)
  jmp    L163
L74:
  mov    $0xb,%edx
  lea    D208(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L40
  mov    0x18(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L323
  mov    %rbx,%rsi
  lea    D166(%rip),%rdi
  call   <syntax@plt>
L323:
  lea    0xb(%rbx),%rax
  mov    0x18(%rsp),%rcx
  mov    %rax,(%rcx)
  jmp    L163
L40:
  mov    $0xa,%edx
  lea    D155(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L163
  mov    $0x2,%edx
  lea    D205(%rip),%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L163
L65:
  mov    %rbx,%rax
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L90:
  add    $0x1,%rbx
L163:
  movzbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L143
  cmpb   $0x0,(%rbx)
  jne    L90
L143:
  movzbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L287
  add    $0x1,%rbx
  jmp    L143
L287:
  cmpb   $0x0,(%rbx)
  je     L65
L277:
  mov    $0x5,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L25
L110:
  cmpq   $0x0,0x0(%rbp)
  je     L96
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <syntax@plt>
L96:
  mov    %rbx,0x0(%rbp)
  jmp    L163
```

tool_calls: name: unpack_data
arguments: data_tag: D186
datatype: string
name: unpack_data
arguments: data_tag: D200
datatype: string
name: unpack_data
arguments: data_tag: D120
datatype: string
name: unpack_data
arguments: data_tag: D154
datatype: string
name: unpack_data
arguments: data_tag: D99
datatype: string
name: unpack_data
arguments: data_tag: D132
datatype: string
name: unpack_data
arguments: data_tag: D32
datatype: string
name: unpack_data
arguments: data_tag: D14
datatype: string
name: unpack_data
arguments: data_tag: D41
datatype: string
name: unpack_data
arguments: data_tag: D201
datatype: string
name: unpack_data
arguments: data_tag: D68
datatype: string
name: unpack_data
arguments: data_tag: D71
datatype: string
name: unpack_data
arguments: data_tag: D137
datatype: string
name: unpack_data
arguments: data_tag: D53
datatype: string
name: unpack_data
arguments: data_tag: D122
datatype: string
name: unpack_data
arguments: data_tag: D182
datatype: string
name: unpack_data
arguments: data_tag: D139
datatype: string
name: unpack_data
arguments: data_tag: D208
datatype: string
name: unpack_data
arguments: data_tag: D166
datatype: string
name: unpack_data
arguments: data_tag: D155
datatype: string
name: unpack_data
arguments: data_tag: D205
datatype: string

tool: D186: clef=

tool: D200: Double clef name

tool: D120: bass

tool: D154: treble

tool: D99: alto

tool: D132: tenor

tool: D32: perc

tool: D14: microscale=

tool: D41: Double microscale=

tool: D201: Invalid value in microscale=

tool: D68: middle=

tool: D71: Double clef middle

tool: D137: m=

tool: D53: octave=

tool: D122: Double octave=

tool: D182: stafflines=

tool: D139: Double stafflines

tool: D208: staffscale=

tool: D166: Double staffscale

tool: D155: transpose=

tool: D205: t=

assistant: ```c
char *parse_extra(char *p, char **p_name, char **p_middle, char **p_lines, char **p_scale, char **p_octave, char **p_microscale) {
  for (;;) {
    if (strncmp(p, "clef=", 5) == 0 || strncmp(p, "bass", 4) == 0 || strncmp(p, "treble", 6) == 0 || strncmp(p, "alto", 4) == 0 || strncmp(p, "tenor", 5) == 0 || strncmp(p, "perc", 4) == 0) {
      if (*p_name)
        syntax("Double clef name", p);
      *p_name = p;
    } else if (strncmp(p, "microscale=", 11) == 0) {
      int i;
      if (*p_microscale)
        syntax("Double microscale=", p);
      i = atoi(p + 11);
      if (i < 4 || i > 255)
        syntax("Invalid value in microscale=", p);
      else
        *p_microscale = p + 11;
    } else if (strncmp(p, "middle=", 7) == 0 || strncmp(p, "m=", 2) == 0) {
      if (*p_middle)
        syntax("Double clef middle", p);
      *p_middle = p + (p[1] == '=' ? 2 : 7);
    } else if (strncmp(p, "octave=", 7) == 0) {
      if (*p_octave)
        syntax("Double octave=", p);
      *p_octave = p + 7;
    } else if (strncmp(p, "stafflines=", 11) == 0) {
      if (*p_lines)
        syntax("Double stafflines", p);
      *p_lines = p + 11;
    } else if (strncmp(p, "staffscale=", 11) == 0) {
      if (*p_scale)
        syntax("Double staffscale", p);
      *p_scale = p + 11;
    } else if (strncmp(p, "transpose=", 10) == 0 || strncmp(p, "t=", 2) == 0) {
      ;
    } else {
      break;
    }
    while (!isspace((unsigned char)*p) && *p != '\0')
      p++;
    while (isspace((unsigned char)*p))
      p++;
    if (*p == '\0')
      break;
  }
  return p;
}
```