summaryrefslogtreecommitdiff
path: root/src/fileio.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2015-01-15 17:50:50 +0200
committerEli Zaretskii <eliz@gnu.org>2015-01-15 17:50:50 +0200
commit0f238ea450b3a976f04c95c4cf8befaadad1cdd0 (patch)
treecd278a1441bd610bd91eb7fbd6f38aea7aa4bca8 /src/fileio.c
parent3b7eed4ebb3c18799ec791d0c6bd53c019f48f73 (diff)
downloademacs-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.c50
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