user: 请从给定的汇编指令推导出C源代码:

```asm
<clef_skip>:
  endbr64
  push   %r15
  lea    D137(%rip),%r15
  push   %r14
  lea    D121(%rip),%r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  lea    D62(%rip),%r12
  push   %rbp
  lea    D12(%rip),%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x28,%rsp
  mov    %rdx,0x8(%rsp)
  mov    %rcx,0x10(%rsp)
  mov    %r8,0x18(%rsp)
  nopl   0x0(%rax,%rax,1)
L70:
  mov    $0x5,%edx
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L35
L138:
  cmpq   $0x0,(%rbx)
  je     L186
  mov    %r13,%rsi
  lea    D152(%rip),%rdi
  call   <syntax@plt>
L186:
  mov    %r13,(%rbx)
  jmp    L256
  nopl   0x0(%rax,%rax,1)
L255:
  cmpb   $0x0,0x0(%r13)
  je     L19
  add    $0x1,%r13
L256:
  movsbl 0x0(%r13),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L255
  movsbl 0x0(%r13),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L63
  nopl   0x0(%rax)
L13:
  add    $0x1,%r13
L19:
  movsbl 0x0(%r13),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L13
L63:
  cmpb   $0x0,0x0(%r13)
  jne    L70
L245:
  add    $0x28,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L35:
  mov    $0x4,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L138
  mov    $0x6,%edx
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L138
  mov    $0x4,%edx
  mov    %r15,%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L138
  mov    $0x5,%edx
  lea    D7(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L138
  mov    $0x4,%edx
  lea    D111(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L138
  mov    $0x7,%edx
  lea    D25(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L50
L62:
  mov    0x8(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L159
  mov    %r13,%rsi
  lea    D18(%rip),%rdi
  call   <syntax@plt>
L159:
  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    L256
L50:
  mov    $0x2,%edx
  lea    D50(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L62
  mov    $0xb,%edx
  lea    D35(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L170
  mov    0x10(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L156
  mov    %r13,%rsi
  lea    D94(%rip),%rdi
  call   <syntax@plt>
L156:
  mov    0x10(%rsp),%rcx
  lea    0xb(%r13),%rax
  mov    %rax,(%rcx)
  jmp    L256
L170:
  mov    $0xb,%edx
  lea    D30(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L171
  mov    0x18(%rsp),%rax
  cmpq   $0x0,(%rax)
  je     L72
  mov    %r13,%rsi
  lea    D159(%rip),%rdi
  call   <syntax@plt>
L72:
  mov    0x18(%rsp),%rcx
  lea    0xb(%r13),%rax
  mov    %rax,(%rcx)
  jmp    L256
L171:
  mov    $0xa,%edx
  lea    D11(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L256
  mov    $0x2,%edx
  lea    D39(%rip),%rsi
  mov    %r13,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L256
  jmp    L245
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D137
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D121
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D62
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D12
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D152
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D7
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D111
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D25
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D18
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D50
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D35
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D94
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D30
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D159
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D11
type_guessed: string
name: extract_symbolic_data
arguments: data_tag: D39
type_guessed: string

tool: D137: alto

tool: D121: treble

tool: D62: bass

tool: D12: clef=

tool: D152: Double clef name

tool: D7: tenor

tool: D111: perc

tool: D25: middle=

tool: D18: Double clef middle

tool: D50: m=

tool: D35: stafflines=

tool: D94: Double clef stafflines

tool: D30: staffscale=

tool: D159: Double clef staffscale

tool: D11: transpose=

tool: D39: t=

assistant: ```c
char *clef_skip(char *p, char **p_name, char **p_middle, char **p_lines, char **p_scale) {
  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 != 0)
        syntax("Double clef name", p);
      *p_name = p;
    } else if (strncmp(p, "middle=", 7) == 0 || strncmp(p, "m=", 2) == 0) {
      if (*p_middle != 0)
        syntax("Double clef middle", p);
      *p_middle = p + (p[1] == '=' ? 2 : 7);
    } else if (strncmp(p, "stafflines=", 11) == 0) {
      if (*p_lines != 0)
        syntax("Double clef stafflines", p);
      *p_lines = p + 11;
    } else if (strncmp(p, "staffscale=", 11) == 0) {
      if (*p_scale != 0)
        syntax("Double clef staffscale", p);
      *p_scale = p + 11;
    } else if (strncmp(p, "transpose=", 10) == 0 || strncmp(p, "t=", 2) == 0) {
      ;
    } else
      break;
    while (!isspace((unsigned)*p) && *p != '\0')
      p++;
    while (isspace((unsigned)*p))
      p++;
    if (*p == '\0')
      break;
  }
  return p;
}
```