+2008-04-27 Bruno Haible <bruno@clisp.org>
+
+ Make test-yesno.sh work on mingw.
+ * tests/test-yesno.sh: Postprocess the output to convert CR/LF to LF.
+ * tests/test-yesno.c: Include yesno.h first. Include binary-io.h.
+ (main): Set stdin to binary mode.
+ * modules/yesno-tests (Depends-on): Add binary-io.
+
2008-04-27 Bruno Haible <bruno@clisp.org>
Fix 'isfinite' on x86, x86_64, ia64 platforms.
/* Test of yesno module.
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007-2008 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <config.h>
+/* Specification. */
+#include "yesno.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "closein.h"
-#include "yesno.h"
+#include "binary-io.h"
char *program_name;
{
int i = 1;
program_name = argv[0];
+
/* yesno recommends that all clients use close_stdin in main. */
atexit (close_stdin);
+ /* But on mingw, close_stdin leaves stdin's file descriptor at the expected
+ position (i.e. where this program left off reading) only if its mode has
+ been set to O_BINARY. If it has been set to O_TEXT, and the file
+ descriptor is seekable, and stdin is buffered, the MSVCRT runtime ends up
+ setting the file descriptor's position to the expected position _minus_
+ the number of LFs not preceded by CR that were read between the expected
+ position and the last filled buffer end position. (I.e. the repositioning
+ from the end-of-buffer to the expected position does not work if the input
+ file contains end-of-line markers in Unix convention.) */
+ SET_BINARY (0);
if (1 < argc)
i = atoi (argv[1]);
trap 'rm -fr $tmpfiles' 1 2 3 15
p=t-yesno-
-tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out.tmp ${p}err.tmp"
+tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out1.tmp ${p}out.tmp ${p}err.tmp"
# For now, only test with C locale
LC_ALL=C
export LC_ALL
-# Test with seekable stdin; followon process must see remaining data
+# Find out how to remove carriage returns from output. Solaris /usr/ucb/tr
+# does not understand '\r'.
+if echo solaris | tr -d '\r' | grep solais > /dev/null; then
+ cr='\015'
+else
+ cr='\r'
+fi
+
+# Test with seekable stdin; the followon process must see remaining data.
cat <<EOF > ${p}in.tmp
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn - entire line consumed
y\7fn - backspace does not change result
does not match either yesexpr or noexpr
n
EOF
+
cat <<EOF > ${p}xout.tmp
N
Y
N
n
EOF
+
(./test-yesno${EXEEXT}; ./test-yesno${EXEEXT} 3; cat) \
- < ${p}in.tmp > ${p}out.tmp || exit 1
+ < ${p}in.tmp > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
cmp ${p}xout.tmp ${p}out.tmp || exit 1
(./test-yesno${EXEEXT} 3; ./test-yesno${EXEEXT}; cat) \
- < ${p}in.tmp > ${p}out.tmp || exit 1
+ < ${p}in.tmp > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
cmp ${p}xout.tmp ${p}out.tmp || exit 1
# Test for behavior on pipe
Y
N
EOF
-echo yes | ./test-yesno${EXEEXT} 2 > ${p}out.tmp || exit 1
+echo yes | ./test-yesno${EXEEXT} 2 > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
cmp ${p}xout.tmp ${p}out.tmp || exit 1
# Test for behavior on EOF
cat <<EOF > ${p}xout.tmp
N
EOF
-./test-yesno${EXEEXT} </dev/null > ${p}out.tmp || exit 1
+./test-yesno${EXEEXT} </dev/null > ${p}out1.tmp || exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
cmp ${p}xout.tmp ${p}out.tmp || exit 1
# Test for behavior when stdin is closed
-./test-yesno${EXEEXT} 0 <&- > ${p}out.tmp 2> ${p}err.tmp && exit 1
+./test-yesno${EXEEXT} 0 <&- > ${p}out1.tmp 2> ${p}err.tmp && exit 1
+LC_ALL=C tr -d "$cr" < ${p}out1.tmp > ${p}out.tmp || exit 1
cmp ${p}xout.tmp ${p}out.tmp || exit 1
test -s ${p}err.tmp || exit 1