%%
%% This is file `l3io.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% l3io.dtx  (with options: `package,trace')
%% 
%% 
%% EXPERIMENTAL CODE
%% 
%% Do not distribute this file without also distributing the
%% source files specified above.
%% 
%% Do not distribute a modified version of this file.
%% 
%% 
%% 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.
%%
%% -----------------------------------------------------------------------
\RequirePackage{l3names}
\GetIdInfo$Id: l3io.dtx 1923 2010-05-22 12:45:49Z joseph $
          {L3 Experimental i/o module}
\ProvidesExplPackage
  {\filename}{\filedate}{\fileversion}{\filedescription}
\package_check_loaded_expl:
\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
\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
\prop_new:N \g_iow_streams_prop
\prop_new:N \g_ior_streams_prop
\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 }
\int_new:N \l_iow_stream_int
\cs_new_eq:NN \l_ior_stream_int \l_iow_stream_int
\cs_set_eq:NN \iow_raw_new:N \newwrite
\cs_set_eq:NN \ior_raw_new:N \newread
\cs_generate_variant:Nn \iow_raw_new:N { c }
\cs_generate_variant:Nn \ior_raw_new:N { c }
\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 }
\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
  \intexpr_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
  \intexpr_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 }
\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:
    }
}
\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 } }
    {
      \iow_stream_alloc_aux:
      \intexpr_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
        }
      \cs_gset_eq:Nc #1 { g_iow_ \int_use:N \l_iow_stream_int _stream }
    }
}
\cs_new_protected_nopar:Npn \iow_stream_alloc_aux: {
  \int_incr:N \l_iow_stream_int
  \intexpr_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: }
    }
}
\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 } }
    {
      \ior_stream_alloc_aux:
      \intexpr_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
        }
      \cs_gset_eq:Nc #1 { g_ior_ \int_use:N \l_ior_stream_int _stream }
    }
}
\cs_new_protected_nopar:Npn \ior_stream_alloc_aux: {
  \int_incr:N \l_ior_stream_int
  \intexpr_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: }
    }
}
\cs_new_protected_nopar:Npn \iow_close:N #1 {
  \cs_if_exist:NT #1
    {
      \intexpr_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
    {
      \intexpr_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 }
\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
}
\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.%
  }
\cs_new_protected_nopar:Npn \iow_now:Nx { \tex_immediate:D \iow_shipout_x:Nn }
\cs_new_protected_nopar:Npn \iow_now:Nn #1#2 {
  \iow_now:Nx #1 { \exp_not:n {#2} }
}
\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 }
\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 }
\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:
}
\cs_set_eq:NN \iow_shipout_x:Nn \tex_write:D
\cs_generate_variant:Nn \iow_shipout_x:Nn  {Nx }
\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 }
\cs_new_nopar:Npn \iow_newline: { ^^J }
\cs_new:Npn \iow_char:N #1 { \cs_to_str:N #1 }
\cs_new_eq:NN \if_eof:w \tex_ifeof:D
\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: }
}
\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
}
%% 
%%
%% End of file `l3io.sty'.
