emacs/m4/strnlen.m4
2024-07-16 15:37:18 -07:00

80 lines
2.5 KiB
Text

# strnlen.m4
# serial 15
dnl Copyright (C) 2002-2003, 2005-2007, 2009-2024 Free Software Foundation,
dnl Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
m4_version_prereq([2.73], [], [
# Replace AC_FUNC_STRNLEN from Autoconf 2.72 and earlier,
# which does not check for Android strnlen bugs.
AC_DEFUN([AC_FUNC_STRNLEN],
[AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])dnl
AC_CACHE_CHECK([for working strnlen], [ac_cv_func_strnlen_working],
[AC_RUN_IFELSE(
[AC_LANG_PROGRAM(
[AC_INCLUDES_DEFAULT
[/* Use pstrnlen to test; 'volatile' prevents the compiler
from optimizing the strnlen calls away. */
size_t (*volatile pstrnlen) (char const *, size_t) = strnlen;
char const s[] = "foobar";
int s_len = sizeof s - 1;
]],
[[
/* AIX 4.3 is buggy: strnlen (S, 1) == 3. */
int i;
for (i = 0; i < s_len + 1; ++i)
{
int expected = i <= s_len ? i : s_len;
if (pstrnlen (s, i) != expected)
return 1;
}
/* Android 5.0 (API 21) strnlen ("", SIZE_MAX) incorrectly crashes. */
if (pstrnlen ("", -1) != 0)
return 1;]])],
[ac_cv_func_strnlen_working=yes],
[ac_cv_func_strnlen_working=no],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
[[#if defined _AIX && !defined _AIX51
#error "AIX pre 5.1 is buggy"
#endif
#ifdef __ANDROID__
#include <android/api-level.h>
#if __ANDROID_API__ < 22
#error "Android API < 22 is buggy"
#endif
#endif
]])],
[ac_cv_func_strnlen_working=yes],
[ac_cv_func_strnlen_working=no])])])
test $ac_cv_func_strnlen_working = no && AC_LIBOBJ([strnlen])
])# AC_FUNC_STRNLEN
])
AC_DEFUN([gl_FUNC_STRNLEN],
[
AC_REQUIRE([gl_STRING_H_DEFAULTS])
dnl Persuade glibc <string.h> to declare strnlen().
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
AC_CHECK_DECLS_ONCE([strnlen])
if test $ac_cv_have_decl_strnlen = no; then
HAVE_DECL_STRNLEN=0
else
m4_pushdef([AC_LIBOBJ], [:])
dnl Note: AC_FUNC_STRNLEN does AC_LIBOBJ([strnlen]).
AC_FUNC_STRNLEN
m4_popdef([AC_LIBOBJ])
if test $ac_cv_func_strnlen_working = no; then
REPLACE_STRNLEN=1
fi
fi
])
# Prerequisites of lib/strnlen.c.
AC_DEFUN([gl_PREREQ_STRNLEN], [:])