summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@zip.com.au>2016-07-14 10:59:09 +1000
committerDarren Tucker <dtucker@zip.com.au>2016-07-14 10:59:09 +1000
commita2333584170a565adf4f209586772ef8053b10b8 (patch)
tree37e1f144bdabc09b1ce89c2e6fe603bc8845e7c2
parent8aaec7050614494014c47510b7e94daf6e644c62 (diff)
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.
-rw-r--r--configure.ac7
-rw-r--r--openbsd-compat/bsd-misc.c17
-rw-r--r--openbsd-compat/openbsd-compat.h18
3 files changed, 41 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index 005a9ead..f6c44b87 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1721,7 +1721,6 @@ AC_CHECK_FUNCS([ \
inet_ntop \
innetgr \
login_getcapbool \
- mblen \
md5_crypt \
memmove \
memset_s \
@@ -1789,6 +1788,12 @@ AC_CHECK_FUNCS([ \
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_LANG_PROGRAM(
[[ #include <ctype.h> ]],
diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c
index 2a788e47..18bf62dd 100644
--- a/openbsd-compat/bsd-misc.c
+++ b/openbsd-compat/bsd-misc.c
@@ -284,3 +284,20 @@ pledge(const char *promises, const char *paths[])
return 0;
}
#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
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index 8cc8a11b..997541e4 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -36,6 +36,8 @@
#include <sys/socket.h>
+#include <stddef.h> /* for wchar_t */
+
/* OpenBSD function replacements */
#include "base64.h"
#include "sigact.h"
@@ -231,6 +233,22 @@ long long strtonum(const char *, long long, long long, const char **);
# define mblen(x, y) (1)
#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)
# include <stdarg.h>
#endif