user: 请将以下的汇编代码转换成C语言代码:

```asm
<parse_extra>:
  endbr64
  push   %r15
  lea    D184(%rip),%r15
  push   %r14
  lea    D84(%rip),%r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  lea    D107(%rip),%r12
  push   %rbp
  lea    D160(%rip),%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x38,%rsp
  mov    %rdx,0x8(%rsp)
  mov    %rcx,0x10(%rsp)
  mov    %r8,0x18(%rsp)
  mov    %r9,0x20(%rsp)
  nopl   0x0(%rax,%rax,1)
L127:
  mov    $0x5,%edx
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L198
L166:
  cmpq   $0x0,(%rbx)
  je     L242
  mov    %r13,%rsi
  lea    D98(%rip),%rdi
  call   <syntax@plt>
L242:
  mov    %r13,(%rbx)
  jmp    L325
  nop
L23:
  test   %dil,%dil
  je     L16
  add    $0x1,%r13
L325:
  movzbl 0x0(%r13),%edi
  call   <isspace@plt>
  movzbl 0x0(%r13),%edi
  test   %rax,%rax
  je     L23
  call   <isspace@plt>
  test   %rax,%rax
  je     L259
  nopw   0x0(%rax,%rax,1)
L119:
  movzbl 0x1(%r13),%edi
  add    $0x1,%r13
L16:
  call   <isspace@plt>
  test   %rax,%rax
  jne    L119
L259:
  cmpb   $0x0,0x0(%r13)
  jne    L127
L147:
  add    $0x38,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L198:
  mov    $0x4,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L166
  mov    $0x6,%edx
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L166
  mov    $0x4,%edx
  mov    %r15,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L166
  mov    $0x5,%edx
  lea    D75(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L166
  mov    $0x4,%edx
  lea    D124(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L166
  mov    $0xb,%edx
  lea    D5(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L182
  mov    0x70(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L236
  mov    %r13,%rsi
  lea    D147(%rip),%rdi
  call   <syntax@plt>
L236:
  lea    0xb(%r13),%rdx
  mov    %rdx,%rdi
  mov    %rdx,0x28(%rsp)
  call   <atoi@plt>
  mov    0x28(%rsp),%rdx
  sub    $0x4,%eax
  cmp    $0xfb,%eax
  ja     L38
  mov    0x70(%rsp),%rax
  mov    %rdx,(%rax)
  jmp    L325
L182:
  mov    $0x7,%edx
  lea    D38(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L118
L82:
  mov    0x8(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L233
  mov    %r13,%rsi
  lea    D74(%rip),%rdi
  call   <syntax@plt>
L233:
  xor    %eax,%eax
  cmpb   $0x3d,0x1(%r13)
  mov    0x8(%rsp),%rcx
  setne  %al
  lea    0x2(%rax,%rax,4),%rax
  add    %r13,%rax
  mov    %rax,(%rcx)
  jmp    L325
L118:
  mov    $0x2,%edx
  lea    D32(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L82
  mov    $0x7,%edx
  lea    D94(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L197
  mov    0x20(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L234
  mov    %r13,%rsi
  lea    D21(%rip),%rdi
  call   <syntax@plt>
L234:
  mov    0x20(%rsp),%rcx
  lea    0x7(%r13),%rax
  mov    %rax,(%rcx)
  jmp    L325
L197:
  mov    $0xb,%edx
  lea    D50(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L94
  mov    0x10(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L302
  mov    %r13,%rsi
  lea    D119(%rip),%rdi
  call   <syntax@plt>
L302:
  mov    0x10(%rsp),%rcx
  lea    0xb(%r13),%rax
  mov    %rax,(%rcx)
  jmp    L325
L94:
  mov    $0xb,%edx
  lea    D187(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L98
  mov    0x18(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L125
  mov    %r13,%rsi
  lea    D130(%rip),%rdi
  call   <syntax@plt>
L125:
  mov    0x18(%rsp),%rcx
  lea    0xb(%r13),%rax
  mov    %rax,(%rcx)
  jmp    L325
L98:
  mov    $0xa,%edx
  lea    D117(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L325
  mov    $0x2,%edx
  lea    D140(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L325
  jmp    L147
  nop
L38:
  mov    %r13,%rsi
  lea    D174(%rip),%rdi
  call   <syntax@plt>
  jmp    L325
```

tool_calls: name: unpack_data
arguments: tag: D184
datatype: string
name: unpack_data
arguments: tag: D84
datatype: string
name: unpack_data
arguments: tag: D107
datatype: string
name: unpack_data
arguments: tag: D160
datatype: string
name: unpack_data
arguments: tag: D98
datatype: string
name: unpack_data
arguments: tag: D75
datatype: string
name: unpack_data
arguments: tag: D124
datatype: string
name: unpack_data
arguments: tag: D5
datatype: string
name: unpack_data
arguments: tag: D147
datatype: string
name: unpack_data
arguments: tag: D38
datatype: string
name: unpack_data
arguments: tag: D74
datatype: string
name: unpack_data
arguments: tag: D32
datatype: string
name: unpack_data
arguments: tag: D94
datatype: string
name: unpack_data
arguments: tag: D21
datatype: string
name: unpack_data
arguments: tag: D50
datatype: string
name: unpack_data
arguments: tag: D119
datatype: string
name: unpack_data
arguments: tag: D187
datatype: string
name: unpack_data
arguments: tag: D130
datatype: string
name: unpack_data
arguments: tag: D117
datatype: string
name: unpack_data
arguments: tag: D140
datatype: string
name: unpack_data
arguments: tag: D174
datatype: string

tool: D184: alto

tool: D84: treble

tool: D107: bass

tool: D160: clef=

tool: D98: Double clef name

tool: D75: tenor

tool: D124: perc

tool: D5: microscale=

tool: D147: Double microscale=

tool: D38: middle=

tool: D74: Double clef middle

tool: D32: m=

tool: D94: octave=

tool: D21: Double octave=

tool: D50: stafflines=

tool: D119: Double stafflines

tool: D187: staffscale=

tool: D130: Double staffscale

tool: D117: transpose=

tool: D140: t=

tool: D174: Invalid value in microscale=

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