summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/expl3/l3io.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3io.dtx')
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3io.dtx927
1 files changed, 0 insertions, 927 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3io.dtx b/Master/texmf-dist/source/latex/expl3/l3io.dtx
deleted file mode 100644
index 4f31a349b71..00000000000
--- a/Master/texmf-dist/source/latex/expl3/l3io.dtx
+++ /dev/null
@@ -1,927 +0,0 @@
-% \iffalse
-%% File: l3io.dtx Copyright (C) 1990-2010 LaTeX3 project
-%%
-%% It may be distributed and/or modified under the conditions of the
-%% LaTeX Project Public License (LPPL), either version 1.3c of this
-%% license or (at your option) any later version. The latest version
-%% of this license is in the file
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
-%% and all files in that bundle must be distributed together.
-%%
-%% The released version of this bundle is available from CTAN.
-%%
-%% -----------------------------------------------------------------------
-%%
-%% The development version of the bundle can be found at
-%%
-%% http://www.latex-project.org/svnroot/experimental/trunk/
-%%
-%% for those people who are interested.
-%%
-%%%%%%%%%%%
-%% NOTE: %%
-%%%%%%%%%%%
-%%
-%% Snapshots taken from the repository represent work in progress and may
-%% not work or may contain conflicting material! We therefore ask
-%% people _not_ to put them into distributions, archives, etc. without
-%% prior consultation with the LaTeX Project Team.
-%%
-%% -----------------------------------------------------------------------
-%
-%<*driver|package>
-\RequirePackage{l3names}
-%</driver|package>
-%\fi
-\GetIdInfo$Id: l3io.dtx 2063 2010-10-03 08:26:49Z mittelba $
- {L3 Experimental i/o module}
-%\iffalse
-%<*driver>
-%\fi
-\ProvidesFile{\filename.\filenameext}
- [\filedate\space v\fileversion\space\filedescription]
-%\iffalse
-\documentclass[full]{l3doc}
-\begin{document}
- \DocInput{l3io.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{The \textsf{l3io} package\thanks{This file
-% has version number \fileversion, last
-% revised \filedate.}\\
-% Low-level file i/o}
-% \author{\Team}
-% \date{\filedate}
-% \maketitle
-%
-%\begin{documentation}
-%
-% Reading and writing from file streams is handled in \LaTeX3 using
-% functions with prefixes \cs{iow_\ldots} (file reading) and
-% \cs{ior_\ldots} (file writing). Many of the basic functions are
-% very similar, with reading and writing using the same syntax and
-% function concepts. As a result, the reading and writing functions
-% are documented together where this makes sense.
-%
-% As \TeX\ is limited to \(16\) input streams and \(16\) output
-% streams, direct use of the streams by the programmer is not
-% supported in \LaTeX3. Instead, an internal pool of streams is
-% maintained, and these are allocated and deallocated as needed
-% by other modules. As a result, the programmer should close streams
-% when they are no longer needed, to release them for other processes.
-%
-% Reading from or writing to a file requires a \meta{stream} to
-% be used. This is a csname which refers to the file being processed,
-% and is independent of the name of the file (except of course that
-% the file name is needed when the file is opened).
-%
-%\section{Opening and closing streams}
-%
-%\begin{function}{
-% \iow_new:N |
-% \iow_new:c |
-% \ior_new:N |
-% \ior_new:c
-%}
-% \begin{syntax}
-% "\iow_new:N" <stream>
-% \end{syntax}
-% Reserves the name <stream> for use in accessing a file stream.
-% This operation does not open a raw \TeX\ stream, which is handled
-% internally using a pool and is should not be accessed directly by
-% the programmer.
-%\end{function}
-%
-%\begin{function}{
-% \iow_open:Nn |
-% \iow_open:cn |
-% \ior_open:Nn |
-% \ior_open:cn
-%}
-% \begin{syntax}
-% "\iow_open:Nn" <stream> \Arg{file name}
-% "\iow_open:Nn" <stream> \Arg{file name}
-% \end{syntax}
-% Opens <file name> for writing (\cs{iow_\ldots}) or reading
-% (\cs{ior_\ldots}) using <stream> as the csname by which the
-% file is accessed. If <stream> was already open (for either writing
-% or reading) it is closed before the new operation begins. The
-% <stream> is available for access immediately after issuing an
-% \texttt{open} instruction. The <stream> will remain allocated
-% to <file name> until a \texttt{close} instruction is given or at
-% the end of the \TeX\ run.
-%
-% Opening a file for writing will clear any existing content in the
-% file (\emph{i.e}.~writing is \emph{not} additive). As the total
-% number of writing streams is limited, it may well be best to save
-% material to be written to an intermediate storage format (for example
-% a token list or toks), and to write the material in one `shot'
-% from this variable. In this way the file stream is only required
-% for a limited time.
-%\end{function}
-%
-%\begin{function}{
-% \iow_close:N |
-% \iow_close:c |
-% \ior_close:N |
-% \ior_close:c
-%}
-% \begin{syntax}
-% "\iow_close:N" <stream>
-% "\ior_close:N" <stream>
-% \end{syntax}
-% Closes <stream>, freeing up one of the underlying \TeX\ streams
-% for reuse. Streams should always be closed when they are finished
-% with as this ensures that they remain available to other
-% programmers (the resources here are limited). The name of
-% the <stream> will be freed at this stage, to ensure that any
-% further attempts to write to it result in an error.
-%\end{function}
-%
-%\begin{function}{
-% \iow_open_streams: |
-% \iow_open_streams:
-%}
-% \begin{syntax}
-% "\iow_open_streams:"
-% \end{syntax}
-% Displays a list of the file names associated with each open
-% stream: intended for tracking down problems.
-%\end{function}
-%
-%\subsection{Writing to files}
-%
-%\begin{function}{
-% \iow_now:Nx |
-% \iow_now:Nn
-%}
-% \begin{syntax}
-% "\iow_now:Nx" <stream> \Arg{tokens}
-% \end{syntax}
-% \cs{iow_now:Nx} immediately writes the expansion of <tokens> to the
-% output <stream>. If the <stream> is not open output goes to the
-% terminal. The variant \cs{iow_now:Nn} writes out <tokens> without any
-% further expansion.
-% \begin{texnote}
-% These are the equivalent of \TeX's "\immediate\write" with and
-% without expansion control.
-% \end{texnote}
-%\end{function}
-%
-%\begin{function}{
-% \iow_log:n |
-% \iow_log:x |
-% \iow_term:n |
-% \iow_term:x
-%}
-% \begin{syntax}
-% "\iow_log:x" \Arg{tokens}
-% \end{syntax}
-% These are dedicated functions which write to the log (transcript)
-% file and the terminal, respectively. They are equivalent to using
-% \cs{iow_now:N(n/x)} to the streams \cs{c_iow_log_stream} and
-% \cs{c_iow_term_stream}. The writing takes place immediately.
-% \end{function}
-%
-%\begin{function}{
-% \iow_now_buffer_safe:Nn |
-% \iow_now_buffer_safe:Nx
-%}
-% \begin{syntax}
-% "\iow_now_buffer_safe:Nn" <stream> \Arg{tokens}
-% \end{syntax}
-% Immediately write <tokens> expanded to <stream>, with every space
-% converted into a newline. This mean that the file can be
-% read back without the danger that very long lines overflow
-% \TeX's buffer.
-% \end{function}
-%
-%\begin{function}{
-% \iow_now_when_avail:Nn |
-% \iow_now_when_avail:cn |
-% \iow_now_when_avail:Nx |
-% \iow_now_when_avail:cx
-%}
-% \begin{syntax}
-% "\iow_now_when_avail:Nn" <stream> \Arg{tokens}
-% \end{syntax}
-% If <stream> is open, writes the <tokens> to the <stream> in the
-% same manner as \cs{iow_now:N(n/x)}. If the <stream> is not open,
-% the <tokens> are simply thrown away.
-%\end{function}
-%
-%\begin{function}{
-% \iow_shipout:Nx |
-% \iow_shipout:Nn
-%}
-% \begin{syntax}
-% "\iow_shipout:Nx" <stream> \Arg{tokens}
-% \end{syntax}
-% Write <tokens> to <stream> at the point at which the current page
-% is finished. The <tokens> are either written unexpanded
-% (\cs{iow_shipout:Nn}) or expanded only at the point that the
-% function is used (\cs{iow_shipout:Nx}), \emph{i.e}.~no expansion
-% takes place when writing to the file.
-%\end{function}
-%
-%\begin{function}{
-% \iow_shipout_x:Nx |
-% \iow_shipout_x:Nn
-%}
-% \begin{syntax}
-% "\iow_shipout_x:Nx" <stream> \Arg{tokens}
-% \end{syntax}
-% Write <tokens> to <stream> at the point at which the current page
-% is finished. The <tokens> are expanded at the time of writing
-% in addition to any expansion at the time of use of the function.
-% This makes these functions suitable for including material finalised
-% during the page building process (such as the page number integer).
-% \begin{texnote}
-% These are the equivalent of \TeX's \cs{write} with and
-% without expansion control at point of use.
-% \end{texnote}
-%\end{function}
-%
-%\begin{function}{\iow_newline: / (EXP) }
-% \begin{syntax}
-% "\iow_newline:"
-% \end{syntax}
-% Function to add a new line within the <tokens> written to a file.
-% The function has no effect if writing is taking place without
-% expansion (\emph{e.g}.~in a \cs{iow_now:Nn} call).
-%\end{function}
-%
-%\begin{function}{\iow_char:N / (EXP) }
-% \begin{syntax}
-% "\iow_char:N" "\"<char>
-% "\iow_char:N" "\%"
-% \end{syntax}
-% Inserts <char> into the output stream. Useful when trying to write
-% difficult characters such as "%", "{", "}", \emph{etc}.~in messages,
-% for example:
-% \begin{verbatim}
-% \iow_now:Nx \g_my_stream { \iow_char:N \{ text \iow_char:N \} }
-% \end{verbatim}
-% The function has no effect if writing is taking place without
-% expansion (\emph{e.g}.~in a \cs{iow_now:Nn} call).
-%\end{function}
-%
-%\subsection{Reading from files}
-%
-%\begin{function}{
-% \ior_to:NN |
-% \ior_gto:NN
-%}
-% \begin{syntax}
-% "\ior_to:NN" <stream> <token list variable>
-% \end{syntax}
-% Functions that reads one or more lines (until an equal number of left
-% and right braces are found) from the input stream <stream> and places
-% the result locally or globally into the <token list variable>.
-% If <stream> is not open, input is requested from the terminal.
-%\end{function}
-%
-%\begin{function}{
-% \ior_if_eof_p:N / (EXP) |
-% \ior_if_eof:N / (EXP) (TF)
-%}
-% \begin{syntax}
-% "\ior_if_eof:NTF" <stream> \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if the end of a <stream> has been reached during a reading
-% operation. The test will also return a \texttt{true} value if
-% the <stream> is not open or the <file name> associated with
-% a <stream> does not exist at all.
-%\end{function}
-%
-%\section{Internal functions}
-%
-%\begin{function}{
-% \iow_raw_new:N |
-% \iow_raw_new:c |
-% \ior_raw_new:N |
-% \ior_raw_new:c
-%}
-% \begin{syntax}
-% "\iow_raw_new:N" <stream>
-% \end{syntax}
-% Creates a new low-level <stream> for use in subsequent functions.
-% As allocations are made using a pool \emph{do not use this function!}
-% \begin{texnote}
-% This is \LaTeXe's \cs{newwrite}.
-% \end{texnote}
-%\end{function}
-%
-%\begin{function}{\if_eof:w / (EXP) }
-% \begin{syntax}
-% "\if_eof:w" <stream> <true code> "\else:" <false code> "\fi:"
-% \end{syntax}
-% Tests if the end of <stream> has been reached during a reading
-% operation.
-% \begin{texnote}
-% This is the primitive \cs{ifeof}.
-% \end{texnote}
-%\end{function}
-%
-%\section{Variables and constants}
-%
-%\begin{variable}{\c_io_streams_tl}
-% A list of the positions available for stream allocation (numbers
-% \(0\) to \(15\)).
-%\end{variable}
-%
-%\begin{variable}{
-% \c_iow_term_stream |
-% \c_ior_term_stream |
-% \c_iow_log_stream |
-% \c_ior_log_stream
-%}
-% Fixed stream numbers for accessing to the log and the terminal. The
-% reading and writing values are the same but are provided so that the
-% meaning is clear.
-%\end{variable}
-%
-%\begin{variable}{
-% \g_iow_streams_prop |
-% \g_ior_streams_prop
-%}
-% Allocation records for streams, linking the stream number to
-% the current name being used for that stream.
-%\end{variable}
-%
-%\begin{variable}{
-% \g_iow_tmp_stream |
-% \g_ior_tmp_stream
-%}
-% Used when creating new streams at the \TeX\ level.
-%\end{variable}
-%
-%\begin{variable}{
-% \l_iow_stream_int |
-% \l_ior_stream_int
-%}
-% Number of stream currently being allocated.
-%\end{variable}
-%
-%\end{documentation}
-%
-%\begin{implementation}
-%
-%\section{\pkg{l3io} implementation}
-%
-% We start by ensuring that the required packages are loaded.
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage
- {\filename}{\filedate}{\fileversion}{\filedescription}
-\package_check_loaded_expl:
-%</package>
-%<*initex|package>
-% \end{macrocode}
-%
-%\subsection{Variables and constants}
-%
-%\begin{macro}{\c_iow_term_stream}
-%\begin{macro}{\c_ior_term_stream}
-%\begin{macro}{\c_iow_log_stream}
-%\begin{macro}{\c_ior_log_stream}
-% Here we allocate two output streams for writing to the transcript
-% file only (\cs{c_iow_log_stream}) and to both the terminal and
-% transcript file (\cs{c_iow_term_stream}). Both can be used to read
-% from and have equivalent \cs{c_ior} versions.
-% \begin{macrocode}
-\cs_new_eq:NN \c_iow_term_stream \c_sixteen
-\cs_new_eq:NN \c_ior_term_stream \c_sixteen
-\cs_new_eq:NN \c_iow_log_stream \c_minus_one
-\cs_new_eq:NN \c_ior_log_stream \c_minus_one
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\c_iow_streams_tl}
-%\begin{macro}{\c_ior_streams_tl}
-% The list of streams available, by number.
-% \begin{macrocode}
-\tl_const:Nn \c_iow_streams_tl
- {
- \c_zero
- \c_one
- \c_two
- \c_three
- \c_four
- \c_five
- \c_six
- \c_seven
- \c_eight
- \c_nine
- \c_ten
- \c_eleven
- \c_twelve
- \c_thirteen
- \c_fourteen
- \c_fifteen
- }
-\cs_new_eq:NN \c_ior_streams_tl \c_iow_streams_tl
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\g_iow_streams_prop}
-%\begin{macro}{\g_ior_streams_prop}
-% The allocations for streams are stored in property lists, which
-% are set up to have a 'full' set of allocations from the start.
-% In package mode, a few slots are always taken, so these are
-% blocked off from use.
-% \begin{macrocode}
-\prop_new:N \g_iow_streams_prop
-\prop_new:N \g_ior_streams_prop
-%</initex|package>
-%<*package>
-\prop_put:Nnn \g_iow_streams_prop { 0 } { LaTeX2e~reserved }
-\prop_put:Nnn \g_iow_streams_prop { 1 } { LaTeX2e~reserved }
-\prop_put:Nnn \g_iow_streams_prop { 2 } { LaTeX2e~reserved }
-\prop_put:Nnn \g_ior_streams_prop { 0 } { LaTeX2e~reserved }
-%</package>
-%<*initex|package>
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\l_iow_stream_int}
-%\begin{macro}{\l_ior_stream_int}
-% Used to track the number allocated to the stream being created:
-% this is taken from the property list but does alter.
-% \begin{macrocode}
-\int_new:N \l_iow_stream_int
-\cs_new_eq:NN \l_ior_stream_int \l_iow_stream_int
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%\subsection{Stream management}
-%
-%\begin{macro}{\iow_raw_new:N}
-%\begin{macro}{\ior_raw_new:N}
-% The lowest level for stream management is actually creating raw \TeX\
-% streams. As these are very limited (even with \eTeX) this should not
-% be addressed directly.
-% \begin{macrocode}
-%</initex|package>
-%<*initex>
-\alloc_setup_type:nnn { iow } \c_zero \c_sixteen
-\cs_new_protected_nopar:Npn \iow_raw_new:N #1 {
- \alloc_reg:NnNN g { iow } \tex_chardef:D #1
-}
-\alloc_setup_type:nnn { ior } \c_zero \c_sixteen
-\cs_new_protected_nopar:Npn \ior_raw_new:N #1 {
- \alloc_reg:NnNN g { ior } \tex_chardef:D #1
-}
-%</initex>
-%<*package>
-\cs_set_eq:NN \iow_raw_new:N \newwrite
-\cs_set_eq:NN \ior_raw_new:N \newread
-%</package>
-%<*initex|package>
-\cs_generate_variant:Nn \iow_raw_new:N { c }
-\cs_generate_variant:Nn \ior_raw_new:N { c }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\iow_new:N}
-%\begin{macro}{\iow_new:c}
-%\begin{macro}{\ior_new:N}
-%\begin{macro}{\ior_new:c}
-% These are not needed but are included for consistency with other
-% variable types.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_new:N #1 {
- \cs_new_eq:NN #1 \c_iow_log_stream
-}
-\cs_generate_variant:Nn \iow_new:N { c }
-\cs_new_protected_nopar:Npn \ior_new:N #1 {
- \cs_new_eq:NN #1 \c_ior_log_stream
-}
-\cs_generate_variant:Nn \ior_new:N { c }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\iow_open:Nn}
-%\begin{macro}{\iow_open:cn}
-%\begin{macro}{\ior_open:Nn}
-%\begin{macro}{\ior_open:cn}
-% In both cases, opening a stream starts with a call to the closing
-% function: this is safest. There is then a loop through the
-% allocation number list to find the first free stream number.
-% When one is found the allocation can take place, the information
-% can be stored and finally the file can actually be opened.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_open:Nn #1#2 {
- \iow_close:N #1
- \int_set:Nn \l_iow_stream_int { \c_sixteen }
- \tl_map_function:NN \c_iow_streams_tl \iow_alloc_write:n
- \int_compare:nTF { \l_iow_stream_int = \c_sixteen }
- { \msg_kernel_error:nn { iow } { streams-exhausted } }
- {
- \iow_stream_alloc:N #1
- \prop_gput:NVn \g_iow_streams_prop \l_iow_stream_int {#2}
- \tex_immediate:D \tex_openout:D #1#2 \scan_stop:
- }
-}
-\cs_generate_variant:Nn \iow_open:Nn { c }
-\cs_new_protected_nopar:Npn \ior_open:Nn #1#2 {
- \ior_close:N #1
- \int_set:Nn \l_ior_stream_int { \c_sixteen }
- \tl_map_function:NN \c_ior_streams_tl \ior_alloc_read:n
- \int_compare:nTF { \l_ior_stream_int = \c_sixteen }
- { \msg_kernel_error:nn { ior } { streams-exhausted } }
- {
- \ior_stream_alloc:N #1
- \prop_gput:NVn \g_ior_streams_prop \l_ior_stream_int {#2}
- \tex_openin:D #1#2 \scan_stop:
- }
-}
-\cs_generate_variant:Nn \ior_open:Nn { c }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}[aux]{\iow_alloc_write:n}
-%\begin{macro}[aux]{\ior_alloc_read:n}
-% These functions are used to see if a particular stream is available.
-% The property list contains file names for streams in use, so
-% any unused ones are for the taking.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_alloc_write:n #1 {
- \prop_if_in:NnF \g_iow_streams_prop {#1}
- {
- \int_set:Nn \l_iow_stream_int {#1}
- \tl_map_break:
- }
-}
-\cs_new_protected_nopar:Npn \ior_alloc_read:n #1 {
- \prop_if_in:NnF \g_iow_streams_prop {#1}
- {
- \int_set:Nn \l_ior_stream_int {#1}
- \tl_map_break:
- }
-}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}[aux]{\iow_stream_alloc:N}
-%\begin{macro}[aux]{\ior_stream_alloc:N}
-%\begin{macro}[aux]{\iow_stream_alloc_aux:}
-%\begin{macro}[aux]{\ior_stream_alloc_aux:}
-%\begin{macro}[aux]{\g_iow_tmp_stream}
-%\begin{macro}[aux]{\g_ior_tmp_stream}
-% Allocating a raw stream is much easier in initex mode than for
-% the package. For the format, all streams will be allocated by
-% \pkg{l3io} and so there is a simple check to see if a raw
-% stream is actually available. On the other hand, for the
-% package there will be non-managed streams. So if the managed
-% one is not open, a check is made to see if some other managed
-% stream is available before deciding to open a new one. If a new
-% one is needed, we get the number allocated by \LaTeXe\ to get
-% `back on track' with allocation.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_stream_alloc:N #1 {
- \cs_if_exist:cTF { g_iow_ \int_use:N \l_iow_stream_int _stream }
- { \cs_gset_eq:Nc #1 { g_iow_ \int_use:N \l_iow_stream_int _stream } }
- {
-%</initex|package>
-%<*package>
- \iow_stream_alloc_aux:
- \int_compare:nT { \l_iow_stream_int = \c_sixteen }
- {
- \iow_raw_new:N \g_iow_tmp_stream
- \int_set:Nn \l_iow_stream_int { \g_iow_tmp_stream }
- \cs_gset_eq:cN
- { g_iow_ \int_use:N \l_iow_stream_int _stream }
- \g_iow_tmp_stream
- }
-%</package>
-%<*initex>
- \iow_raw_new:c { g_iow_ \int_use:N \l_iow_stream_int _stream }
-%</initex>
-%<*initex|package>
- \cs_gset_eq:Nc #1 { g_iow_ \int_use:N \l_iow_stream_int _stream }
- }
-}
-%</initex|package>
-%<*package>
-\cs_new_protected_nopar:Npn \iow_stream_alloc_aux: {
- \int_incr:N \l_iow_stream_int
- \int_compare:nT
- { \l_iow_stream_int < \c_sixteen }
- {
- \cs_if_exist:cTF { g_iow_ \int_use:N \l_iow_stream_int _stream }
- {
- \prop_if_in:NVT \g_iow_streams_prop \l_iow_stream_int
- { \iow_stream_alloc_aux: }
- }
- { \iow_stream_alloc_aux: }
- }
-}
-%</package>
-%<*initex|package>
-\cs_new_protected_nopar:Npn \ior_stream_alloc:N #1 {
- \cs_if_exist:cTF { g_ior_ \int_use:N \l_ior_stream_int _stream }
- { \cs_gset_eq:Nc #1 { g_ior_ \int_use:N \l_ior_stream_int _stream } }
- {
-%</initex|package>
-%<*package>
- \ior_stream_alloc_aux:
- \int_compare:nT { \l_ior_stream_int = \c_sixteen }
- {
- \ior_raw_new:N \g_ior_tmp_stream
- \int_set:Nn \l_ior_stream_int { \g_ior_tmp_stream }
- \cs_gset_eq:cN
- { g_ior_ \int_use:N \l_iow_stream_int _stream }
- \g_ior_tmp_stream
- }
-%</package>
-%<*initex>
- \ior_raw_new:c { g_ior_ \int_use:N \l_ior_stream_int _stream }
-%</initex>
-%<*initex|package>
- \cs_gset_eq:Nc #1 { g_ior_ \int_use:N \l_ior_stream_int _stream }
- }
-}
-%</initex|package>
-%<*package>
-\cs_new_protected_nopar:Npn \ior_stream_alloc_aux: {
- \int_incr:N \l_ior_stream_int
- \int_compare:nT
- { \l_ior_stream_int < \c_sixteen }
- {
- \cs_if_exist:cTF { g_ior_ \int_use:N \l_ior_stream_int _stream }
- {
- \prop_if_in:NVT \g_ior_streams_prop \l_ior_stream_int
- { \ior_stream_alloc_aux: }
- }
- { \ior_stream_alloc_aux: }
- }
-}
-%</package>
-%<*initex|package>
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\iow_close:N}
-%\begin{macro}{\iow_close:c}
-%\begin{macro}{\iow_close:N}
-%\begin{macro}{\iow_close:c}
-% Closing a stream is not quite the reverse of opening one. First,
-% the close operation is easier than the open one, and second as the
-% stream is actually a number we can use it directly to show that the
-% slot has been freed up.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_close:N #1 {
- \cs_if_exist:NT #1
- {
- \int_compare:nF { #1 = \c_minus_one }
- {
- \tex_immediate:D \tex_closeout:D #1
- \prop_gdel:NV \g_iow_streams_prop #1
- \cs_gundefine:N #1
- }
- }
-}
-\cs_generate_variant:Nn \iow_close:N { c }
-\cs_new_protected_nopar:Npn \ior_close:N #1 {
- \cs_if_exist:NT #1
- {
- \int_compare:nF { #1 = \c_minus_one }
- {
- \tex_closein:D #1
- \prop_gdel:NV \g_ior_streams_prop #1
- \cs_gundefine:N #1
- }
- }
-}
-\cs_generate_variant:Nn \ior_close:N { c }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\iow_open_streams:}
-%\begin{macro}{\ior_open_streams:}
-% Simply show the property lists.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_open_streams: {
- \prop_display:N \g_iow_streams_prop
-}
-\cs_new_protected_nopar:Npn \ior_open_streams: {
- \prop_display:N \g_ior_streams_prop
-}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-% Text for the error messages.
-% \begin{macrocode}
-\msg_kernel_new:nnnn { iow } { streams-exhausted }
- {Output streams exhausted}
- {%
- TeX can only open up to 16 output streams at one time.\\%
- All 16 are currently in use, and something wanted to open
- another one.%
- }
-\msg_kernel_new:nnnn { ior } { streams-exhausted }
- {Input streams exhausted}
- {%
- TeX can only open up to 16 input streams at one time.\\%
- All 16 are currently in use, and something wanted to open
- another one.%
- }
-% \end{macrocode}
-%
-%\subsection{Immediate writing}
-%
-%\begin{macro}{\iow_now:Nx}
-% An abbreviation for an often used operation, which immediately
-% writes its second argument expanded to the output stream.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_now:Nx { \tex_immediate:D \iow_shipout_x:Nn }
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\iow_now:Nn}
-% This routine writes the second argument onto the output stream without
-% expansion. If this stream isn't open, the output goes to the terminal
-% instead. If the first argument is no output stream at all, we get an
-% internal error.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_now:Nn #1#2 {
- \iow_now:Nx #1 { \exp_not:n {#2} }
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\iow_log:n}
-%\begin{macro}{\iow_log:x}
-%\begin{macro}{\iow_term:n}
-%\begin{macro}{\iow_term:x}
-% Now we redefine two functions for which we needed a definition
-% very early on.
-% \begin{macrocode}
-\cs_set_protected_nopar:Npn \iow_log:x { \iow_now:Nx \c_iow_log_stream }
-\cs_new_protected_nopar:Npn \iow_log:n { \iow_now:Nn \c_iow_log_stream }
-\cs_set_protected_nopar:Npn \iow_term:x { \iow_now:Nx \c_iow_term_stream }
-\cs_new_protected_nopar:Npn \iow_term:n { \iow_now:Nn \c_iow_term_stream }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\iow_now_when_avail:Nn}
-%\begin{macro}{\iow_now_when_avail:cn}
-%\begin{macro}{\iow_now_when_avail:Nx}
-%\begin{macro}{\iow_now_when_avail:cx}
-% For writing only if the stream requested is open at all.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_now_when_avail:Nn #1 {
- \cs_if_free:NTF #1 { \use_none:n } { \iow_now:Nn #1 }
-}
-\cs_generate_variant:Nn \iow_now_when_avail:Nn { c }
-\cs_new_protected_nopar:Npn \iow_now_when_avail:Nx #1 {
- \cs_if_free:NTF #1 { \use_none:n } { \iow_now:Nx #1 }
-}
-\cs_generate_variant:Nn \iow_now_when_avail:Nx { c }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\iow_now_buffer_safe:Nn}
-%\begin{macro}{\iow_now_buffer_safe:Nx}
-%\begin{macro}[aux]{\iow_now_buffer_safe_expanded_aux:w}
-% Another type of writing onto an output stream is used for
-% potentially long token sequences. We break the output lines at
-% every blank in the second argument. This avoids the problem of
-% buffer overflow when reading back, or badly broken lines on
-% systems with limited file records. The only thing we have to
-% take care of, is the danger of two blanks in succession since
-% these get converted into a \cs{par} when we read the stuff back.
-% But this can happen only if things like two spaces find their way
-% into the second argument. Usually, multiple spaces are removed by
-% \TeX's scanner.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_now_buffer_safe:Nn {
- \iow_now_buffer_safe_aux:w \iow_now:Nx
-}
-\cs_new_protected_nopar:Npn \iow_now_buffer_safe:Nx {
- \iow_now_buffer_safe_aux:w \iow_now:Nn
-}
-\cs_new_protected_nopar:Npn \iow_now_buffer_safe_aux:w #1#2#3 {
- \group_begin: \tex_newlinechar:D`\ #1#2 {#3} \group_end:
-}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\subsection{Deferred writing}
-%
-%\begin{macro}{\iow_shipout_x:Nn}
-%\begin{macro}{\iow_shipout_x:Nx}
-% First the easy part, this is the primitive.
-% \begin{macrocode}
-\cs_set_eq:NN \iow_shipout_x:Nn \tex_write:D
-\cs_generate_variant:Nn \iow_shipout_x:Nn {Nx }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\iow_shipout:Nn}
-%\begin{macro}{\iow_shipout:Nx}
-% With \eTeX\ available deferred writing is easy.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \iow_shipout:Nn #1#2 {
- \iow_shipout_x:Nn #1 { \exp_not:n {#2} }
-}
-\cs_generate_variant:Nn \iow_shipout:Nn { Nx }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%\section{Special characters for writing}
-%
-%\begin{macro}{\iow_newline:}
-% Global variable holding the character that forces a new line when
-% something is written to an output stream.
-% \begin{macrocode}
-\cs_new_nopar:Npn \iow_newline: { ^^J }
-% \end{macrocode}
-% \end{macro}
-%
-%\begin{macro}{\iow_char:N}
-% Function to write any escaped char to an output stream.
-% \begin{macrocode}
-\cs_new:Npn \iow_char:N #1 { \cs_to_str:N #1 }
-% \end{macrocode}
-%\end{macro}
-%
-%\subsection{Reading input}
-%
-%\begin{macro}{\if_eof:w}
-% A simple primitive renaming.
-% \begin{macrocode}
-\cs_new_eq:NN \if_eof:w \tex_ifeof:D
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\ior_if_eof_p:N}
-%\begin{macro}[TF]{\ior_if_eof:N}
-% To test if some particular input stream is exhausted the following
-% conditional is provided. As the pool model means that closed
-% streams are undefined control sequences, the test has two parts.
-% \begin{macrocode}
-\prg_new_conditional:Nnn \ior_if_eof:N { p , TF , T , F } {
- \cs_if_exist:NTF #1
- { \tex_ifeof:D #1 \prg_return_true: \else: \prg_return_false: \fi: }
- { \prg_return_true: }
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%\begin{macro}{\ior_to:NN}
-%\begin{macro}{\ior_gto:NN}
-% And here we read from files.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ior_to:NN #1#2 {
- \tex_read:D #1 to #2
-}
-\cs_new_protected_nopar:Npn \ior_gto:NN {
- \pref_global:D \ior_to:NN
-}
-%</initex|package>
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-% \end{implementation}