user: What is the c source code of the assembly code below:

```asm
<__strchrnul>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  movzbl %al,%eax
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x0,-0x1c(%rbp)
  jne    L119
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  jmp    L110
L23:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L13
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L93
L13:
  mov    -0x18(%rbp),%rax
  jmp    L110
L93:
  addq   $0x1,-0x18(%rbp)
L119:
  mov    -0x18(%rbp),%rax
  and    $0x7,%eax
  test   %rax,%rax
  jne    L23
  mov    D54(%rip),%rax
  mov    (%rax),%rsi
  mov    $0xffffffffffffffff,%rax
  mov    $0x0,%edx
  div    %rsi
  mov    %rax,%rdx
  mov    -0x1c(%rbp),%eax
  cltq
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L105
L71:
  addq   $0x8,-0x10(%rbp)
L105:
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rcx
  mov    D54(%rip),%rax
  mov    (%rax),%rdi
  mov    $0xffffffffffffffff,%rax
  mov    $0x0,%edx
  div    %rdi
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  not    %rax
  mov    %rdx,%rcx
  and    %rax,%rcx
  mov    D54(%rip),%rax
  mov    (%rax),%rsi
  mov    $0xffffffffffffffff,%rax
  mov    $0x0,%edx
  div    %rsi
  mov    %rax,%rdx
  mov    D54(%rip),%rax
  mov    (%rax),%rax
  shr    %rax
  add    $0x1,%rax
  imul   %rdx,%rax
  and    %rcx,%rax
  test   %rax,%rax
  jne    L107
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  xor    -0x8(%rbp),%rax
  mov    %rax,%rcx
  mov    D54(%rip),%rax
  mov    (%rax),%rdi
  mov    $0xffffffffffffffff,%rax
  mov    $0x0,%edx
  div    %rdi
  sub    %rax,%rcx
  mov    %rcx,%rdx
  mov    -0x10(%rbp),%rax
  mov    (%rax),%rax
  xor    -0x8(%rbp),%rax
  not    %rax
  and    %rax,%rdx
  mov    %rdx,%rcx
  mov    D54(%rip),%rax
  mov    (%rax),%rsi
  mov    $0xffffffffffffffff,%rax
  mov    $0x0,%edx
  div    %rsi
  mov    %rax,%rdx
  mov    D54(%rip),%rax
  mov    (%rax),%rax
  shr    %rax
  add    $0x1,%rax
  imul   %rdx,%rax
  and    %rcx,%rax
  test   %rax,%rax
  je     L71
L107:
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L35
L111:
  addq   $0x1,-0x18(%rbp)
L35:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L67
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    %eax,-0x1c(%rbp)
  jne    L111
L67:
  mov    -0x18(%rbp),%rax
L110:
  leave
  ret
```

assistant: ```c
char *__strchrnul(const char *s, int c) {
  size_t *w, k;
  c = (unsigned char)c;
  if (!c)
    return (char *)s + strlen(s);
  for (; (uintptr_t)s % (sizeof(size_t)); s++)
    if (!*s || *(unsigned char *)s == c)
      return (char *)s;
  k = ((size_t)-1 / UCHAR_MAX) * c;
  for (w = (void *)s; !(((*w) - ((size_t)-1 / UCHAR_MAX)) & ~(*w) & (((size_t)-1 / UCHAR_MAX) * (UCHAR_MAX / 2 + 1))) && !(((*w ^ k) - ((size_t)-1 / UCHAR_MAX)) & ~(*w ^ k) & (((size_t)-1 / UCHAR_MAX) * (UCHAR_MAX / 2 + 1))); w++)
    ;
  for (s = (void *)w; *s && *(unsigned char *)s != c; s++)
    ;
  return (char *)s;
}
```