diff options
| author | Paul Eggert | 2016-01-03 15:00:49 -0800 |
|---|---|---|
| committer | Paul Eggert | 2016-01-03 15:04:07 -0800 |
| commit | e79b06e6def82fab56a153085bff8223876d5908 (patch) | |
| tree | 3fa986746456718707c735b0abda48c092945479 /lib/ignore-value.h | |
| parent | 861022ff5f7b8d6ab53c726e009208eadf4ecd41 (diff) | |
| download | emacs-e79b06e6def82fab56a153085bff8223876d5908.tar.gz emacs-e79b06e6def82fab56a153085bff8223876d5908.zip | |
Avoid stdio in SIGINT handler
* admin/merge-gnulib (GNULIB_MODULES): Add ignore-value.
* lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
* lib/ignore-value.h: New file, from gnulib.
* src/keyboard.c: Include it.
(write_stdout, read_stdin): New functions.
(handle_interrupt): Use them instead of printf and getchar,
and avoid fflush when handling signals.
Diffstat (limited to 'lib/ignore-value.h')
| -rw-r--r-- | lib/ignore-value.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/ignore-value.h b/lib/ignore-value.h new file mode 100644 index 00000000000..6713d96f84e --- /dev/null +++ b/lib/ignore-value.h | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | /* ignore a function return without a compiler warning. -*- coding: utf-8 -*- | ||
| 2 | |||
| 3 | Copyright (C) 2008-2016 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | This program is free software: you can redistribute it and/or modify | ||
| 6 | it under the terms of the GNU General Public License as published by | ||
| 7 | the Free Software Foundation; either version 3 of the License, or | ||
| 8 | (at your option) any later version. | ||
| 9 | |||
| 10 | This program is distributed in the hope that it will be useful, | ||
| 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | GNU General Public License for more details. | ||
| 14 | |||
| 15 | You should have received a copy of the GNU General Public License | ||
| 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
| 17 | |||
| 18 | /* Written by Jim Meyering, Eric Blake and Pádraig Brady. */ | ||
| 19 | |||
| 20 | /* Use "ignore_value" to avoid a warning when using a function declared with | ||
| 21 | gcc's warn_unused_result attribute, but for which you really do want to | ||
| 22 | ignore the result. Traditionally, people have used a "(void)" cast to | ||
| 23 | indicate that a function's return value is deliberately unused. However, | ||
| 24 | if the function is declared with __attribute__((warn_unused_result)), | ||
| 25 | gcc issues a warning even with the cast. | ||
| 26 | |||
| 27 | Caution: most of the time, you really should heed gcc's warning, and | ||
| 28 | check the return value. However, in those exceptional cases in which | ||
| 29 | you're sure you know what you're doing, use this function. | ||
| 30 | |||
| 31 | For the record, here's one of the ignorable warnings: | ||
| 32 | "copy.c:233: warning: ignoring return value of 'fchown', | ||
| 33 | declared with attribute warn_unused_result". */ | ||
| 34 | |||
| 35 | #ifndef _GL_IGNORE_VALUE_H | ||
| 36 | #define _GL_IGNORE_VALUE_H | ||
| 37 | |||
| 38 | /* Normally casting an expression to void discards its value, but GCC | ||
| 39 | versions 3.4 and newer have __attribute__ ((__warn_unused_result__)) | ||
| 40 | which may cause unwanted diagnostics in that case. Use __typeof__ | ||
| 41 | and __extension__ to work around the problem, if the workaround is | ||
| 42 | known to be needed. */ | ||
| 43 | #if 3 < __GNUC__ + (4 <= __GNUC_MINOR__) | ||
| 44 | # define ignore_value(x) \ | ||
| 45 | (__extension__ ({ __typeof__ (x) __x = (x); (void) __x; })) | ||
| 46 | #else | ||
| 47 | # define ignore_value(x) ((void) (x)) | ||
| 48 | #endif | ||
| 49 | |||
| 50 | #endif | ||