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

```asm
<parse_bool>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  movq   $0x0,-0x8(%rbp)
  jmp    L486
L607:
  addq   $0x1,-0x8(%rbp)
L486:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L607
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L607
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x74,%al
  jne    L1064
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  jne    L434
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x75,%al
  jne    L434
  mov    -0x8(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L434
  addq   $0x3,-0x8(%rbp)
  jmp    L434
L720:
  addq   $0x1,-0x8(%rbp)
L434:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L720
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L720
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L819
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L857
L819:
  mov    $0x1,%eax
  jmp    L514
L857:
  mov    $0xffffffff,%eax
  jmp    L514
L1064:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x54,%al
  jne    L166
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  jne    L629
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x75,%al
  jne    L629
  mov    -0x8(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L629
  addq   $0x3,-0x8(%rbp)
  jmp    L731
L629:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x52,%al
  jne    L758
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x55,%al
  jne    L758
  mov    -0x8(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x45,%al
  jne    L758
  addq   $0x3,-0x8(%rbp)
L731:
  jmp    L758
L138:
  addq   $0x1,-0x8(%rbp)
L758:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L138
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L138
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L1011
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L723
L1011:
  mov    $0x1,%eax
  jmp    L514
L723:
  mov    $0xffffffff,%eax
  jmp    L514
L166:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x79,%al
  jne    L183
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L249
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x73,%al
  jne    L249
  addq   $0x2,-0x8(%rbp)
  jmp    L249
L837:
  addq   $0x1,-0x8(%rbp)
L249:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L837
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L837
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L678
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L450
L678:
  mov    $0x1,%eax
  jmp    L514
L450:
  mov    $0xffffffff,%eax
  jmp    L514
L183:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x59,%al
  jne    L575
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L1126
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x73,%al
  jne    L1126
  addq   $0x2,-0x8(%rbp)
  jmp    L1026
L1126:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x45,%al
  jne    L205
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x53,%al
  jne    L205
  addq   $0x2,-0x8(%rbp)
L1026:
  jmp    L205
L331:
  addq   $0x1,-0x8(%rbp)
L205:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L331
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L331
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L694
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L406
L694:
  mov    $0x1,%eax
  jmp    L514
L406:
  mov    $0xffffffff,%eax
  jmp    L514
L575:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x31,%al
  jne    L473
  addq   $0x1,-0x8(%rbp)
  jmp    L316
L835:
  addq   $0x1,-0x8(%rbp)
L316:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L835
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L835
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L787
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L541
L787:
  mov    $0x1,%eax
  jmp    L514
L541:
  mov    $0xffffffff,%eax
  jmp    L514
L473:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x66,%al
  jne    L82
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L471
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6c,%al
  jne    L471
  mov    -0x8(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x73,%al
  jne    L471
  mov    -0x8(%rbp),%rax
  lea    0x3(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L471
  addq   $0x4,-0x8(%rbp)
  jmp    L471
L234:
  addq   $0x1,-0x8(%rbp)
L471:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L234
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L234
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L150
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L952
L150:
  mov    $0x0,%eax
  jmp    L514
L952:
  mov    $0xffffffff,%eax
  jmp    L514
L82:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x46,%al
  jne    L429
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L919
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6c,%al
  jne    L919
  mov    -0x8(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x73,%al
  jne    L919
  mov    -0x8(%rbp),%rax
  lea    0x3(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L919
  addq   $0x4,-0x8(%rbp)
  jmp    L254
L919:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x41,%al
  jne    L1135
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x4c,%al
  jne    L1135
  mov    -0x8(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x53,%al
  jne    L1135
  mov    -0x8(%rbp),%rax
  lea    0x3(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x45,%al
  jne    L1135
  addq   $0x4,-0x8(%rbp)
L254:
  jmp    L1135
L160:
  addq   $0x1,-0x8(%rbp)
L1135:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L160
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L160
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L679
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L705
L679:
  mov    $0x0,%eax
  jmp    L514
L705:
  mov    $0xffffffff,%eax
  jmp    L514
L429:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6e,%al
  jne    L227
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6f,%al
  jne    L120
  addq   $0x1,-0x8(%rbp)
  jmp    L120
L973:
  addq   $0x1,-0x8(%rbp)
L120:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L973
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L973
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L368
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L662
L368:
  mov    $0x0,%eax
  jmp    L514
L662:
  mov    $0xffffffff,%eax
  jmp    L514
L227:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x4e,%al
  jne    L241
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6f,%al
  je     L680
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x4f,%al
  jne    L188
L680:
  addq   $0x1,-0x8(%rbp)
  jmp    L188
L636:
  addq   $0x1,-0x8(%rbp)
L188:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L636
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L636
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L27
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L911
L27:
  mov    $0x0,%eax
  jmp    L514
L911:
  mov    $0xffffffff,%eax
  jmp    L514
L241:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  jne    L88
  addq   $0x1,-0x8(%rbp)
  jmp    L390
L1066:
  addq   $0x1,-0x8(%rbp)
L390:
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L1066
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L1066
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L94
  mov    -0x18(%rbp),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L717
L94:
  mov    $0x0,%eax
  jmp    L514
L717:
  mov    $0xffffffff,%eax
  jmp    L514
L88:
  mov    $0xffffffff,%eax
L514:
  pop    %rbp
  ret
```

assistant: ```c
int parse_bool(char *source) {
  size_t i = 0;
  while (source[i] == ' ' || source[i] == '\t') {
    i++;
  }
  if (source[i] == 't') {
    i++;
    if (source[i] == 'r' && source[i + 1] == 'u' && source[i + 2] == 'e') {
      i += 3;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 1;
    } else {
      return -1;
    }
  } else if (source[i] == 'T') {
    i++;
    if (source[i] == 'r' && source[i + 1] == 'u' && source[i + 2] == 'e') {
      i += 3;
    } else if (source[i] == 'R' && source[i + 1] == 'U' && source[i + 2] == 'E') {
      i += 3;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 1;
    } else {
      return -1;
    }
  } else if (source[i] == 'y') {
    i++;
    if (source[i] == 'e' && source[i + 1] == 's') {
      i += 2;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 1;
    } else {
      return -1;
    }
  } else if (source[i] == 'Y') {
    i++;
    if (source[i] == 'e' && source[i + 1] == 's') {
      i += 2;
    } else if (source[i] == 'E' && source[i + 1] == 'S') {
      i += 2;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 1;
    } else {
      return -1;
    }
  } else if (source[i] == '1') {
    i++;
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 1;
    } else {
      return -1;
    }
  } else if (source[i] == 'f') {
    i++;
    if (source[i] == 'a' && source[i + 1] == 'l' && source[i + 2] == 's' && source[i + 3] == 'e') {
      i += 4;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 0;
    } else {
      return -1;
    }
  } else if (source[i] == 'F') {
    i++;
    if (source[i] == 'a' && source[i + 1] == 'l' && source[i + 2] == 's' && source[i + 3] == 'e') {
      i += 4;
    } else if (source[i] == 'A' && source[i + 1] == 'L' && source[i + 2] == 'S' && source[i + 3] == 'E') {
      i += 4;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 0;
    } else {
      return -1;
    }
  } else if (source[i] == 'n') {
    i++;
    if (source[i] == 'o') {
      i++;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 0;
    } else {
      return -1;
    }
  } else if (source[i] == 'N') {
    i++;
    if (source[i] == 'o' || source[i] == 'O') {
      i++;
    }
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 0;
    } else {
      return -1;
    }
  } else if (source[i] == '0') {
    i++;
    while (source[i] == ' ' || source[i] == '\t') {
      i++;
    }
    if (source[i] == '\n' || source[i] == '\0') {
      return 0;
    } else {
      return -1;
    }
  } else {
    return -1;
  }
}
```