.if ${MK_MACHDEP_OPTIMIZATIONS} != "no"
.PATH: ${LIBC_SRCTOP}/${LIBC_ARCH}/string
.endif
.PATH: ${LIBC_SRCTOP}/string
.PATH: ${SRCTOP}/sys/libkern
CFLAGS+= -I${LIBC_SRCTOP}/locale
# machine-independent string sources
MISRCS+=bcmp.c \
bcopy.c \
bzero.c \
explicit_bzero.c \
ffs.c \
ffsl.c \
ffsll.c \
fls.c \
flsl.c \
flsll.c \
memccpy.c \
memchr.c \
memrchr.c \
memcmp.c \
memcpy.c \
memmem.c \
memmove.c \
mempcpy.c \
memset.c \
memset_s.c \
memset_explicit.c \
stpcpy.c \
stpncpy.c \
strcasecmp.c \
strcat.c \
strcasestr.c \
strchr.c \
strchrnul.c \
strcmp.c \
strcoll.c \
strcpy.c\
strcspn.c \
strdup.c \
strerror.c \
strlcat.c \
strlcpy.c \
strlen.c \
strmode.c \
strncat.c \
strncmp.c \
strncpy.c \
strndup.c \
strnlen.c \
strnstr.c \
strpbrk.c \
strrchr.c \
strsep.c \
strsignal.c \
strspn.c \
strstr.c \
strtok.c \
strverscmp.c \
strxfrm.c \
swab.c \
timingsafe_bcmp.c \
timingsafe_memcmp.c \
wcpcpy.c \
wcpncpy.c \
wcscasecmp.c \
wcscat.c \
wcschr.c \
wcscmp.c \
wcscoll.c \
wcscpy.c \
wcscspn.c \
wcsdup.c \
wcslcat.c \
wcslcpy.c \
wcslen.c \
wcsncasecmp.c \
wcsncat.c \
wcsncmp.c \
wcsncpy.c \
wcsnlen.c \
wcspbrk.c \
wcsrchr.c \
wcsspn.c \
wcsstr.c \
wcstok.c \
wcswidth.c \
wcsxfrm.c \
wmemchr.c \
wmemcmp.c \
wmemcpy.c \
wmemmove.c \
wmempcpy.c \
wmemset.c
SYM_MAPS+= ${LIBC_SRCTOP}/string/Symbol.map
.if ${MK_ASAN} != "no"
# These source files deliberately read out of bounds since they assume that
# out-of-bounds memory accesses that don't cross pages are always legal.
# Note: While this is fine on x86, it does break when running with CHERI.
CFLAGS.strlen.c+= -fno-sanitize=address
CFLAGS.strchrnul.c+= -fno-sanitize=address
CFLAGS.memchr.c+= -fno-sanitize=address
.endif
.if ${MK_MACHDEP_OPTIMIZATIONS} != "no"
# machine-dependent string sources
.sinclude "${LIBC_SRCTOP}/${LIBC_ARCH}/string/Makefile.inc"
.endif
MAN+= bcmp.3 \
bcopy.3 \
bstring.3 \
bzero.3 \
ffs.3 \
index.3 \
memccpy.3 \
memchr.3 \
memcmp.3 \
memcpy.3 \
memmem.3 \
memmove.3 \
memset.3 \
strcasecmp.3 \
strcat.3 \
strchr.3 \
strcmp.3 \
strcoll.3 \
strcpy.3 \
strdup.3 \
strerror.3 \
string.3 \
strlcpy.3 \
strlen.3 \
strmode.3 \
strpbrk.3 \
strsep.3 \
strspn.3 \
strstr.3 \
strtok.3 \
strverscmp.3 \
strxfrm.3 \
swab.3 \
timingsafe_bcmp.3 \
wcscoll.3 \
wcstok.3 \
wcswidth.3 \
wcsxfrm.3 \
wmemchr.3
MLINKS+=bzero.3 explicit_bzero.3
MLINKS+=ffs.3 ffsl.3 \
ffs.3 ffsll.3 \
ffs.3 fls.3 \
ffs.3 flsl.3 \
ffs.3 flsll.3
MLINKS+=index.3 rindex.3
MLINKS+=memchr.3 memrchr.3
MLINKS+=memcpy.3 mempcpy.3
MLINKS+=memset.3 memset_s.3 \
memset.3 memset_explicit.3
MLINKS+=strcasecmp.3 strncasecmp.3 \
strcasecmp.3 strcasecmp_l.3 \
strcasecmp.3 strncasecmp_l.3
MLINKS+=strcat.3 strncat.3
MLINKS+=strchr.3 strrchr.3 \
strchr.3 strchrnul.3
MLINKS+=strcmp.3 strncmp.3
MLINKS+=strcoll.3 strcoll_l.3
MLINKS+=strcpy.3 stpcpy.3 \
strcpy.3 stpncpy.3 \
strcpy.3 strncpy.3
MLINKS+=strdup.3 strndup.3 \
strdup.3 strdupa.3 \
strdup.3 strndupa.3
MLINKS+=strerror.3 perror.3 \
strerror.3 strerror_l.3 \
strerror.3 strerror_r.3 \
strerror.3 sys_errlist.3 \
strerror.3 sys_nerr.3
MLINKS+=strlcpy.3 strlcat.3
MLINKS+=strlen.3 strnlen.3
MLINKS+=strspn.3 strcspn.3
MLINKS+=strstr.3 strcasestr.3 \
strstr.3 strnstr.3 \
strstr.3 strcasestr_l.3
MLINKS+=strtok.3 strtok_r.3
MLINKS+=strxfrm.3 strxfrm_l.3
MLINKS+=timingsafe_bcmp.3 timingsafe_memcmp.3
MLINKS+=wmemchr.3 wcpcpy.3 \
wmemchr.3 wcpncpy.3 \
wmemchr.3 wcscasecmp.3 \
wmemchr.3 wcscat.3 \
wmemchr.3 wcschr.3 \
wmemchr.3 wcscmp.3 \
wmemchr.3 wcscpy.3 \
wmemchr.3 wcscspn.3 \
wmemchr.3 wcsdup.3 \
wmemchr.3 wcslcat.3 \
wmemchr.3 wcslcpy.3 \
wmemchr.3 wcslen.3 \
wmemchr.3 wcsncasecmp.3 \
wmemchr.3 wcsncat.3 \
wmemchr.3 wcsncmp.3 \
wmemchr.3 wcsncpy.3 \
wmemchr.3 wcsnlen.3 \
wmemchr.3 wcspbrk.3 \
wmemchr.3 wcsrchr.3 \
wmemchr.3 wcsspn.3 \
wmemchr.3 wcsstr.3 \
wmemchr.3 wmemcmp.3 \
wmemchr.3 wmemcpy.3 \
wmemchr.3 wmemmove.3 \
wmemchr.3 wmempcpy.3 \
wmemchr.3 wmemset.3