%%
%% This is file `l3file.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% l3file.dtx  (with options: `package')
%% 
%% 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: l3file.dtx Copyright (C) 1990-2012 The 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 "l3kernel 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 LaTeX3 Project.
%%
%% -----------------------------------------------------------------------
\RequirePackage{l3bootstrap}
\GetIdInfo$Id: l3file.dtx 4212 2012-09-09 12:24:04Z bruno $
  {L3 File and I/O operations}
\ProvidesExplPackage
  {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
\__expl_package_check:
\tl_new:N \g_file_current_name_tl
\tl_gset_eq:NN \g_file_current_name_tl \@currname
\seq_new:N \g__file_stack_seq
\seq_new:N \g__file_record_seq
\tl_new:N \l__file_internal_tl
\tl_new:N \l__file_internal_name_tl
\seq_new:N \l__file_search_path_seq
\seq_new:N \l__file_saved_search_path_seq
\seq_new:N \l__file_internal_seq
\cs_new_protected:Npn \__file_name_sanitize:nn #1#2
  {
    \group_begin:
      \seq_map_inline:Nn \l_char_active_seq
        { \cs_set_nopar:Npx ##1 { \token_to_str:N ##1 } }
      \tl_set:Nx \l__file_internal_name_tl {#1}
      \tl_set:Nx \l__file_internal_name_tl
        { \tl_to_str:N \l__file_internal_name_tl }
      \tl_if_in:NnT \l__file_internal_name_tl { ~ }
        {
          \__msg_kernel_error:nnx { kernel } { space-in-file-name }
            { \l__file_internal_name_tl }
          \tl_remove_all:Nn \l__file_internal_name_tl { ~ }
        }
      \use:x
        {
          \group_end:
          \exp_not:n {#2} { \l__file_internal_name_tl }
        }
  }
\cs_new_protected:Npn \file_add_path:nN #1
  { \__file_name_sanitize:nn {#1} { \__file_add_path:nN } }
\cs_new_protected:Npn \__file_add_path:nN #1#2
  {
    \__ior_open:Nn \g__file_internal_ior {#1}
    \ior_if_eof:NTF \g__file_internal_ior
      { \__file_add_path_search:nN {#1} #2 }
      { \tl_set:Nn #2 {#1} }
    \ior_close:N \g__file_internal_ior
  }
\cs_new_protected:Npn \__file_add_path_search:nN #1#2
  {
    \tl_set:Nn #2 { \q_no_value  }
    \cs_if_exist:NT \input@path
      {
        \seq_set_eq:NN \l__file_saved_search_path_seq \l__file_search_path_seq
        \seq_set_split:NnV \l__file_internal_seq { , } \input@path
        \seq_concat:NNN \l__file_search_path_seq
          \l__file_search_path_seq \l__file_internal_seq
      }
    \seq_map_inline:Nn \l__file_search_path_seq
      {
        \__ior_open:Nn \g__file_internal_ior { ##1 #1 }
        \ior_if_eof:NF \g__file_internal_ior
          {
            \tl_set:Nx #2 { ##1 #1 }
            \seq_map_break:
          }
      }
    \cs_if_exist:NT \input@path
      { \seq_set_eq:NN \l__file_search_path_seq \l__file_saved_search_path_seq }
  }
\prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF }
  {
    \file_add_path:nN {#1} \l__file_internal_name_tl
    \quark_if_no_value:NTF \l__file_internal_name_tl
      { \prg_return_false: }
      { \prg_return_true: }
  }
\cs_new_protected:Npn \file_input:n #1
  {
    \file_add_path:nN {#1} \l__file_internal_name_tl
    \quark_if_no_value:NTF \l__file_internal_name_tl
      {
        \__file_name_sanitize:nn {#1}
          { \__msg_kernel_error:nnx { kernel } { file-not-found } }
      }
      { \__file_input:V \l__file_internal_name_tl }
  }
\cs_new_protected:Npn \__file_input:n #1
  {
    \quark_if_nil:oTF { \__file_input_aux:w #1 . \q_nil . \q_stop }
      { \__file_input_aux:o { \tl_to_str:n { #1 .tex } } }
      { \__file_input_aux:n {#1} }
  }
\cs_generate_variant:Nn \__file_input:n { V }
\cs_new:Npn \__file_input_aux:w #1 . #2 . #3 \q_stop { #2 }
\cs_new_protected:Npn \__file_input_aux:n #1
  {
    \clist_if_exist:NTF \@filelist
      { \@addtofilelist {#1} }
      { \seq_gput_right:Nn \g__file_record_seq {#1} }
    \seq_gpush:No \g__file_stack_seq \g_file_current_name_tl
    \tl_gset:Nn \g_file_current_name_tl {#1}
    \tex_input:D #1 \c_space_tl
    \seq_gpop:NN \g__file_stack_seq \l__file_internal_tl
    \tl_gset_eq:NN \g_file_current_name_tl \l__file_internal_tl
  }
\cs_generate_variant:Nn \__file_input_aux:n { o }
\cs_new_protected:Npn \file_path_include:n #1
  { \__file_name_sanitize:nn {#1} { \__file_path_include:n } }
\cs_new_protected:Npn \__file_path_include:n #1
  {
    \seq_if_in:NnF \l__file_search_path_seq {#1}
      { \seq_put_right:Nn \l__file_search_path_seq {#1} }
  }
\cs_new_protected:Npn \file_path_remove:n #1
  {
    \__file_name_sanitize:nn {#1}
      { \seq_remove_all:Nn \l__file_search_path_seq }
  }
\cs_new_protected_nopar:Npn \file_list:
  {
    \seq_set_eq:NN \l__file_internal_seq \g__file_record_seq
    \clist_if_exist:NT \@filelist
      {
        \clist_map_inline:Nn \@filelist
          {
            \seq_put_right:No \l__file_internal_seq
              { \tl_to_str:n {##1} }
          }
      }
    \seq_remove_duplicates:N \l__file_internal_seq
    \iow_log:n { *~File~List~* }
    \seq_map_inline:Nn \l__file_internal_seq { \iow_log:n {##1} }
    \iow_log:n { ************* }
  }
\AtBeginDocument
  {
    \clist_map_inline:Nn \@filelist
      { \seq_gput_right:No \g__file_record_seq { \tl_to_str:n {#1} } }
  }
\cs_new_eq:NN \c_term_ior \c_sixteen
\tl_const:Nn \c__ior_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
  }
\prop_new:N \g__ior_streams_prop
\prop_put:Nnn \g__ior_streams_prop { 0 } { LaTeX2e~reserved }
\int_new:N \l__ior_stream_int
\cs_set_eq:NN \__ior_new:N \newread
\cs_generate_variant:Nn \__ior_new:N { c }
\cs_new_protected:Npn \ior_new:N #1 { \cs_new_eq:NN #1 \c_term_ior }
\cs_generate_variant:Nn \ior_new:N { c }
\ior_new:N \g__file_internal_ior
\cs_new_protected:Npn \ior_open:Nn #1#2
  { \__file_name_sanitize:nn {#2} { \__ior_open_aux:Nn #1 } }
\cs_generate_variant:Nn \ior_open:Nn { c }
\cs_new_protected:Npn \__ior_open_aux:Nn #1#2
  {
    \file_add_path:nN {#2} \l__file_internal_name_tl
    \quark_if_no_value:NTF \l__file_internal_name_tl
      { \__msg_kernel_error:nnx { kernel } { file-not-found } {#2} }
      { \__ior_open:No #1 \l__file_internal_name_tl }
  }
\prg_new_protected_conditional:Npnn \ior_open:Nn #1#2 { T , F , TF }
  { \__file_name_sanitize:nn {#2} { \__ior_open_aux:NnTF #1 } }
\cs_new_protected:Npn \__ior_open_aux:NnTF #1#2
  {
    \file_add_path:nN {#2} \l__file_internal_name_tl
    \quark_if_no_value:NTF \l__file_internal_name_tl
      { \prg_return_false: }
      {
        \__ior_open:No #1 \l__file_internal_name_tl
        \prg_return_true:
      }
  }
\cs_generate_variant:Nn \ior_open:NnT  { c }
\cs_generate_variant:Nn \ior_open:NnF  { c }
\cs_generate_variant:Nn \ior_open:NnTF { c }
\cs_new_protected:Npn \__ior_open:Nn #1#2
  {
    \ior_close:N #1
    \int_set_eq:NN \l__ior_stream_int \c_sixteen
    \tl_map_function:NN \c__ior_streams_tl \__ior_alloc:n
    \int_compare:nNnTF \l__ior_stream_int = \c_sixteen
      { \__msg_kernel_fatal:nn { kernel } { input-streams-exhausted } }
      {
        \__ior_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 { No }
\cs_new_protected:Npn \__ior_alloc:n #1
  {
    \prop_if_in:NnF \g__ior_streams_prop {#1}
      {
        \int_set:Nn \l__ior_stream_int {#1}
        \tl_map_break:
      }
  }
\ior_new:N \g__ior_internal_ior
\cs_new_protected:Npn \__ior_alloc:N #1
  {
    \cs_if_exist:cF { g_ior_ \int_use:N \l__ior_stream_int _ior }
      {
        \__ior_alloc:
        \int_compare:nNnT \l__ior_stream_int = \c_sixteen
          {
            \__ior_new:N \g__ior_internal_ior
            \int_set:Nn \l__ior_stream_int { \g__ior_internal_ior }
            \cs_gset_eq:cN
              { g_ior_ \int_use:N \l__ior_stream_int _ior } \g__ior_internal_ior
          }
      }
    \cs_gset_eq:Nc #1 { g_ior_ \int_use:N \l__ior_stream_int _ior }
  }
\cs_new_protected_nopar:Npn \__ior_alloc:
  {
    \int_incr:N \l__ior_stream_int
    \int_compare:nNnT \l__ior_stream_int < \c_sixteen
      {
        \cs_if_exist:cTF { g_ior_ \int_use:N \l__ior_stream_int _ior }
          {
            \prop_if_in:NVT \g__ior_streams_prop \l__ior_stream_int
              { \__ior_alloc: }
          }
          { \__ior_alloc: }
      }
  }
\cs_new_protected:Npn \ior_close:N #1
  {
    \__chk_if_exist_cs:N #1
    \int_compare:nNnF #1 < \c_zero
      {
        \int_compare:nNnF #1 > \c_fifteen
          {
            \tex_closein:D #1
            \prop_gremove:NV \g__ior_streams_prop #1
            \cs_gset_eq:NN #1 \c_term_ior
          }
      }
  }
\cs_generate_variant:Nn \ior_close:N { c }
\cs_new_protected_nopar:Npn \ior_list_streams:
  { \__ior_list_streams:Nn \g__ior_streams_prop { input } }
\cs_new_protected:Npn \__ior_list_streams:Nn #1#2
  {
    \__msg_term:nnn { LaTeX / kernel }
      { \prop_if_empty:NTF #1 { show-no-stream } { show-open-streams } }
      {#2}
    \__msg_show_variable:n
      { \prop_map_function:NN #1 \__msg_show_item_unbraced:nn }
  }
\cs_new_eq:NN \if_eof:w \tex_ifeof:D
\prg_new_conditional:Nnn \ior_if_eof:N { p , T , F , TF }
  {
    \cs_if_exist:NTF #1
      {
        \if_int_compare:w #1 = \c_sixteen
          \prg_return_true:
        \else:
          \if_eof:w #1
            \prg_return_true:
          \else:
            \prg_return_false:
          \fi:
        \fi:
      }
      { \prg_return_true: }
  }
\cs_new_protected:Npn \ior_get:NN #1#2
  { \tex_read:D #1 to #2 }
\cs_new_protected:Npn \ior_get_str:NN #1#2
  {
    \use:x
      {
        \int_set_eq:NN \tex_endlinechar:D \c_minus_one
        \exp_not:n { \etex_readline:D #1 to #2 }
        \int_set:Nn \tex_endlinechar:D { \int_use:N \tex_endlinechar:D }
      }
  }
\cs_new_eq:NN \c_log_iow  \c_minus_one
\cs_new_eq:NN \c_term_iow \c_sixteen
\cs_new_eq:NN \c__iow_streams_tl \c__ior_streams_tl
\prop_new:N \g__iow_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 }
\cs_new_eq:NN \l__iow_stream_int \l__ior_stream_int
\cs_set_eq:NN \__iow_new:N \newwrite
\cs_generate_variant:Nn \__iow_new:N { c }
\cs_new_protected:Npn \iow_new:N #1 { \cs_new_eq:NN #1 \c_term_iow }
\cs_generate_variant:Nn \iow_new:N { c }
\cs_new_protected:Npn \iow_open:Nn #1#2
  { \__file_name_sanitize:nn {#2} { \__iow_open:Nn #1 } }
\cs_generate_variant:Nn \iow_open:Nn { c }
\cs_new_protected:Npn \__iow_open:Nn #1#2
  {
    \iow_close:N #1
    \int_set_eq:NN \l__iow_stream_int \c_sixteen
    \tl_map_function:NN \c__iow_streams_tl \__iow_alloc:n
    \int_compare:nNnTF \l__iow_stream_int = \c_sixteen
      { \__msg_kernel_fatal:nn { kernel } { output-streams-exhausted } }
      {
        \__iow_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_new_protected:Npn \__iow_alloc:n #1
  {
    \prop_if_in:NnF \g__iow_streams_prop {#1}
      {
        \int_set:Nn \l__iow_stream_int {#1}
        \tl_map_break:
      }
  }
\iow_new:N \g__iow_internal_iow
\cs_new_protected:Npn \__iow_alloc:N #1
  {
    \cs_if_exist:cF { g_iow_ \int_use:N \l__iow_stream_int _iow }
      {
        \__iow_alloc:
        \int_compare:nNnT \l__iow_stream_int = \c_sixteen
          {
            \__iow_new:N \g__iow_internal_iow
            \int_set:Nn \l__iow_stream_int { \g__iow_internal_iow }
            \cs_gset_eq:cN
              { g_iow_ \int_use:N \l__iow_stream_int _iow } \g__iow_internal_iow
          }
      }
    \cs_gset_eq:Nc #1 { g_iow_ \int_use:N \l__iow_stream_int _iow }
  }
\cs_new_protected_nopar:Npn \__iow_alloc:
  {
    \int_incr:N \l__iow_stream_int
    \int_compare:nNnT \l__iow_stream_int < \c_sixteen
      {
        \cs_if_exist:cTF { g_iow_ \int_use:N \l__iow_stream_int _iow }
          {
            \prop_if_in:NVT \g__iow_streams_prop \l__iow_stream_int
              { \__iow_alloc: }
          }
          { \__iow_alloc: }
      }
  }
\cs_new_protected:Npn \iow_close:N #1
  {
    \__chk_if_exist_cs:N #1
    \int_compare:nNnF #1 < \c_zero
      {
        \int_compare:nNnF #1 > \c_fifteen
          {
            \tex_immediate:D \tex_closeout:D #1
            \prop_gremove:NV \g__iow_streams_prop #1
            \cs_gset_eq:NN #1 \c_term_iow
          }
      }
  }
\cs_generate_variant:Nn \iow_close:N { c }
\cs_new_protected_nopar:Npn \iow_list_streams:
  { \__iow_list_streams:Nn \g__iow_streams_prop { output } }
\cs_new_eq:NN \__iow_list_streams:Nn \__ior_list_streams:Nn
\cs_new_protected:Npn \iow_shipout_x:Nn #1#2
  { \tex_write:D #1 {#2} }
\cs_generate_variant:Nn \iow_shipout_x:Nn { Nx }
\cs_new_protected:Npn \iow_shipout:Nn #1#2
  { \tex_write:D #1 { \exp_not:n {#2} } }
\cs_generate_variant:Nn \iow_shipout:Nn { Nx }
\cs_new_protected:Npn \iow_now:Nn #1#2
  { \tex_immediate:D \tex_write:D #1 { \exp_not:n {#2} } }
\cs_generate_variant:Nn \iow_now:Nn { Nx }
\cs_set_protected_nopar:Npn \iow_log:x  { \iow_now:Nx \c_log_iow  }
\cs_new_protected_nopar:Npn \iow_log:n  { \iow_now:Nn \c_log_iow  }
\cs_set_protected_nopar:Npn \iow_term:x { \iow_now:Nx \c_term_iow }
\cs_new_protected_nopar:Npn \iow_term:n { \iow_now:Nn \c_term_iow }
\cs_new_nopar:Npn \iow_newline: { ^^J }
\cs_new_eq:NN \iow_char:N \cs_to_str:N
\int_new:N  \l_iow_line_count_int
\int_set:Nn \l_iow_line_count_int { 78 }
\int_new:N \l__iow_target_count_int
\int_new:N \l__iow_current_line_int
\int_new:N \l__iow_current_word_int
\int_new:N \l__iow_current_indentation_int
\tl_new:N \l__iow_current_line_tl
\tl_new:N \l__iow_current_word_tl
\tl_new:N \l__iow_current_indentation_tl
\tl_new:N \l__iow_wrap_tl
\tl_new:N \l__iow_newline_tl
\bool_new:N \l__iow_line_start_bool
\group_begin:
  \char_set_catcode_other:N \*
  \char_set_lccode:nn {`\*} {`\ }
  \tl_to_lowercase:n { \tl_const:Nn \c_catcode_other_space_tl { * } }
\group_end:
\group_begin:
  \int_set_eq:NN \tex_escapechar:D \c_minus_one
  \tl_const:Nx \c__iow_wrap_marker_tl
    { \tl_to_str:n { \^^I \^^O \^^W \^^_ \^^W \^^R \^^A \^^P } }
\group_end:
\tl_map_inline:nn
  { { end } { newline } { indent } { unindent } }
  {
    \tl_const:cx { c__iow_wrap_ #1 _marker_tl }
      {
        \c_catcode_other_space_tl
        \c__iow_wrap_marker_tl
        \c_catcode_other_space_tl
        #1
        \c_catcode_other_space_tl
      }
  }
\cs_new_protected:Npn \iow_indent:n #1 { }
\cs_new:Npx \__iow_indent:n #1
  {
    \c__iow_wrap_indent_marker_tl
    #1
    \c__iow_wrap_unindent_marker_tl
  }
\cs_new_protected:Npn \iow_wrap:nnnN #1#2#3#4
  {
    \group_begin:
      \int_set_eq:NN \tex_escapechar:D \c_minus_one
      \cs_set_nopar:Npx \{ { \token_to_str:N \{ }
      \cs_set_nopar:Npx \# { \token_to_str:N \# }
      \cs_set_nopar:Npx \} { \token_to_str:N \} }
      \cs_set_nopar:Npx \% { \token_to_str:N \% }
      \cs_set_nopar:Npx \~ { \token_to_str:N \~ }
      \int_set:Nn \tex_escapechar:D { 92 }
      \cs_set_eq:NN \\ \c__iow_wrap_newline_marker_tl
      \cs_set_eq:NN \  \c_catcode_other_space_tl
      \cs_set_eq:NN \iow_indent:n \__iow_indent:n
      #3
      \protected@edef \l__iow_wrap_tl {#1}
      \tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 }
      \tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl }
      \tl_replace_all:Nnn \l__iow_newline_tl { ~ } { \c_space_tl }
      \int_set:Nn \l__iow_target_count_int
        { \l_iow_line_count_int - \tl_count:N \l__iow_newline_tl + \c_one }
      \int_zero:N \l__iow_current_indentation_int
      \tl_clear:N \l__iow_current_indentation_tl
      \int_zero:N \l__iow_current_line_int
      \tl_clear:N \l__iow_current_line_tl
      \bool_set_true:N \l__iow_line_start_bool
      \use:x
        {
          \exp_not:n { \tl_clear:N \l__iow_wrap_tl }
          \__iow_wrap_loop:w
          \tl_to_str:N \l__iow_wrap_tl
          \tl_to_str:N \c__iow_wrap_end_marker_tl
          \c_space_tl \c_space_tl
          \exp_not:N \q_stop
        }
    \exp_args:NNo \group_end:
    #4 \l__iow_wrap_tl
  }
\cs_new_protected:Npn \__iow_wrap_loop:w #1 ~ %
  {
    \tl_set:Nn \l__iow_current_word_tl {#1}
    \tl_if_eq:NNTF \l__iow_current_word_tl \c__iow_wrap_marker_tl
      { \__iow_wrap_special:w }
      { \__iow_wrap_word: }
  }
\cs_new_protected_nopar:Npn \__iow_wrap_word:
  {
    \int_set:Nn \l__iow_current_word_int
      { \__str_count_ignore_spaces:N \l__iow_current_word_tl }
    \int_add:Nn \l__iow_current_line_int { \l__iow_current_word_int }
    \int_compare:nNnTF \l__iow_current_line_int < \l__iow_target_count_int
      { \__iow_wrap_word_fits: }
      { \__iow_wrap_word_newline: }
    \__iow_wrap_loop:w
  }
\cs_new_protected_nopar:Npn \__iow_wrap_word_fits:
  {
    \bool_if:NTF \l__iow_line_start_bool
      {
        \bool_set_false:N \l__iow_line_start_bool
        \tl_put_right:Nx \l__iow_current_line_tl
          { \l__iow_current_indentation_tl \l__iow_current_word_tl }
        \int_add:Nn \l__iow_current_line_int
          { \l__iow_current_indentation_int }
      }
      {
        \tl_put_right:Nx \l__iow_current_line_tl
          { ~ \l__iow_current_word_tl }
        \int_incr:N \l__iow_current_line_int
      }
  }
\cs_new_protected_nopar:Npn \__iow_wrap_word_newline:
  {
    \tl_put_right:Nx \l__iow_wrap_tl
      { \l__iow_current_line_tl \l__iow_newline_tl }
    \int_set:Nn \l__iow_current_line_int
      {
        \l__iow_current_word_int
        + \l__iow_current_indentation_int
      }
    \tl_set:Nx \l__iow_current_line_tl
      { \l__iow_current_indentation_tl \l__iow_current_word_tl }
  }
\cs_new_protected:Npn \__iow_wrap_special:w #1 ~ #2 ~ #3 ~ %
  {
    \use:c { __iow_wrap_#1: }
    \str_if_eq_x:nnTF { #2~#3 } { ~ \c__iow_wrap_marker_tl }
      { \__iow_wrap_special:w }
      { \__iow_wrap_loop:w #2 ~ #3 ~ }
  }
\cs_new_protected_nopar:Npn \__iow_wrap_newline:
  {
    \tl_put_right:Nx \l__iow_wrap_tl
      { \l__iow_current_line_tl \l__iow_newline_tl }
    \int_zero:N \l__iow_current_line_int
    \tl_clear:N \l__iow_current_line_tl
    \bool_set_true:N \l__iow_line_start_bool
  }
\cs_new_protected_nopar:Npx \__iow_wrap_indent:
  {
    \int_add:Nn \l__iow_current_indentation_int \c_four
    \tl_put_right:Nx \exp_not:N \l__iow_current_indentation_tl
      { \c_space_tl \c_space_tl \c_space_tl \c_space_tl }
  }
\cs_new_protected_nopar:Npn \__iow_wrap_unindent:
  {
    \int_sub:Nn \l__iow_current_indentation_int \c_four
    \tl_set:Nx \l__iow_current_indentation_tl
      { \prg_replicate:nn \l__iow_current_indentation_int { ~ } }
  }
\cs_new_protected_nopar:Npn \__iow_wrap_end:
  {
    \tl_put_right:Nx \l__iow_wrap_tl
      { \l__iow_current_line_tl }
    \use_none_delimit_by_q_stop:w
  }
\cs_new_nopar:Npn \__str_count_ignore_spaces:N
  { \exp_args:No \__str_count_ignore_spaces:n }
\cs_new:Npn \__str_count_ignore_spaces:n #1
  {
    \__int_value:w \__int_eval:w
      \exp_after:wN \__str_count_loop:NNNNNNNNN \tl_to_str:n {#1}
        { X8 } { X7 } { X6 } { X5 } { X4 } { X3 } { X2 } { X1 } { X0 } \q_stop
    \__int_eval_end:
  }
\cs_new:Npn \__str_count_loop:NNNNNNNNN #1#2#3#4#5#6#7#8#9
  {
    \if_catcode:w X #9
      \exp_after:wN \use_none_delimit_by_q_stop:w
    \else:
      9 +
      \exp_after:wN \__str_count_loop:NNNNNNNNN
    \fi:
  }
\__msg_kernel_new:nnnn { kernel } { file-not-found }
  { File~'#1'~not~found. }
  {
    The~requested~file~could~not~be~found~in~the~current~directory,~
    in~the~TeX~search~path~or~in~the~LaTeX~search~path.
  }
\__msg_kernel_new:nnnn { kernel } { input-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.
  }
\__msg_kernel_new:nnnn { kernel } { output-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 { kernel } { space-in-file-name }
  { Space~in~file~name~'#1'. }
  {
    Spaces~are~not~permitted~in~files~loaded~by~LaTeX: \\
    Further~errors~may~follow!
  }
\cs_new_protected:Npn \iow_wrap:xnnnN #1#2#3#4#5
  { \iow_wrap:nnnN {#1} {#2} {#4} #5 }
\cs_new_eq:NN \l_iow_line_length_int \l_iow_line_count_int
\cs_new_eq:NN \ior_to:NN \ior_get:NN
\cs_new_protected_nopar:Npn \ior_gto:NN { \tex_global:D \ior_to:NN }
\cs_new_eq:NN \ior_str_to:NN \ior_get_str:NN
\cs_new_protected_nopar:Npn \ior_str_gto:NN { \tex_global:D \ior_str_to:NN }
%% 
%%
%% End of file `l3file.sty'.
