user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<parse_extra>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  mov    %r9,-0x40(%rbp)
L152:
  mov    -0x18(%rbp),%rax
  mov    $0x5,%edx
  lea    D44(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L203
  mov    -0x18(%rbp),%rax
  mov    $0x4,%edx
  lea    D130(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L203
  mov    -0x18(%rbp),%rax
  mov    $0x6,%edx
  lea    D8(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L203
  mov    -0x18(%rbp),%rax
  mov    $0x4,%edx
  lea    D170(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L203
  mov    -0x18(%rbp),%rax
  mov    $0x5,%edx
  lea    D60(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L203
  mov    -0x18(%rbp),%rax
  mov    $0x4,%edx
  lea    D126(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L343
L203:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L297
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D203(%rip),%rax
  mov    %rax,%rdi
  call   <syntax@plt>
L297:
  mov    -0x20(%rbp),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rdx,(%rax)
  jmp    L85
L343:
  mov    -0x18(%rbp),%rax
  mov    $0xb,%edx
  lea    D150(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L197
  mov    0x10(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L68
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D152(%rip),%rax
  mov    %rax,%rdi
  call   <syntax@plt>
L68:
  mov    -0x18(%rbp),%rax
  add    $0xb,%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x4(%rbp)
  cmpl   $0x3,-0x4(%rbp)
  jle    L284
  cmpl   $0xff,-0x4(%rbp)
  jle    L132
L284:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D42(%rip),%rax
  mov    %rax,%rdi
  call   <syntax@plt>
  jmp    L85
L132:
  mov    -0x18(%rbp),%rax
  lea    0xb(%rax),%rdx
  mov    0x10(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L256
L197:
  mov    -0x18(%rbp),%rax
  mov    $0x7,%edx
  lea    D29(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L72
  mov    -0x18(%rbp),%rax
  mov    $0x2,%edx
  lea    D66(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L252
L72:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L16
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D175(%rip),%rax
  mov    %rax,%rdi
  call   <syntax@plt>
L16:
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x3d,%al
  jne    L374
  mov    $0x2,%edx
  jmp    L80
L374:
  mov    $0x7,%edx
L80:
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L85
L252:
  mov    -0x18(%rbp),%rax
  mov    $0x7,%edx
  lea    D78(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L75
  mov    -0x40(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L223
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D117(%rip),%rax
  mov    %rax,%rdi
  call   <syntax@plt>
L223:
  mov    -0x18(%rbp),%rax
  lea    0x7(%rax),%rdx
  mov    -0x40(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L256
L75:
  mov    -0x18(%rbp),%rax
  mov    $0xb,%edx
  lea    D97(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L140
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L116
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D69(%rip),%rax
  mov    %rax,%rdi
  call   <syntax@plt>
L116:
  mov    -0x18(%rbp),%rax
  lea    0xb(%rax),%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L256
L140:
  mov    -0x18(%rbp),%rax
  mov    $0xb,%edx
  lea    D83(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L363
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L243
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D162(%rip),%rax
  mov    %rax,%rdi
  call   <syntax@plt>
L243:
  mov    -0x18(%rbp),%rax
  lea    0xb(%rax),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L256
L363:
  mov    -0x18(%rbp),%rax
  mov    $0xa,%edx
  lea    D201(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L256
  mov    -0x18(%rbp),%rax
  mov    $0x2,%edx
  lea    D0(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L86
L85:
  jmp    L256
L163:
  addq   $0x1,-0x18(%rbp)
L256:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L200
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L163
  jmp    L200
L204:
  addq   $0x1,-0x18(%rbp)
L200:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L204
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L95
  jmp    L152
L86:
  nop
  jmp    L344
L95:
  nop
L344:
  mov    -0x18(%rbp),%rax
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D44
type_infered: string
name: unpack_data
arguments: data_label: D130
type_infered: string
name: unpack_data
arguments: data_label: D8
type_infered: string
name: unpack_data
arguments: data_label: D170
type_infered: string
name: unpack_data
arguments: data_label: D60
type_infered: string
name: unpack_data
arguments: data_label: D126
type_infered: string
name: unpack_data
arguments: data_label: D203
type_infered: string
name: unpack_data
arguments: data_label: D150
type_infered: string
name: unpack_data
arguments: data_label: D152
type_infered: string
name: unpack_data
arguments: data_label: D42
type_infered: string
name: unpack_data
arguments: data_label: D29
type_infered: string
name: unpack_data
arguments: data_label: D66
type_infered: string
name: unpack_data
arguments: data_label: D175
type_infered: string
name: unpack_data
arguments: data_label: D78
type_infered: string
name: unpack_data
arguments: data_label: D117
type_infered: string
name: unpack_data
arguments: data_label: D97
type_infered: string
name: unpack_data
arguments: data_label: D69
type_infered: string
name: unpack_data
arguments: data_label: D83
type_infered: string
name: unpack_data
arguments: data_label: D162
type_infered: string
name: unpack_data
arguments: data_label: D201
type_infered: string
name: unpack_data
arguments: data_label: D0
type_infered: string

tool: D44: clef=

tool: D130: bass

tool: D8: treble

tool: D170: alto

tool: D60: tenor

tool: D126: perc

tool: D203: Double clef name

tool: D150: microscale=

tool: D152: Double microscale=

tool: D42: Invalid value in microscale=

tool: D29: middle=

tool: D66: m=

tool: D175: Double clef middle

tool: D78: octave=

tool: D117: Double octave=

tool: D97: stafflines=

tool: D69: Double stafflines

tool: D83: staffscale=

tool: D162: Double staffscale

tool: D201: transpose=

tool: D0: 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;
}
```