]> code.delx.au - gnu-emacs/commitdiff
Add set-binary-mode primitive to switch a standard stream to binary I/O.
authorEli Zaretskii <eliz@gnu.org>
Thu, 15 Jan 2015 15:50:50 +0000 (17:50 +0200)
committerEli Zaretskii <eliz@gnu.org>
Thu, 15 Jan 2015 15:50:50 +0000 (17:50 +0200)
 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'.

admin/ChangeLog
admin/unidata/uvs.el
doc/lispref/ChangeLog
doc/lispref/streams.texi
etc/ChangeLog
etc/NEWS
src/ChangeLog
src/fileio.c

index 2b04281f4002892034636e45b963f9a2fcd8806b..70d1714f8ebd86bbfe2b19cb10a0befb6b228778 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        Say "ELC foo.elc" instead of "GEN foo.elc"
index 8bad523ce35de971bdb73025e02d54d495c6f29b..a6beac97db4a4adea0cc08c85000f43dee4bd1ca 100644 (file)
@@ -200,6 +200,7 @@ corresponding number."
           (insert-file-contents filename)
           (uvs-alist-from-ivd collection-id
                               sequence-id-to-glyph-func))))
+    (set-binary-mode 'stdout t)
     (princ "/* Automatically generated by uvs.el.  */\n")
     (princ
      (format "static const unsigned char mac_uvs_table_%s_bytes[] =\n  {\n"
index 941be3cf582fab6a091504873a5bc80152629098..4c0c116ba5adc3a5f9705e2ab638bca146ed6d3e 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        batch write-region no longer says "Wrote FOO"
index 5e4df009b73e01cb34b4bfe3172147ccbd2e8209..e52a543110b188ac6cd973401ef8f4082bb6d9d0 100644 (file)
@@ -339,6 +339,25 @@ shared structures.  @xref{Circular Objects}.  Its default value is
 @code{t}.
 @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
 @section Output Streams
 @cindex stream (for printing)
@@ -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.
 @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
 @section Variables Affecting Output
 @cindex output-controlling variables
index 20f88bdecc35024411932757f554efb1b1e04a06..681858e5977630ab8a03e829b1aef42cc27ddbc2 100644 (file)
@@ -1,3 +1,7 @@
+2015-01-15  Eli Zaretskii  <eliz@gnu.org>
+
+       * NEWS: Mention 'set-binary-mode'.
+
 2015-01-11  Paul Eggert  <eggert@cs.ucla.edu>
 
        Default to 'configure --enable-silent-rules'
index f291c0c9ad98534535af38179ee7deea0b85de15..0bfd3fd2a2ddc83f895513f571925966dbf13e71 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -588,6 +588,10 @@ been obsoleted.
 undocumented integer-pair format.  Instead, they return a list of two
 integers.
 
++++
+** New function `set-binary-mode' allows to switch a standard stream
+of the Emacs process to binary I/O mode.
+
 \f
 * Changes in Frames and Windows Code in Emacs 25.1
 
index 898c10a48e1145b56055e56d7fefa822392686a5..40d8b267d8454ff1cad9d233b65c751081e65c1c 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        * gnutls.c (init_gnutls_functions): Import gnutls_x509_crt_check_issuer.
index 6c443c91db73b6b235c458fa5f743768ea3008f4..dc67a00ed2a1a27612502413617ec6cc1d8d4a1b 100644 (file)
@@ -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;
 }
 
+\f
+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;
+}
+\f
 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