Add compat code for missing wcwidth.

If we don't have wcwidth force fallback implementations of nl_langinfo
and mbtowc.  Based on advice from Ingo Schwarze.
This commit is contained in:
Darren Tucker 2016-07-14 10:59:09 +10:00
parent 8aaec70506
commit a233358417
3 changed files with 41 additions and 1 deletions

View File

@ -1721,7 +1721,6 @@ AC_CHECK_FUNCS([ \
inet_ntop \ inet_ntop \
innetgr \ innetgr \
login_getcapbool \ login_getcapbool \
mblen \
md5_crypt \ md5_crypt \
memmove \ memmove \
memset_s \ memset_s \
@ -1789,6 +1788,12 @@ AC_CHECK_FUNCS([ \
warn \ warn \
]) ])
dnl Wide character support. Linux man page says it needs _XOPEN_SOURCE.
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -D_XOPEN_SOURCE"
AC_CHECK_FUNCS([mblen mbtowc nl_langinfo wcwidth])
CFLAGS="$saved_CFLAGS"
AC_LINK_IFELSE( AC_LINK_IFELSE(
[AC_LANG_PROGRAM( [AC_LANG_PROGRAM(
[[ #include <ctype.h> ]], [[ #include <ctype.h> ]],

View File

@ -284,3 +284,20 @@ pledge(const char *promises, const char *paths[])
return 0; return 0;
} }
#endif #endif
#ifndef HAVE_MBTOWC
/* a mbtowc that only supports ASCII */
int
mbtowc(wchar_t *pwc, const char *s, size_t n)
{
if (s == NULL || *s == '\0')
return 0; /* ASCII is not state-dependent */
if (*s < 0 || *s > 0x7f || n < 1) {
errno = EOPNOTSUPP;
return -1;
}
if (pwc != NULL)
*pwc = *s;
return 1;
}
#endif

View File

@ -36,6 +36,8 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <stddef.h> /* for wchar_t */
/* OpenBSD function replacements */ /* OpenBSD function replacements */
#include "base64.h" #include "base64.h"
#include "sigact.h" #include "sigact.h"
@ -231,6 +233,22 @@ long long strtonum(const char *, long long, long long, const char **);
# define mblen(x, y) (1) # define mblen(x, y) (1)
#endif #endif
#ifndef HAVE_WCWIDTH
# define wcwidth(x) (((x) >= 0x20 && (x) <= 0x7e) ? 1 : -1)
/* force our no-op nl_langinfo and mbtowc */
# undef HAVE_NL_LANGINFO
# undef HAVE_MBTOWC
# undef HAVE_LANGINFO_H
#endif
#ifndef HAVE_NL_LANGINFO
# define nl_langinfo(x) ""
#endif
#ifndef HAVE_MBTOWC
int mbtowc(wchar_t *, const char*, size_t);
#endif
#if !defined(HAVE_VASPRINTF) || !defined(HAVE_VSNPRINTF) #if !defined(HAVE_VASPRINTF) || !defined(HAVE_VSNPRINTF)
# include <stdarg.h> # include <stdarg.h>
#endif #endif