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

```asm
<parse_timespec>:
  endbr64
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  movsd  D88(%rip),%xmm0
  test   %rdi,%rdi
  je     L83
  mov    %rdi,%rbx
  mov    %rsp,%rdx
  lea    D167(%rip),%rsi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L44
  mov    %rsp,%rdx
  lea    D124(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L116
  mov    %rsp,%rdx
  lea    D45(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L97
  mov    %rsp,%rdx
  lea    D3(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L141
  mov    %rsp,%rdx
  lea    D164(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L100
  mov    %rsp,%rdx
  lea    D21(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L26
  mov    %rsp,%rdx
  lea    D8(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L20
  mov    %rsp,%rdx
  lea    D33(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L168
  mov    %rsp,%rdx
  lea    D91(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L34
  mov    %rbx,%rdi
  call   <parse_npt@plt>
  jmp    L83
L44:
  mov    %rsp,%rdi
  call   <parse_npt@plt>
L83:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L76
  add    $0x20,%rsp
  pop    %rbx
  ret
L116:
  mov    %rsp,%rdi
  movsd  D154(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L97:
  mov    %rsp,%rdi
  movsd  D113(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L141:
  mov    %rsp,%rdi
  movsd  D23(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L100:
  mov    %rsp,%rdi
  movsd  D42(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L26:
  mov    %rsp,%rdi
  movsd  D79(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L20:
  mov    %rsp,%rdi
  movsd  D161(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L168:
  mov    %rsp,%rdi
  movsd  D66(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L34:
  mov    %rsp,%rdi
  movsd  D138(%rip),%xmm0
  call   <parse_smpte@plt>
  jmp    L83
L76:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D88
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D167
type_infered: string
name: disassemble_data
arguments: data_tag: D124
type_infered: string
name: disassemble_data
arguments: data_tag: D45
type_infered: string
name: disassemble_data
arguments: data_tag: D3
type_infered: string
name: disassemble_data
arguments: data_tag: D164
type_infered: string
name: disassemble_data
arguments: data_tag: D21
type_infered: string
name: disassemble_data
arguments: data_tag: D8
type_infered: string
name: disassemble_data
arguments: data_tag: D33
type_infered: string
name: disassemble_data
arguments: data_tag: D91
type_infered: string
name: disassemble_data
arguments: data_tag: D154
type_infered: f64
name: disassemble_data
arguments: data_tag: D113
type_infered: f64
name: disassemble_data
arguments: data_tag: D23
type_infered: f64
name: disassemble_data
arguments: data_tag: D42
type_infered: f64
name: disassemble_data
arguments: data_tag: D79
type_infered: f64
name: disassemble_data
arguments: data_tag: D161
type_infered: f64
name: disassemble_data
arguments: data_tag: D66
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D138
type_infered: f64

tool: {"D88": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

tool: D167: npt:%16s

tool: D124: smpte-24:%16s

tool: D45: smpte-24-drop:%16s

tool: D3: smpte-25:%16s

tool: D164: smpte-30:%16s

tool: D21: smpte-30-drop:%16s

tool: D8: smpte-50:%16s

tool: D33: smpte-60:%16s

tool: D91: smpte-60-drop:%16s

tool: D154: 24

tool: D113: 23.976

tool: D23: 25

tool: D42: 30

tool: D79: 29.97

tool: D161: 50

tool: {"D66": [0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x40]}

tool: D138: 59.94

assistant: ```c
double parse_timespec(const char *str) {
  char timespec[16];
  if (str == NULL)
    return -1.0;
  if (sscanf(str, "npt:%16s", timespec) == 1) {
    return parse_npt(timespec);
  }
  if (sscanf(str, "smpte-24:%16s", timespec) == 1) {
    return parse_smpte(timespec, 24.0);
  }
  if (sscanf(str, "smpte-24-drop:%16s", timespec) == 1) {
    return parse_smpte(timespec, 23.976);
  }
  if (sscanf(str, "smpte-25:%16s", timespec) == 1) {
    return parse_smpte(timespec, 25.0);
  }
  if (sscanf(str, "smpte-30:%16s", timespec) == 1) {
    return parse_smpte(timespec, 30.0);
  }
  if (sscanf(str, "smpte-30-drop:%16s", timespec) == 1) {
    return parse_smpte(timespec, 29.97);
  }
  if (sscanf(str, "smpte-50:%16s", timespec) == 1) {
    return parse_smpte(timespec, 50.0);
  }
  if (sscanf(str, "smpte-60:%16s", timespec) == 1) {
    return parse_smpte(timespec, 60);
  }
  if (sscanf(str, "smpte-60-drop:%16s", timespec) == 1) {
    return parse_smpte(timespec, 59.94);
  }
  return parse_npt(str);
}
```