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

```asm
<S_check_flags>:
  endbr64
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  not    %esi
  and    %edi,%esi
  je     L175
  mov    %rdx,%rbx
  test   $0x1,%sil
  jne    L67
  test   $0x2,%sil
  jne    L100
  test   $0x8,%sil
  jne    L45
  test   $0x10,%sil
  jne    L0
  test   $0x20,%sil
  jne    L243
  test   $0x40,%sil
  jne    L75
  test   $0x80,%sil
  jne    L191
  test   $0x100,%esi
  jne    L99
  test   $0x200,%esi
  jne    L41
  test   $0x400,%esi
  jne    L17
  test   $0x800,%esi
  jne    L235
  test   $0x1000,%esi
  je     L209
  mov    %rsp,%rdi
  lea    D57(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L67:
  mov    %rsp,%rdi
  lea    D135(%rip),%rsi
  call   <strcpy@plt>
L218:
  mov    %rsp,%rdx
  mov    %rbx,%rsi
  lea    D38(%rip),%rdi
  mov    $0x0,%eax
  call   <CFCUtil_die@plt>
L175:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L43
  add    $0x20,%rsp
  pop    %rbx
  ret
L100:
  mov    %rsp,%rdi
  lea    D20(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L45:
  mov    %rsp,%rdi
  lea    D131(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L0:
  mov    %rsp,%rdi
  lea    D73(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L243:
  mov    %rsp,%rdi
  lea    D51(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L75:
  mov    %rsp,%rdi
  lea    D115(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L191:
  mov    %rsp,%rdi
  lea    D138(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L99:
  mov    %rsp,%rdi
  lea    D22(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L41:
  mov    %rsp,%rdi
  lea    D110(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L17:
  mov    %rsp,%rdi
  lea    D17(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L235:
  mov    %rsp,%rdi
  lea    D18(%rip),%rsi
  call   <strcpy@plt>
  jmp    L218
L209:
  lea    D80(%rip),%rdi
  mov    $0x0,%eax
  call   <CFCUtil_die@plt>
  jmp    L218
L43:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D57
type: string
name: extract_symbolic_data
arguments: data_tag: D135
type: string
name: extract_symbolic_data
arguments: data_tag: D38
type: string
name: extract_symbolic_data
arguments: data_tag: D20
type: string
name: extract_symbolic_data
arguments: data_tag: D131
type: string
name: extract_symbolic_data
arguments: data_tag: D73
type: string
name: extract_symbolic_data
arguments: data_tag: D51
type: string
name: extract_symbolic_data
arguments: data_tag: D115
type: string
name: extract_symbolic_data
arguments: data_tag: D138
type: string
name: extract_symbolic_data
arguments: data_tag: D22
type: string
name: extract_symbolic_data
arguments: data_tag: D110
type: string
name: extract_symbolic_data
arguments: data_tag: D17
type: string
name: extract_symbolic_data
arguments: data_tag: D18
type: string
name: extract_symbolic_data
arguments: data_tag: D80
type: string

tool: D57: COMPOSITE

tool: D135: CONST

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

tool: D20: NULLABLE

tool: D131: INCREMENTED

tool: D73: DECREMENTED

tool: D51: OBJECT

tool: D115: PRIMITIVE

tool: D138: INTEGER

tool: D22: FLOATING

tool: D110: STRING_TYPE

tool: D17: VA_LIST

tool: D18: ARBITRARY

tool: D80: Unknown flags: %d

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);
  }
}
```