Commit 0f238ea4 authored by Eli Zaretskii's avatar Eli Zaretskii
Browse files

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'.
parent 3b7eed4e
2015-01-15 Eli Zaretskii <eliz@gnu.org>
* unidata/uvs.el (uvs-print-table-ivd): Call set-binary-mode on
stdout.
2015-01-12 Paul Eggert <eggert@cs.ucla.edu> 2015-01-12 Paul Eggert <eggert@cs.ucla.edu>
Say "ELC foo.elc" instead of "GEN foo.elc" Say "ELC foo.elc" instead of "GEN foo.elc"
......
...@@ -200,6 +200,7 @@ corresponding number." ...@@ -200,6 +200,7 @@ corresponding number."
(insert-file-contents filename) (insert-file-contents filename)
(uvs-alist-from-ivd collection-id (uvs-alist-from-ivd collection-id
sequence-id-to-glyph-func)))) sequence-id-to-glyph-func))))
(set-binary-mode 'stdout t)
(princ "/* Automatically generated by uvs.el. */\n") (princ "/* Automatically generated by uvs.el. */\n")
(princ (princ
(format "static const unsigned char mac_uvs_table_%s_bytes[] =\n {\n" (format "static const unsigned char mac_uvs_table_%s_bytes[] =\n {\n"
......
2015-01-15 Eli Zaretskii <eliz@gnu.org>
* streams.texi (Input Functions): Document 'set-binary-mode'.
(Output Functions): Cross-reference to documentation of
'set-binary-mode'.
2015-01-04 Paul Eggert <eggert@cs.ucla.edu> 2015-01-04 Paul Eggert <eggert@cs.ucla.edu>
batch write-region no longer says "Wrote FOO" batch write-region no longer says "Wrote FOO"
......
...@@ -339,6 +339,25 @@ shared structures. @xref{Circular Objects}. Its default value is ...@@ -339,6 +339,25 @@ shared structures. @xref{Circular Objects}. Its default value is
@code{t}. @code{t}.
@end defvar @end defvar
@cindex binary I/O in batch mode
When reading or writing from the standard input/output streams of the
Emacs process in batch mode, it is sometimes required to make sure any
arbitrary binary data will be read/written verbatim, and/or that no
translation of newlines to or from CR-LF pairs are performed. This
issue does not exist on Posix hosts, only on MS-Windows and MS-DOS.
The following function allows to control the I/O mode of any standard
stream of the Emacs process.
@defun set-binary-mode stream mode
Switch @var{stream} into binary or text I/O mode. If @var{mode} is
non-@code{nil}, switch to binary mode, otherwise switch to text mode.
The value of @var{stream} can be one of @code{stdin}, @code{stdout},
or @code{stderr}. This function flushes any pending output data of
@var{stream} as a side effect, and returns the previous value of I/O
mode for @var{stream}. On Posix hosts, it always returns a
non-@code{nil} value and does nothing except flushing pending output.
@end defun
@node Output Streams @node Output Streams
@section Output Streams @section Output Streams
@cindex stream (for printing) @cindex stream (for printing)
...@@ -686,6 +705,11 @@ This function outputs @var{object} to @var{stream}, just like ...@@ -686,6 +705,11 @@ This function outputs @var{object} to @var{stream}, just like
indent and fill the object to make it more readable for humans. indent and fill the object to make it more readable for humans.
@end defun @end defun
If you need to use binary I/O in batch mode, e.g., use the functions
described in this section to write out arbitrary binary data or avoid
conversion of newlines on non-Posix hosts, see @ref{Input Functions,
set-binary-mode}.
@node Output Variables @node Output Variables
@section Variables Affecting Output @section Variables Affecting Output
@cindex output-controlling variables @cindex output-controlling variables
......
2015-01-15 Eli Zaretskii <eliz@gnu.org>
* NEWS: Mention 'set-binary-mode'.
2015-01-11 Paul Eggert <eggert@cs.ucla.edu> 2015-01-11 Paul Eggert <eggert@cs.ucla.edu>
Default to 'configure --enable-silent-rules' Default to 'configure --enable-silent-rules'
......
...@@ -588,6 +588,10 @@ been obsoleted. ...@@ -588,6 +588,10 @@ been obsoleted.
undocumented integer-pair format. Instead, they return a list of two undocumented integer-pair format. Instead, they return a list of two
integers. integers.
+++
** New function `set-binary-mode' allows to switch a standard stream
of the Emacs process to binary I/O mode.
* Changes in Frames and Windows Code in Emacs 25.1 * Changes in Frames and Windows Code in Emacs 25.1
......
2015-01-15 Eli Zaretskii <eliz@gnu.org>
* fileio.c: Include binary-io.h.
(Fset_binary_mode): New function.
(syms_of_fileio): Defsubr it.
(syms_of_fileio) <Qstdin, Qstdout, Qstderr>: DEFSYM them.
2015-01-15 Teodor Zlatanov <tzz@lifelogs.com> 2015-01-15 Teodor Zlatanov <tzz@lifelogs.com>
* gnutls.c (init_gnutls_functions): Import gnutls_x509_crt_check_issuer. * gnutls.c (init_gnutls_functions): Import gnutls_x509_crt_check_issuer.
......
...@@ -86,6 +86,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ ...@@ -86,6 +86,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <careadlinkat.h> #include <careadlinkat.h>
#include <stat-time.h> #include <stat-time.h>
#include <binary-io.h>
#ifdef HPUX #ifdef HPUX
#include <netio.h> #include <netio.h>
#endif #endif
...@@ -5754,6 +5756,48 @@ before any other event (mouse or keypress) is handled. */) ...@@ -5754,6 +5756,48 @@ before any other event (mouse or keypress) is handled. */)
return Qnil; 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 void
init_fileio (void) init_fileio (void)
{ {
...@@ -6040,6 +6084,10 @@ This includes interactive calls to `delete-file' and ...@@ -6040,6 +6084,10 @@ This includes interactive calls to `delete-file' and
DEFSYM (Qsubstitute_env_in_file_name, "substitute-env-in-file-name"); DEFSYM (Qsubstitute_env_in_file_name, "substitute-env-in-file-name");
DEFSYM (Qget_buffer_window_list, "get-buffer-window-list"); DEFSYM (Qget_buffer_window_list, "get-buffer-window-list");
DEFSYM (Qstdin, "stdin");
DEFSYM (Qstdout, "stdout");
DEFSYM (Qstderr, "stderr");
defsubr (&Sfind_file_name_handler); defsubr (&Sfind_file_name_handler);
defsubr (&Sfile_name_directory); defsubr (&Sfile_name_directory);
defsubr (&Sfile_name_nondirectory); defsubr (&Sfile_name_nondirectory);
...@@ -6089,6 +6137,8 @@ This includes interactive calls to `delete-file' and ...@@ -6089,6 +6137,8 @@ This includes interactive calls to `delete-file' and
defsubr (&Snext_read_file_uses_dialog_p); defsubr (&Snext_read_file_uses_dialog_p);
defsubr (&Sset_binary_mode);
#ifdef HAVE_SYNC #ifdef HAVE_SYNC
defsubr (&Sunix_sync); defsubr (&Sunix_sync);
#endif #endif
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment