int lose = 0;
const char *greeting_msg;
wchar_t *mb_greeting;
+ mbstate_t mbstate = { 0, };
size_t len;
enum {
exit (EXIT_FAILURE);
}
- len = mbsrtowcs(NULL, &greeting_msg, 0, NULL);
+ len = strlen(greeting_msg) + 1;
+ mb_greeting = xmalloc(len * sizeof(wchar_t));
+ len = mbsrtowcs(mb_greeting, &greeting_msg, len, &mbstate);
if (len == (size_t)-1)
error (EXIT_FAILURE, errno, _("conversion to a multibyte string failed"));
- mb_greeting = xmalloc((len + 1) * sizeof(wchar_t));
- mbsrtowcs(mb_greeting, &greeting_msg, len + 1, NULL);
/* Print greeting message and exit. */
wprintf (L"%ls\n", mb_greeting);
+#! /bin/sh
+# Test multibyte --greeting.
+#
+# Copyright (C) 2019 Free Software Foundation, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
+
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+# Cause multibyte conversion failure.
+LANGUAGE=
+LC_ALL=C
+LC_MESSAGES=
+LANG=
+export LANGUAGE LC_ALL LC_MESSAGES LANG
+
+tmpfiles="multibyte-test1.ok"
+cat <<EOF >multibyte-test1.ok
+hello: conversion to a multibyte string failed: Invalid or incomplete multibyte or wide character
+EOF
+
+tmpfiles="$tmpfiles multibyte-test1.out"
+: ${HELLO=hello}
+${HELLO} -g 'hello 世界' 2>&1 | tr -d '\r' >multibyte-test1.out
+
+# remove \r (CR) characters from the output, so that the tests work on
+# platforms with CRLF line endings. There is apparently no reliable
+# method (across Cygwin, MingW, etc.) to force an eol style.
+
+: ${DIFF=diff}
+${DIFF} multibyte-test1.ok multibyte-test1.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result