Mercurial > hg > octave-nkf > gnulib-hg
changeset 9157:18308c6e516b
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.
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Sun, 19 Aug 2007 15:47:14 +0000 |
parents | f37411290a94 |
children | d45f26a2b8ff |
files | ChangeLog lib/yesno.c modules/yesno-tests tests/test-yesno.c tests/test-yesno.sh |
diffstat | 5 files changed, 139 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +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.
--- a/lib/yesno.c +++ b/lib/yesno.c @@ -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,9 +28,13 @@ # 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. -extern int rpmatch (char const *response); + 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)
new file mode 100644 --- /dev/null +++ b/modules/yesno-tests @@ -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@
new file mode 100644 --- /dev/null +++ b/tests/test-yesno.c @@ -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; +}
new file mode 100755 --- /dev/null +++ b/tests/test-yesno.sh @@ -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