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

```asm
<S_check_flags>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %esi,-0x38(%rbp)
  mov    %rdx,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x38(%rbp),%eax
  not    %eax
  and    -0x34(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  je     L252
  mov    -0x24(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L34
  lea    -0x20(%rbp),%rax
  lea    D29(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L34:
  mov    -0x24(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L145
  lea    -0x20(%rbp),%rax
  lea    D59(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L145:
  mov    -0x24(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L23
  lea    -0x20(%rbp),%rax
  lea    D67(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L23:
  mov    -0x24(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L92
  lea    -0x20(%rbp),%rax
  lea    D55(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L92:
  mov    -0x24(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L132
  lea    -0x20(%rbp),%rax
  lea    D21(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L132:
  mov    -0x24(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L102
  lea    -0x20(%rbp),%rax
  lea    D83(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L102:
  mov    -0x24(%rbp),%eax
  and    $0x80,%eax
  test   %eax,%eax
  je     L48
  lea    -0x20(%rbp),%rax
  lea    D78(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L48:
  mov    -0x24(%rbp),%eax
  and    $0x100,%eax
  test   %eax,%eax
  je     L124
  lea    -0x20(%rbp),%rax
  lea    D30(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L124:
  mov    -0x24(%rbp),%eax
  and    $0x200,%eax
  test   %eax,%eax
  je     L72
  lea    -0x20(%rbp),%rax
  lea    D75(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L72:
  mov    -0x24(%rbp),%eax
  and    $0x400,%eax
  test   %eax,%eax
  je     L173
  lea    -0x20(%rbp),%rax
  lea    D77(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L173:
  mov    -0x24(%rbp),%eax
  and    $0x800,%eax
  test   %eax,%eax
  je     L214
  lea    -0x20(%rbp),%rax
  lea    D118(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L214:
  mov    -0x24(%rbp),%eax
  and    $0x1000,%eax
  test   %eax,%eax
  je     L13
  lea    -0x20(%rbp),%rax
  lea    D42(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  jmp    L139
L13:
  mov    -0x24(%rbp),%eax
  mov    %eax,%esi
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <CFCUtil_die@plt>
L139:
  lea    -0x20(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  mov    %rax,%rsi
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <CFCUtil_die@plt>
L252:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L63
  call   <__stack_chk_fail@plt>
L63:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D29
type_infered: string
name: parse_data
arguments: tag: D59
type_infered: string
name: parse_data
arguments: tag: D67
type_infered: string
name: parse_data
arguments: tag: D55
type_infered: string
name: parse_data
arguments: tag: D21
type_infered: string
name: parse_data
arguments: tag: D83
type_infered: string
name: parse_data
arguments: tag: D78
type_infered: string
name: parse_data
arguments: tag: D30
type_infered: string
name: parse_data
arguments: tag: D75
type_infered: string
name: parse_data
arguments: tag: D77
type_infered: string
name: parse_data
arguments: tag: D118
type_infered: string
name: parse_data
arguments: tag: D42
type_infered: string
name: parse_data
arguments: tag: D76
type_infered: string
name: parse_data
arguments: tag: D12
type_infered: string

tool: D29: CONST

tool: D59: NULLABLE

tool: D67: INCREMENTED

tool: D55: DECREMENTED

tool: D21: OBJECT

tool: D83: PRIMITIVE

tool: D78: INTEGER

tool: D30: FLOATING

tool: D75: STRING_TYPE

tool: D77: VA_LIST

tool: D118: ARBITRARY

tool: D42: COMPOSITE

tool: D76: Unknown flags: %d

tool: D12: Bad flag for type %s: %s

assistant: ```c
void S_check_flags(int supplied, int acceptable, const char *type_name) {
  int bad = (supplied & ~acceptable);
  if (bad) {
    char bad_flag[20];
    if ((bad & 0x00000001)) {
      strcpy(bad_flag, "CONST");
    } else if ((bad & 0x00000002)) {
      strcpy(bad_flag, "NULLABLE");
    } else if ((bad & 0x00000008)) {
      strcpy(bad_flag, "INCREMENTED");
    } else if ((bad & 0x00000010)) {
      strcpy(bad_flag, "DECREMENTED");
    } else if ((bad & 0x00000020)) {
      strcpy(bad_flag, "OBJECT");
    } else if ((bad & 0x00000040)) {
      strcpy(bad_flag, "PRIMITIVE");
    } else if ((bad & 0x00000080)) {
      strcpy(bad_flag, "INTEGER");
    } else if ((bad & 0x00000100)) {
      strcpy(bad_flag, "FLOATING");
    } else if ((bad & 0x00000200)) {
      strcpy(bad_flag, "STRING_TYPE");
    } else if ((bad & 0x00000400)) {
      strcpy(bad_flag, "VA_LIST");
    } else if ((bad & 0x00000800)) {
      strcpy(bad_flag, "ARBITRARY");
    } else if ((bad & 0x00001000)) {
      strcpy(bad_flag, "COMPOSITE");
    } else {
      CFCUtil_die("Unknown flags: %d", bad);
    }
    CFCUtil_die("Bad flag for type %s: %s", type_name, bad_flag);
  }
}
```