* lib/yesno.c (yesno): Document use of stdin.
* modules/yesno-tests (Files): New module.
* tests/test-yesno.c (main): New file.
* tests/test-yesno.sh: Likewise.
+2007-08-19 Eric Blake <ebb9@byu.net>
+
+ Test yesno in combination with closein.
+ * lib/yesno.c (yesno): Document use of stdin.
+ * modules/yesno-tests (Files): New module.
+ * tests/test-yesno.c (main): New file.
+ * tests/test-yesno.sh: Likewise.
+
2007-08-19 Bruno Haible <bruno@clisp.org>
* lib/fbufmode.c (fbufmode): Add tentative support for Solaris/AMD64.
/* yesno.c -- read a yes/no response from stdin
- Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006 Free
+ Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006, 2007 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
# include "getline.h"
#endif
-/* Return true if we read an affirmative line from standard input. */
-
extern int rpmatch (char const *response);
+/* Return true if we read an affirmative line from standard input.
+
+ Since this function uses stdin, it is suggested that the caller not
+ use STDIN_FILENO directly, and also that the line
+ atexit(close_stdin) be added to main(). */
+
bool
yesno (void)
{
--- /dev/null
+Files:
+tests/test-yesno.c
+tests/test-yesno.sh
+
+Depends-on:
+closein
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-yesno.sh
+TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@'
+check_PROGRAMS += test-yesno
+EXTRA_DIST += test-yesno.sh
+test_yesno_LDADD = $(LDADD) @LIBINTL@
--- /dev/null
+/* Test of yesno module.
+ Copyright (C) 2007 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
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "closein.h"
+#include "yesno.h"
+
+char *program_name;
+
+/* Test yesno. Without arguments, read one line. If first argument
+ is zero, close stdin before attempting to read one line.
+ Otherwise, read the number of lines specified by first
+ argument. */
+int
+main (int argc, char **argv)
+{
+ int i = 1;
+ program_name = argv[0];
+ /* yesno recommends that all clients use close_stdin in main. */
+ atexit (close_stdin);
+
+ if (1 < argc)
+ i = atoi (argv[1]);
+ if (!i)
+ {
+ i = 1;
+ close (0);
+ }
+ while (i--)
+ puts (yesno () ? "Y" : "N");
+ return 0;
+}
--- /dev/null
+#!/bin/sh
+
+tmpfiles=
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+p=t-yesno-
+tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out.tmp"
+
+# For now, only test with C locale
+LC_ALL=C
+export LC_ALL
+
+# Test with seekable stdin; followon process must see remaining data
+cat <<EOF > ${p}in.tmp
+nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn - entire line consumed
+y\7fn - backspace does not change result
+y
+does not match either yesexpr or noexpr
+n
+EOF
+cat <<EOF > ${p}xout.tmp
+N
+Y
+Y
+N
+n
+EOF
+(./test-yesno${EXEEXT}; ./test-yesno${EXEEXT} 3; cat) \
+ < ${p}in.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
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior on pipe
+cat <<EOF > ${p}xout.tmp
+Y
+N
+EOF
+echo yes | ./test-yesno${EXEEXT} 2 > ${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
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Test for behavior when stdin is closed
+./test-yesno${EXEEXT} 0 <&- > ${p}out.tmp && exit 1
+cmp ${p}xout.tmp ${p}out.tmp || exit 1
+
+# Cleanup
+rm -fr $tmpfiles
+
+exit 0