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

```asm
<read_frametime>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  movq   $0x0,-0x8(%rbp)
  jmp    L35
L32:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x46,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x3(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6d,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x5(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x6(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x54,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x7(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x69,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6d,%al
  jne    L115
  mov    -0x8(%rbp),%rax
  lea    0x9(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  je     L73
L115:
  addq   $0x1,-0x8(%rbp)
L35:
  mov    -0x20(%rbp),%rax
  sub    $0xa,%rax
  cmp    %rax,-0x8(%rbp)
  jb     L32
  jmp    L58
L73:
  nop
  jmp    L58
L166:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jbe    L196
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jbe    L181
L196:
  addq   $0x1,-0x8(%rbp)
L58:
  mov    -0x8(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jb     L166
  jmp    L92
L181:
  nop
L92:
  mov    -0x8(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jb     L188
  mov    $0xffffffff,%eax
  jmp    L59
L188:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rdi
  call   <ufloatstr2long@plt>
  mov    -0x28(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    $0x0,%eax
L59:
  leave
  ret
```

assistant: ```c
int read_frametime(unsigned char *bvhdata, unsigned long bvhdata_size, unsigned long *frametime) {
  unsigned long i;
  for (i = 0; i < (bvhdata_size - 10); i++) {
    if ((bvhdata[i] == 'F') && (bvhdata[i + 1] == 'r') && (bvhdata[i + 2] == 'a') && (bvhdata[i + 3] == 'm') && (bvhdata[i + 4] == 'e') && (bvhdata[i + 5] == ' ') && (bvhdata[i + 6] == 'T') && (bvhdata[i + 7] == 'i') && (bvhdata[i + 8] == 'm') && (bvhdata[i + 9] == 'e'))
      break;
  }
  for (; i < bvhdata_size; i++) {
    if ((bvhdata[i] >= '0') && (bvhdata[i] <= '9'))
      break;
  }
  if (i >= bvhdata_size)
    return -1;
  *frametime = ufloatstr2long(&bvhdata[i]);
  return 0;
}
```