test/cleanup ## The "cleanup" test should always be last.
check_SCRIPTS = test/common.sh
-check_PROGRAMS = test/getfullname test/getfqdn test/fakepop test/fakesmtp
+check_PROGRAMS = test/getfullname test/getfqdn test/fakepop test/fakesmtp \
+ test/getcwidth
DISTCHECK_CONFIGURE_FLAGS = DISABLE_SETGID_MAIL=1
##
--- /dev/null
+/*
+ * getcwidth - Get the OS's idea of the width of a combining character
+ *
+ * This code is Copyright (c) 2012, by the authors of nmh. See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef MULTIBYTE_SUPPORT
+#include <locale.h>
+#include <wchar.h>
+#endif
+
+int
+main(int argc, char *argv[])
+{
+ wchar_t c;
+ int charlen;
+ char *p;
+
+ /*
+ * This is the UTF-8 for "n" + U+0308 (Combining Diaeresis)
+ */
+
+ unsigned char string[] = "n\xcc\x88";
+
+ setlocale(LC_ALL, "");
+
+ if (argc != 1) {
+ fprintf(stderr, "Usage: %s\n", argv[0]);
+ fprintf(stderr, "Returns the column width of a UTF-8 "
+ "multibyte character\n");
+ exit(1);
+ }
+
+#ifndef MULTIBYTE_SUPPORT
+ fprintf(stderr, "Nmh was not configured with multibyte support\n");
+ exit(1);
+#else
+ /*
+ * It's not clear to me that we can just call mbtowc() with a
+ * combining character; just to be safe, feed it in a base
+ * character first.
+ */
+
+ mbtowc(NULL, NULL, 0);
+
+ charlen = mbtowc(&c, string, strlen(string));
+
+ if (charlen != 1) {
+ fprintf(stderr, "We expected a beginning character length "
+ "of 1, got %d instead\n", charlen);
+ exit(1);
+ }
+
+ p = string + charlen;
+
+ charlen = mbtowc(&c, p, strlen(p));
+
+ if (charlen != 2) {
+ fprintf(stderr, "We expected a multibyte character length "
+ "of 2, got %d instead\n", charlen);
+ fprintf(stderr, "Are you using a UTF-8 locale?\n");
+ exit(1);
+ }
+
+ printf("%d\n", wcwidth(c));
+
+ exit(0);
+#endif /* MULTIBYTE_SUPPORT */
+}
#
# Create a test message with RFC 2047 headers we can scan
#
+# In this Subject header in this message is a "n" with a Combining Diaeresis
+# (U+0308). There is different interpretation of this character with respect
+# to wcwidth() (which is supposed to return the column width of a character).
+# We use a test program to determine what the output width of U+0308 is
+# and adjust our test output appropriately.
+#
cat > "${MH_TEST_DIR}/Mail/inbox/11" <<EOF
From: David =?utf-8?q?=EF=AC=86?= Hubbins <hubbins@example.com>
To: Sir Denis =?utf-8?q?Eton=E2=80=93Hogg? <sirdenis@example.com>
Date: Friday, 2 Mar 1984 00:00:00
-Subject: =?utf-8?q?Spin=CC=88al_Tap_=E2=86=92_Tap_into_America!?=
+Subject: =?utf-8?q?Sp=C4=B1n=CC=88al_Tap_=E2=86=92_Tap_into_America!?=
Things are looking great!
EOF
+width=`${MH_OBJ_DIR}/test/getcwidth`
+if test $? -ne 0; then
+ echo "getcwidth failed to run"
+ exit 1
+fi
+
expected="$MH_TEST_DIR/$$.expected"
actual="$MH_TEST_DIR/$$.actual"
+if test "$width" -eq 1; then
cat > "$expected" <<EOF
- 11 03/02 David st Hubbins Spin̈al Tap → Tap into America!<<Things are look
+ 11 03/02 David st Hubbins Spın̈al Tap → Tap into America!<<Things are look
EOF
+elif test "$width" -eq 0; then
+cat > "$expected" <<EOF
+ 11 03/02 David st Hubbins Spın̈al Tap → Tap into America!<<Things are looki
+EOF
+else
+ echo "Unsupported width for combining diaeresis: $width"
+ exit 1
+fi
scan -width 80 +inbox 11 > $actual || exit 1
check "$expected" "$actual"