diff options
author | Eli Zaretskii <eliz@gnu.org> | 2015-01-15 17:50:50 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2015-01-15 17:50:50 +0200 |
commit | 0f238ea450b3a976f04c95c4cf8befaadad1cdd0 (patch) | |
tree | cd278a1441bd610bd91eb7fbd6f38aea7aa4bca8 /src/fileio.c | |
parent | 3b7eed4ebb3c18799ec791d0c6bd53c019f48f73 (diff) | |
download | emacs-0f238ea450b3a976f04c95c4cf8befaadad1cdd0.tar.gz |
Add set-binary-mode primitive to switch a standard stream to binary I/O.
src/fileio.c: Include binary-io.h.
(Fset_binary_mode): New function.
(syms_of_fileio): Defsubr it.
(syms_of_fileio) <Qstdin, Qstdout, Qstderr>: DEFSYM them.
admin/unidata/unidata/uvs.el (uvs-print-table-ivd): Call set-binary-mode on
stdout.
doc/lispref/streams.texi (Input Functions): Document 'set-binary-mode'.
(Output Functions): Cross-reference to documentation of
'set-binary-mode'.
etc/NEWS: Mention 'set-binary-mode'.
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/fileio.c b/src/fileio.c index 6c443c91db7..dc67a00ed2a 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -86,6 +86,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include <careadlinkat.h> #include <stat-time.h> +#include <binary-io.h> + #ifdef HPUX #include <netio.h> #endif @@ -5754,6 +5756,48 @@ before any other event (mouse or keypress) is handled. */) return Qnil; } + +DEFUN ("set-binary-mode", Fset_binary_mode, Sset_binary_mode, 2, 2, 0, + doc: /* Switch STREAM to binary I/O mode or text I/O mode. +STREAM can be one of the symbols `stdin', `stdout', or `stderr'. +If MODE is non-nil, switch STREAM to binary mode, otherwise switch +it to text mode. + +As a side effect, this function flushes any pending STREAM's data. + +Value is the previous value of STREAM's I/O mode, nil for text mode, +non-nil for binary mode. + +On MS-Windows and MS-DOS, binary mode is needed to read or write +arbitrary binary data, and for disabling translation between CR-LF +pairs and a single newline character. Examples include generation +of text files with Unix-style end-of-line format using `princ' in +batch mode, with standard output redirected to a file. + +On Posix systems, this function always returns non-nil, and has no +effect except for flushing STREAM's data. */) + (Lisp_Object stream, Lisp_Object mode) +{ + FILE *fp = NULL; + int binmode; + + CHECK_SYMBOL (stream); + if (EQ (stream, Qstdin)) + fp = stdin; + else if (EQ (stream, Qstdout)) + fp = stdout; + else if (EQ (stream, Qstderr)) + fp = stderr; + else + xsignal2 (Qerror, build_string ("unsupported stream"), stream); + + binmode = NILP (mode) ? O_TEXT : O_BINARY; + if (fp != stdin) + fflush (fp); + + return (set_binary_mode (fileno (fp), binmode) == O_BINARY) ? Qt : Qnil; +} + void init_fileio (void) { @@ -6040,6 +6084,10 @@ This includes interactive calls to `delete-file' and DEFSYM (Qsubstitute_env_in_file_name, "substitute-env-in-file-name"); DEFSYM (Qget_buffer_window_list, "get-buffer-window-list"); + DEFSYM (Qstdin, "stdin"); + DEFSYM (Qstdout, "stdout"); + DEFSYM (Qstderr, "stderr"); + defsubr (&Sfind_file_name_handler); defsubr (&Sfile_name_directory); defsubr (&Sfile_name_nondirectory); @@ -6089,6 +6137,8 @@ This includes interactive calls to `delete-file' and defsubr (&Snext_read_file_uses_dialog_p); + defsubr (&Sset_binary_mode); + #ifdef HAVE_SYNC defsubr (&Sunix_sync); #endif |