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

```asm
<parse_for_recipients>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  movq   $0x0,-0x8(%rbp)
  movl   $0x0,-0x1c(%rbp)
  movq   $0x0,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L243
L128:
  cmpl   $0x7,-0x1c(%rbp)
  ja     L509
  mov    -0x1c(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D19(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D19(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0xa,%eax
  je     L108
  cmp    $0xa,%eax
  jl     L521
  cmp    $0x74,%eax
  jg     L521
  cmp    $0x42,%eax
  jl     L521
  sub    $0x42,%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  movabs $0x100000001,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L19
  movabs $0x200000002,%rdx
  and    %rax,%rdx
  test   %rdx,%rdx
  setne  %dl
  test   %dl,%dl
  jne    L85
  movabs $0x4000000040000,%rdx
  and    %rdx,%rax
  test   %rax,%rax
  setne  %al
  test   %al,%al
  je     L521
  movl   $0x2,-0x1c(%rbp)
  jmp    L499
L85:
  movl   $0x3,-0x1c(%rbp)
  jmp    L499
L19:
  movl   $0x4,-0x1c(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L499
L521:
  movl   $0x1,-0x1c(%rbp)
  nop
L499:
  jmp    L509
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0xa,%eax
  jne    L150
  movl   $0x0,-0x1c(%rbp)
  nop
  jmp    L150
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x6f,%eax
  je     L512
  cmp    $0x6f,%eax
  jg     L562
  cmp    $0xa,%eax
  je     L105
  cmp    $0x4f,%eax
  je     L512
  jmp    L562
L105:
  movl   $0x0,-0x1c(%rbp)
  jmp    L474
L512:
  movl   $0x6,-0x1c(%rbp)
  jmp    L474
L562:
  movl   $0x1,-0x1c(%rbp)
  nop
L474:
  jmp    L509
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x63,%eax
  je     L133
  cmp    $0x63,%eax
  jg     L155
  cmp    $0xa,%eax
  je     L332
  cmp    $0x43,%eax
  je     L133
  jmp    L155
L332:
  movl   $0x0,-0x1c(%rbp)
  jmp    L207
L133:
  movl   $0x6,-0x1c(%rbp)
  jmp    L207
L155:
  movl   $0x1,-0x1c(%rbp)
  nop
L207:
  jmp    L509
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x63,%eax
  je     L317
  cmp    $0x63,%eax
  jg     L470
  cmp    $0xa,%eax
  je     L109
  cmp    $0x43,%eax
  je     L317
  jmp    L470
L109:
  movl   $0x0,-0x1c(%rbp)
  movq   $0x0,-0x10(%rbp)
  jmp    L296
L317:
  movl   $0x5,-0x1c(%rbp)
  jmp    L296
L470:
  movl   $0x1,-0x1c(%rbp)
  movq   $0x0,-0x10(%rbp)
  nop
L296:
  jmp    L509
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x63,%eax
  je     L578
  cmp    $0x63,%eax
  jg     L158
  cmp    $0xa,%eax
  je     L98
  cmp    $0x43,%eax
  je     L578
  jmp    L158
L98:
  movl   $0x0,-0x1c(%rbp)
  movq   $0x0,-0x10(%rbp)
  jmp    L602
L578:
  movl   $0x6,-0x1c(%rbp)
  jmp    L602
L158:
  movl   $0x1,-0x1c(%rbp)
  movq   $0x0,-0x10(%rbp)
  nop
L602:
  jmp    L509
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0xa,%eax
  je     L83
  cmp    $0x3a,%eax
  je     L410
  jmp    L231
L83:
  movl   $0x0,-0x1c(%rbp)
  movq   $0x0,-0x10(%rbp)
  jmp    L358
L410:
  movl   $0x7,-0x1c(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L358
L231:
  movl   $0x1,-0x1c(%rbp)
  movq   $0x0,-0x10(%rbp)
  nop
L358:
  jmp    L509
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0xa,%eax
  je     L529
  cmp    $0x2c,%eax
  je     L54
  jmp    L509
L529:
  mov    -0x18(%rbp),%rax
  sub    -0x8(%rbp),%rax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <add_recipient@plt>
  movl   $0x0,-0x1c(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  je     L594
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x10(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x10(%rbp),%rax
  sub    $0x1,%rax
  mov    %rax,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  jmp    L594
L54:
  mov    -0x18(%rbp),%rax
  sub    -0x8(%rbp),%rax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <add_recipient@plt>
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x8(%rbp)
  jmp    L192
L594:
  nop
L192:
  jmp    L509
L150:
  nop
L509:
  addq   $0x1,-0x18(%rbp)
L243:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L128
  jmp    L251
L108:
  nop
L251:
  leave
  ret
```

assistant: ```c
void parse_for_recipients(char *message) {
  int state;
  char *cp;
  char *bcc;
  char *recip = (char *)0;
  state = 0;
  bcc = (char *)0;
  for (cp = message; *cp != '\0'; ++cp) {
    switch (state) {
    case 0:
      switch (*cp) {
      case '\n':
        return;
      case 'T':
      case 't':
        state = 2;
        break;
      case 'C':
      case 'c':
        state = 3;
        break;
      case 'B':
      case 'b':
        state = 4;
        bcc = cp;
        break;
      default:
        state = 1;
        break;
      }
      break;
    case 1:
      switch (*cp) {
      case '\n':
        state = 0;
        break;
      }
      break;
    case 2:
      switch (*cp) {
      case '\n':
        state = 0;
        break;
      case 'O':
      case 'o':
        state = 6;
        break;
      default:
        state = 1;
        break;
      }
      break;
    case 3:
      switch (*cp) {
      case '\n':
        state = 0;
        break;
      case 'C':
      case 'c':
        state = 6;
        break;
      default:
        state = 1;
        break;
      }
      break;
    case 4:
      switch (*cp) {
      case '\n':
        state = 0;
        bcc = (char *)0;
        break;
      case 'C':
      case 'c':
        state = 5;
        break;
      default:
        state = 1;
        bcc = (char *)0;
        break;
      }
      break;
    case 5:
      switch (*cp) {
      case '\n':
        state = 0;
        bcc = (char *)0;
        break;
      case 'C':
      case 'c':
        state = 6;
        break;
      default:
        state = 1;
        bcc = (char *)0;
        break;
      }
      break;
    case 6:
      switch (*cp) {
      case '\n':
        state = 0;
        bcc = (char *)0;
        break;
      case ':':
        state = 7;
        recip = cp + 1;
        break;
      default:
        state = 1;
        bcc = (char *)0;
        break;
      }
      break;
    case 7:
      switch (*cp) {
      case '\n':
        add_recipient(recip, (cp - recip));
        state = 0;
        if (bcc != (char *)0) {
          (void)strcpy(bcc, cp + 1);
          cp = bcc - 1;
          bcc = (char *)0;
        }
        break;
      case ',':
        add_recipient(recip, (cp - recip));
        recip = cp + 1;
        break;
      }
      break;
    }
  }
}
```