user: Demonstrate the C code that generates the assembly output below:

```asm
<strpbrk>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x30,%rsp
  mov    %rdi,-0x1028(%rbp)
  mov    %rsi,-0x1030(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x1018(%rbp)
  cmpq   $0x0,-0x1028(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <_DIAGASSERT@plt>
  cmpq   $0x0,-0x1030(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <_DIAGASSERT@plt>
  mov    -0x1030(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L29
  mov    $0x0,%eax
  jmp    L9
L29:
  mov    -0x1030(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L123
  mov    -0x1030(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x1028(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  jmp    L9
L94:
  mov    -0x1030(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%eax
  mov    -0x810(%rbp,%rax,8),%rax
  cmp    %rax,-0x1018(%rbp)
  jbe    L83
  mov    -0x1030(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%eax
  mov    -0x810(%rbp,%rax,8),%rax
  mov    -0x1010(%rbp,%rax,8),%rdx
  mov    -0x1030(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    %rax,%rdx
  je     L52
L83:
  mov    -0x1030(%rbp),%rax
  movzbl (%rax),%eax
  mov    %eax,%esi
  mov    -0x1018(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x1018(%rbp)
  mov    -0x1030(%rbp),%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%ecx
  mov    %ecx,%edx
  mov    %rax,-0x810(%rbp,%rdx,8)
  mov    %ecx,%eax
  mov    -0x810(%rbp,%rax,8),%rax
  movzbl %sil,%edx
  mov    %rdx,-0x1010(%rbp,%rax,8)
  mov    -0x1010(%rbp,%rax,8),%rax
  test   %rax,%rax
L52:
  nop
  addq   $0x1,-0x1030(%rbp)
L123:
  mov    -0x1030(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L94
  jmp    L82
L40:
  mov    -0x1028(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%eax
  mov    -0x810(%rbp,%rax,8),%rax
  cmp    %rax,-0x1018(%rbp)
  jbe    L10
  mov    -0x1028(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%eax
  mov    -0x810(%rbp,%rax,8),%rax
  mov    -0x1010(%rbp,%rax,8),%rdx
  mov    -0x1028(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    %rax,%rdx
  jne    L10
  mov    -0x1028(%rbp),%rax
  mov    %rax,%rdi
  call   <__UNCONST@plt>
  jmp    L9
L10:
  addq   $0x1,-0x1028(%rbp)
L82:
  mov    -0x1028(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L40
  mov    $0x0,%eax
L9:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L25
  call   <__stack_chk_fail@plt>
L25:
  leave
  ret
```

assistant: ```c
char *strpbrk(const char *s, const char *charset) {
  uint8_t set[256], inv[256], idx = 0;
  _DIAGASSERT(s != NULL);
  _DIAGASSERT(charset != NULL);
  if (charset[0] == '\0')
    return NULL;
  if (charset[1] == '\0')
    return strchr(s, charset[0]);
  for (; *charset != '\0'; ++charset)
    (void)((inv[((unsigned int)(unsigned char)(*charset))] < idx && set[inv[((unsigned int)(unsigned char)(*charset))]] == (((unsigned int)(unsigned char)(*charset)))) || (set[inv[((unsigned int)(unsigned char)(*charset))] = idx++] = (((unsigned int)(unsigned char)(*charset)))));
  for (; *s != '\0'; ++s)
    if ((inv[((unsigned int)(unsigned char)(*s))] < idx && set[inv[((unsigned int)(unsigned char)(*s))]] == (((unsigned int)(unsigned char)(*s)))))
      return __UNCONST(s);
  return NULL;
}
```