[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: yesno module consumes too much input
From: |
Eric Blake |
Subject: |
Re: yesno module consumes too much input |
Date: |
Sun, 19 Aug 2007 09:26:21 -0600 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
According to Jim Meyering on 8/19/2007 12:47 AM:
>> Jim, you are affected the most - which would you rather see, a relatively
>> big patch to yesno/closein that potentially changes API, or a one-line
>> patch to each of your five affected programs?
>
> The complexity of the yesno-modifying approach seems too high,
> and not limited just to yesno, so I think the per-application
> one-line changes are better.
Here's what I'm committing to gnulib; a patch for coreutils will follow.
2007-08-19 Eric Blake <address@hidden>
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.
- --
Don't work too hard, make some time for fun as well!
Eric Blake address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFGyGEc84KuGfSFAYARAktLAKCEpwYZTx1AXP93bB12nZDLHPKTdACgtmpc
xTz7FUZG5iqa68XreZ0t+YI=
=9W1R
-----END PGP SIGNATURE-----
Index: lib/yesno.c
===================================================================
RCS file: /sources/gnulib/gnulib/lib/yesno.c,v
retrieving revision 1.17
diff -u -p -r1.17 yesno.c
--- lib/yesno.c 14 Dec 2006 18:47:36 -0000 1.17
+++ lib/yesno.c 19 Aug 2007 15:07:18 -0000
@@ -1,6 +1,6 @@
/* 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
@@ -28,10 +28,14 @@
# 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)
{
Index: modules/yesno-tests
===================================================================
RCS file: modules/yesno-tests
diff -N modules/yesno-tests
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ modules/yesno-tests 19 Aug 2007 15:07:18 -0000
@@ -0,0 +1,15 @@
+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@
Index: tests/test-yesno.c
===================================================================
RCS file: tests/test-yesno.c
diff -N tests/test-yesno.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ tests/test-yesno.c 19 Aug 2007 15:07:18 -0000
@@ -0,0 +1,51 @@
+/* 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;
+}
Index: tests/test-yesno.sh
===================================================================
RCS file: tests/test-yesno.sh
diff -N tests/test-yesno.sh
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ tests/test-yesno.sh 19 Aug 2007 15:07:18 -0000
@@ -0,0 +1,58 @@
+#!/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
+yn - 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
- Re: yesno module consumes too much input, (continued)
- Re: yesno module consumes too much input, Paul Eggert, 2007/08/17
- Re: yesno module consumes too much input, Eric Blake, 2007/08/18
- Re: yesno module consumes too much input, Bruno Haible, 2007/08/18
- Re: yesno module consumes too much input, Eric Blake, 2007/08/18
- Re: yesno module consumes too much input, James Youngman, 2007/08/18
- Re: yesno module consumes too much input, Bruno Haible, 2007/08/18
- Re: yesno module consumes too much input, Eric Blake, 2007/08/18
- Re: yesno module consumes too much input, Jim Meyering, 2007/08/19
- Re: yesno module consumes too much input, Eric Blake, 2007/08/19
- Re: yesno module consumes too much input, Jim Meyering, 2007/08/20
- Re: yesno module consumes too much input,
Eric Blake <=
- Re: yesno module consumes too much input, Eric Blake, 2007/08/18
- Re: yesno module consumes too much input, Bruno Haible, 2007/08/18
- Re: yesno module consumes too much input, Eric Blake, 2007/08/18
- new module finpending (was: Re: yesno module consumes too much input), Bruno Haible, 2007/08/18
- Re: new module finpending, Jim Meyering, 2007/08/19
- Re: new module finpending, Bruno Haible, 2007/08/19
- Re: new module finpending, Eric Blake, 2007/08/19
- Re: new module finpending, Bruno Haible, 2007/08/19
- Re: yesno module consumes too much input, Bruno Haible, 2007/08/19
- closein using freadahead [was: yesno module consumes too much input], Eric Blake, 2007/08/20