From 290f951644e3c7ae4a9bc14ae89ed071b33b9a18 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 13 May 2012 22:54:49 +0200 Subject: [PATCH] binary-io: Define set_binary_mode function. * lib/binary-io.h (set_binary_mode): New function. (SET_BINARY): Define in terms of set_binary_mode. * modules/binary-io (configure.ac): Require AC_C_INLINE. * tests/test-binary-io.c (main): Accept an argument, and test either set_binary_mode or SET_BINARY depending on the argument. * tests/test-binary-io.sh: Invoke test-binary-io twice, with an argument. Clean up also t-bin-out0.tmp. --- ChangeLog | 12 ++++++++++++ lib/binary-io.h | 41 +++++++++++++++++++++++++++-------------- modules/binary-io | 1 + tests/test-binary-io.c | 26 ++++++++++++++++++++------ tests/test-binary-io.sh | 8 +++++--- 5 files changed, 65 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index e52eb32ac..b7f143b83 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2012-05-13 Bruno Haible + Paul Eggert + + binary-io: Define set_binary_mode function. + * lib/binary-io.h (set_binary_mode): New function. + (SET_BINARY): Define in terms of set_binary_mode. + * modules/binary-io (configure.ac): Require AC_C_INLINE. + * tests/test-binary-io.c (main): Accept an argument, and test either + set_binary_mode or SET_BINARY depending on the argument. + * tests/test-binary-io.sh: Invoke test-binary-io twice, with an + argument. Clean up also t-bin-out0.tmp. + 2012-05-13 Stefano Lattarini bootstrap: take advantage of POSIX shell features diff --git a/lib/binary-io.h b/lib/binary-io.h index 824ad5b78..a33e32aee 100644 --- a/lib/binary-io.h +++ b/lib/binary-io.h @@ -25,28 +25,41 @@ so we include it here first. */ #include -/* SET_BINARY (fd); - changes the file descriptor fd to perform binary I/O. */ +/* set_binary_mode (fd, mode) + sets the binary/text I/O mode of file descriptor fd to the given mode + (must be O_BINARY or O_TEXT) and returns the previous mode. */ #if O_BINARY # if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__ # include /* declares setmode() */ +# define set_binary_mode setmode # else -# define setmode _setmode +# define set_binary_mode _setmode # undef fileno # define fileno _fileno # endif -# ifdef __DJGPP__ -# include /* declares isatty() */ - /* Avoid putting stdin/stdout in binary mode if it is connected to - the console, because that would make it impossible for the user - to interrupt the program through Ctrl-C or Ctrl-Break. */ -# define SET_BINARY(fd) ((void) (!isatty (fd) ? (setmode (fd, O_BINARY), 0) : 0)) -# else -# define SET_BINARY(fd) ((void) setmode (fd, O_BINARY)) -# endif #else - /* On reasonable systems, binary I/O is the default. */ -# define SET_BINARY(fd) /* do nothing */ ((void) 0) + /* On reasonable systems, binary I/O is the only choice. */ + /* Use an inline function rather than a macro, to avoid gcc warnings + "warning: statement with no effect". */ +static inline int +set_binary_mode (int fd, int mode) +{ + (void) fd; + (void) mode; + return O_BINARY; +} +#endif + +/* SET_BINARY (fd); + changes the file descriptor fd to perform binary I/O. */ +#ifdef __DJGPP__ +# include /* declares isatty() */ + /* Avoid putting stdin/stdout in binary mode if it is connected to + the console, because that would make it impossible for the user + to interrupt the program through Ctrl-C or Ctrl-Break. */ +# define SET_BINARY(fd) ((void) (!isatty (fd) ? (set_binary_mode (fd, O_BINARY), 0) : 0)) +#else +# define SET_BINARY(fd) ((void) set_binary_mode (fd, O_BINARY)) #endif #endif /* _BINARY_H */ diff --git a/modules/binary-io b/modules/binary-io index 4386ec924..dd4a13665 100644 --- a/modules/binary-io +++ b/modules/binary-io @@ -8,6 +8,7 @@ Depends-on: fcntl-h configure.ac: +AC_REQUIRE([AC_C_INLINE]) Makefile.am: lib_SOURCES += binary-io.h diff --git a/tests/test-binary-io.c b/tests/test-binary-io.c index c695454ec..4f284e701 100644 --- a/tests/test-binary-io.c +++ b/tests/test-binary-io.c @@ -30,26 +30,40 @@ #include "macros.h" int -main () +main (int argc, char *argv[]) { /* Test the O_BINARY macro. */ { int fd = - open ("t-bin-out2.tmp", O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0600); + open ("t-bin-out0.tmp", O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0600); if (write (fd, "Hello\n", 6) < 0) exit (1); close (fd); } { struct stat statbuf; - if (stat ("t-bin-out2.tmp", &statbuf) < 0) + if (stat ("t-bin-out0.tmp", &statbuf) < 0) exit (1); ASSERT (statbuf.st_size == 6); } - /* Test the SET_BINARY macro. */ - SET_BINARY (1); - fputs ("Hello\n", stdout); + switch (argv[1][0]) + { + case '1': + /* Test the set_binary_mode() function. */ + set_binary_mode (1, O_BINARY); + fputs ("Hello\n", stdout); + break; + + case '2': + /* Test the SET_BINARY macro. */ + SET_BINARY (1); + fputs ("Hello\n", stdout); + break; + + default: + break; + } return 0; } diff --git a/tests/test-binary-io.sh b/tests/test-binary-io.sh index 272edef17..c4dd6e929 100755 --- a/tests/test-binary-io.sh +++ b/tests/test-binary-io.sh @@ -3,9 +3,11 @@ tmpfiles="" trap 'rm -fr $tmpfiles' 1 2 3 15 -tmpfiles="$tmpfiles t-bin-out1.tmp t-bin-out2.tmp" -./test-binary-io${EXEEXT} > t-bin-out1.tmp || exit 1 -cmp t-bin-out1.tmp t-bin-out2.tmp > /dev/null || exit 1 +tmpfiles="$tmpfiles t-bin-out0.tmp t-bin-out1.tmp t-bin-out2.tmp" +./test-binary-io${EXEEXT} 1 > t-bin-out1.tmp || exit 1 +cmp t-bin-out0.tmp t-bin-out1.tmp > /dev/null || exit 1 +./test-binary-io${EXEEXT} 2 > t-bin-out2.tmp || exit 1 +cmp t-bin-out0.tmp t-bin-out2.tmp > /dev/null || exit 1 rm -fr $tmpfiles -- 2.11.0