[latex3-commits] [l3svn] r6880 - Speed-up line-wrapping code

noreply at latex-project.org noreply at latex-project.org
Sat Feb 11 04:16:17 CET 2017


Author: bruno
Date: 2017-02-11 04:16:17 +0100 (Sat, 11 Feb 2017)
New Revision: 6880

Modified:
   trunk/l3kernel/l3file.dtx
   trunk/l3kernel/l3str.dtx
   trunk/l3kernel/testfiles/m3expl001.luatex.tlg
   trunk/l3kernel/testfiles/m3expl001.ptex.tlg
   trunk/l3kernel/testfiles/m3expl001.tlg
   trunk/l3kernel/testfiles/m3expl001.uptex.tlg
   trunk/l3kernel/testfiles/m3expl001.xetex.tlg
   trunk/l3kernel/testfiles/m3expl002.luatex.tlg
   trunk/l3kernel/testfiles/m3expl002.ptex.tlg
   trunk/l3kernel/testfiles/m3expl002.tlg
   trunk/l3kernel/testfiles/m3expl002.uptex.tlg
   trunk/l3kernel/testfiles/m3expl002.xetex.tlg
   trunk/l3kernel/testfiles/m3expl003.luatex.tlg
   trunk/l3kernel/testfiles/m3expl003.ptex.tlg
   trunk/l3kernel/testfiles/m3expl003.tlg
   trunk/l3kernel/testfiles/m3expl003.uptex.tlg
   trunk/l3kernel/testfiles/m3expl003.xetex.tlg
   trunk/l3kernel/testfiles/m3expl004.luatex.tlg
   trunk/l3kernel/testfiles/m3expl004.ptex.tlg
   trunk/l3kernel/testfiles/m3expl004.tlg
   trunk/l3kernel/testfiles/m3expl004.uptex.tlg
   trunk/l3kernel/testfiles/m3expl004.xetex.tlg
   trunk/l3kernel/testfiles/m3expl006.luatex.tlg
   trunk/l3kernel/testfiles/m3expl006.ptex.tlg
   trunk/l3kernel/testfiles/m3expl006.tlg
   trunk/l3kernel/testfiles/m3expl006.uptex.tlg
   trunk/l3kernel/testfiles/m3expl006.xetex.tlg
   trunk/l3kernel/testfiles/m3msg002.tlg
Log:
Speed-up line-wrapping code

This commit speeds up the line-wrapping code by changing the
approach completely: instead of grabbing words one by one and
checking if they fit, we now grab a whole line and chop off
the last word if it does not fit.  Unfortunately, the speed-up
is smaller than I hoped.  None of the output is changed.


Modified: trunk/l3kernel/l3file.dtx
===================================================================
--- trunk/l3kernel/l3file.dtx	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/l3file.dtx	2017-02-11 03:16:17 UTC (rev 6880)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3file.dtx Copyright (C) 1990-2016 The LaTeX3 Project
+%% File: l3file.dtx Copyright (C) 1990-2017 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
@@ -1464,7 +1464,14 @@
 % used by the messaging system, but is designed such that it is
 % available for other uses.
 %
-% \begin{macro}[var, added = 2012-06-24]{\l_iow_line_count_int}
+% \begin{macro}{\c_catcode_other_space_tl}
+%   Create a space with category code $12$: an \enquote{other} space.
+%    \begin{macrocode}
+\tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\  } { 12 } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_iow_line_count_int}
 %   This is the \enquote{raw} number of characters in a line which
 %   can be written to the terminal.
 %   The standard value is the line length typically used by
@@ -1473,93 +1480,100 @@
 \int_new:N  \l_iow_line_count_int
 \int_set:Nn \l_iow_line_count_int { 78 }
 %    \end{macrocode}
-% \end{macro}
+% \end{variable}
 %
-% \begin{macro}[aux]{\l_@@_target_count_int}
+% \begin{variable}{\l_@@_newline_tl}
+%   The token list inserted to produce a new line, with the
+%   \meta{run-on text}.
+%    \begin{macrocode}
+\tl_new:N \l_@@_newline_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_line_target_int, \l_@@_target_int}
 %   This stores the target line count: the full number of characters
 %   in a line, minus any part for a leader at the start of each line.
 %    \begin{macrocode}
-\int_new:N \l_@@_target_count_int
+\int_new:N \l_@@_line_target_int
+\int_new:N \l_@@_target_int
 %    \end{macrocode}
-% \end{macro}
+% \end{variable}
 %
-% \begin{macro}[aux]
-%   {
-%     \l_@@_current_line_int,
-%     \l_@@_current_word_int,
-%     \l_@@_current_indentation_int
-%   }
-%   These store the number of characters in the line and word currently
-%   being constructed, and the current indentation, respectively.
+% \begin{macro}[aux]{\@@_set_indent:n}
+% \begin{macro}[aux]{\@@_unindent:w}
+% \begin{variable}{\l_@@_one_indent_tl, \l_@@_one_indent_int}
+%   The \texttt{one_indent} variables hold one indentation marker and
+%   its length.  The \cs{@@_unindent:w} auxiliary removes one
+%   indentation.  The function \cs{@@_set_indent:n} (that could possibly
+%   be public) sets the indentation in a consistent way.  We set it to
+%   four spaces by default.
 %    \begin{macrocode}
-\int_new:N \l_@@_current_line_int
-\int_new:N \l_@@_current_word_int
-\int_new:N \l_@@_current_indentation_int
+\tl_new:N \l_@@_one_indent_tl
+\int_new:N \l_@@_one_indent_int
+\cs_new:Npn \@@_unindent:w { }
+\cs_new_protected:Npn \@@_set_indent:n #1
+  {
+    \tl_set:Nx \l_@@_one_indent_tl
+      { \exp_args:No \__str_to_other_fast:n { \tl_to_str:n {#1} } }
+    \int_set:Nn \l_@@_one_indent_int { \str_count:N \l_@@_one_indent_tl }
+    \exp_last_unbraced:NNo
+      \cs_set:Npn \@@_unindent:w \l_@@_one_indent_tl { }
+  }
+\exp_args:Nx \@@_set_indent:n { \prg_replicate:nn { 4 } { ~ } }
 %    \end{macrocode}
+% \end{variable}
 % \end{macro}
+% \end{macro}
 %
-% \begin{macro}[aux]
-%   {
-%     \l_@@_current_line_tl,
-%     \l_@@_current_word_tl,
-%     \l_@@_current_indentation_tl
-%   }
-%   These hold the current line of text and current word,
-%   and a number of spaces for indentation, respectively.
+% \begin{variable}{\l_@@_indent_tl, \l_@@_indent_int}
+%   The current indentation (some copies of \cs{l_@@_one_indent_tl}) and
+%   its number of characters.
 %    \begin{macrocode}
-\tl_new:N \l_@@_current_line_tl
-\tl_new:N \l_@@_current_word_tl
-\tl_new:N \l_@@_current_indentation_tl
+\tl_new:N \l_@@_indent_tl
+\int_new:N \l_@@_indent_int
 %    \end{macrocode}
-%\end{macro}
+% \end{variable}
 %
-% \begin{macro}[aux]{\l_@@_wrap_tl}
-%   Used for the expansion step before detokenizing, and for the output
-%   from wrapping text: fully expanded and with lines which are not
-%   overly long.
+% \begin{variable}{\l_@@_line_tl, \l_@@_line_part_tl}
+%   These hold the current line of text and a partial line to be added
+%   to it, respectively.
 %    \begin{macrocode}
-\tl_new:N \l_@@_wrap_tl
+\tl_new:N \l_@@_line_tl
+\tl_new:N \l_@@_line_part_tl
 %    \end{macrocode}
-% \end{macro}
+% \end{variable}
 %
-% \begin{macro}[aux]{\l_@@_newline_tl}
-%   The token list inserted to produce the new line, with the
-%   \meta{run-on text}.
+% \begin{variable}{\l_@@_line_break_bool}
+%   Indicates whether the line was broken precisely at a chunk boundary.
 %    \begin{macrocode}
-\tl_new:N \l_@@_newline_tl
+\bool_new:N \l_@@_line_break_bool
 %    \end{macrocode}
-% \end{macro}
+% \end{variable}
 %
-% \begin{macro}[aux]{\l_@@_line_start_bool}
-%   Boolean to avoid adding a space at the beginning of forced newlines,
-%   and to know when to add the indentation.
+% \begin{variable}{\l_@@_wrap_tl}
+%   Used for the expansion step before detokenizing, and for the output
+%   from wrapping text: fully expanded and with lines which are not
+%   overly long.
 %    \begin{macrocode}
-\bool_new:N \l_@@_line_start_bool
+\tl_new:N \l_@@_wrap_tl
 %    \end{macrocode}
-% \end{macro}
+% \end{variable}
 %
-% \begin{macro}{\c_catcode_other_space_tl}
-%   Create a space with category code $12$: an \enquote{other} space.
-%    \begin{macrocode}
-\tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\  } { 12 } }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[aux]{\c_@@_wrap_marker_tl}
-% \begin{macro}[aux]
+% \begin{variable}{\c_@@_wrap_marker_tl}
+% \begin{variable}
 %   {
 %     \c_@@_wrap_end_marker_tl,
 %     \c_@@_wrap_newline_marker_tl,
 %     \c_@@_wrap_indent_marker_tl,
 %     \c_@@_wrap_unindent_marker_tl
 %   }
-%   Every special action of the wrapping code is preceded by
+%   Every special action of the wrapping code is starts with
 %   the same recognizable string, \cs{c_@@_wrap_marker_tl}.
 %   Upon seeing that \enquote{word}, the wrapping code reads
 %   one space-delimited argument to know what operation to
 %   perform. The setting of \tn{escapechar} here is not
 %   very important, but makes \cs{c_@@_wrap_marker_tl} look
-%   nicer.
+%   marginally nicer.
 %    \begin{macrocode}
 \group_begin:
   \int_set:Nn \tex_escapechar:D { - \c_one }
@@ -1571,26 +1585,32 @@
   {
     \tl_const:cx { c_@@_wrap_ #1 _marker_tl }
       {
-        \c_catcode_other_space_tl
         \c_@@_wrap_marker_tl
-        \c_catcode_other_space_tl
         #1
         \c_catcode_other_space_tl
       }
   }
 %    \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{variable}
+% \end{variable}
 %
 % \begin{macro}{\iow_indent:n}
-% \begin{macro}[aux]{\@@_indent:n, \@@_indent_error:n}
-%   We give a (protected) error definition to \cs{iow_indent:n}
-%   when outside messages. Within wrapped message, it places
-%   the instruction for increasing the indentation before its
-%   argument, and the instruction for unindenting afterwards.
-%   Note that there will be no forced line-break, so the indentation
-%   only changes when the next line is started.
+% \begin{macro}[EXP,aux]{\@@_indent:n}
+% \begin{macro}[EXP,aux]{\@@_indent_error:n}
+%   We set \cs{iow_indent:n} to produce an error when outside
+%   messages. Within wrapped message, it is set to \cs{@@_indent:n} when
+%   valid and otherwise to \cs{@@_indent_error:n}.  The first places the
+%   instruction for increasing the indentation before its argument, and
+%   the instruction for unindenting afterwards.  The second produces an
+%   error expandably.  Note that there will be no forced line-break, so
+%   the indentation only changes when the next line is started.
 %    \begin{macrocode}
+\cs_new_protected:Npn \iow_indent:n #1
+  {
+    \__msg_kernel_error:nnnnn { kernel } { iow-indent }
+      { \iow_wrap:nnnN } { \iow_indent:n } {#1}
+    #1
+  }
 \cs_new:Npx \@@_indent:n #1
   {
     \c_@@_wrap_indent_marker_tl
@@ -1599,31 +1619,23 @@
   }
 \cs_new:Npn \@@_indent_error:n #1
   {
-    \__msg_kernel_expandable_error:nn { kernel } { indent-outside-wrapping-code }
+    \__msg_kernel_expandable_error:nnnnn { kernel } { iow-indent }
+      { \iow_wrap:nnnN } { \iow_indent:n } {#1}
     #1
   }
-\cs_new_protected:Npn \iow_indent:n { \@@_indent_error:n }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}{\iow_wrap:nnnN}
 % \begin{macro}[aux]{\@@_wrap_set:Nx}
 %   The main wrapping function works as follows.  First give |\\|,
 %   \verb*|\ | and other formatting commands the correct definition for
-%   messages, before fully-expanding the input.  In package mode, the
-%   expansion uses \LaTeXe{}'s \cs{protect} mechanism.  Afterwards, set
-%   the newline marker (two assignments to fully expand, then convert
-%   to a string) and its length, and initialize some registers.
-%   There is then a loop over each word in the input, which will do the
-%   actual wrapping.  After the loop, the resulting text is passed on to
-%   the function which has been given as a post-processor.
-%   The argument |#4| is available for additional set up steps for
-%   the output. The definition of |\\| and \verb*|\ | use an
-%   \enquote{other} space rather than a normal space, because the latter
-%   might be absorbed by \TeX{} to end a number or other \texttt{f}-type
-%   expansions. The \cs{tl_to_str:N} step converts the \enquote{other}
-%   space back to a normal space.
+%   messages and perform the given setup~|#3|.  The definition of
+%   \verb*|\ | uses an \enquote{other} space rather than a normal space,
+%   because the latter might be absorbed by \TeX{} to end a number or
+%   other \texttt{f}-type expansions.
 %    \begin{macrocode}
 \cs_new_protected:Npn \iow_wrap:nnnN #1#2#3#4
   {
@@ -1639,48 +1651,39 @@
       \cs_set_eq:NN \  \c_catcode_other_space_tl
       \cs_set_eq:NN \iow_indent:n \@@_indent:n
       #3
-%<*initex>
+%    \end{macrocode}
+%   Then fully-expand the input: in package mode, the expansion uses
+%   \LaTeXe{}'s \cs{protected} mechanism.  As soon as the expansion is
+%   done, reset \cs{iow_indent:n} to its error definition: it only works
+%   in the first argument of \cs{iow_wrap:nnnN}.
+%    \begin{macrocode}
+%<*initex> 
       \tl_set:Nx \l_@@_wrap_tl {#1}
 %</initex>
 %<*package>
       \@@_wrap_set:Nx \l_@@_wrap_tl {#1}
 %</package>
+      \cs_set_eq:NN \iow_indent:n \@@_indent_error:n
 %    \end{macrocode}
-%   To warn users that \cs{iow_indent:n} only works in the first argument
-%   of \cs{iow_wrap:nnnN} reset \cs{iow_indent:n} to its error
-%   definition.  Then store a newline character and the run-on text as a
-%   string in \cs{l_@@_newline_tl}, and set some variables.  The first
-%   line's target count is equal to the length of the whole line.  The
-%   value \cs{l_@@_target_count_int} is altered later on by
-%   \cs{@@_wrap_set_target:}.
+%   Afterwards, set the newline marker (two assignments to fully expand,
+%   then convert to a string) and initialize the target count for lines
+%   (the first line has target count \cs{l_iow_line_count_int} instead).
 %    \begin{macrocode}
-      \cs_set_eq:NN \iow_indent:n \@@_indent_error:n
       \tl_set:Nx \l_@@_newline_tl { \iow_newline: #2 }
       \tl_set:Nx \l_@@_newline_tl { \tl_to_str:N \l_@@_newline_tl }
-      \int_set_eq:NN \l_@@_target_count_int \l_iow_line_count_int
-      \tl_clear:N \l_@@_current_indentation_tl
-      \int_zero:N \l_@@_current_line_int
-      \tl_set:Nn \l_@@_current_line_tl { \use_none:n }
-      \bool_set_true:N \l_@@_line_start_bool
+      \int_set:Nn \l_@@_line_target_int
+        { \l_iow_line_count_int - \str_count:N \l_@@_newline_tl + \c_one }
 %    \end{macrocode}
-%   After some setup above (in particular the odd setting of the current line
-%   to \cs{use_none:n}), a loop goes through space-delimited words in the
-%   message, recognizing special markers.  To make sure that the first line
-%   behaves identically to others, start with a newline marker: the
-%   \cs{use_none:n} above avoids actually getting a new line in the output.
+%   There is then a loop over the input, which will store the wrapped
+%   result in \cs{l_@@_wrap_tl}.  After the loop, the resulting text is
+%   passed on to the function which has been given as a post-processor.
+%   The \cs{tl_to_str:N} step converts the \enquote{other} spaces back
+%   to normal spaces.  The \texttt{f}-expansion removes a leading space
+%   from \cs{l_@@_wrap_tl}.
 %    \begin{macrocode}
-      \use:x
-        {
-          \exp_not:n { \tl_clear:N \l_@@_wrap_tl }
-          \@@_wrap_loop:w
-          \tl_to_str:N \c_@@_wrap_newline_marker_tl
-          \tl_to_str:N \l_@@_wrap_tl
-          \tl_to_str:N \c_@@_wrap_end_marker_tl
-          \c_space_tl \c_space_tl
-          \exp_not:N \q_stop
-        }
-    \exp_args:NNo \group_end:
-    #4 \l_@@_wrap_tl
+      \@@_wrap_do:
+    \exp_args:NNf \group_end:
+    #4 { \tl_to_str:N \l_@@_wrap_tl }
   }
 %    \end{macrocode}
 %   As using the generic loader will mean that \cs{protected at edef} is
@@ -1694,161 +1697,341 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_set_target:}
-%   This is called at the beginning of every line (both those forced by
-%   |\\| and those due to line-breaking).  The initial call does
-%   nothing except redefine \cs{@@_wrap_set_target:} itself (within the
-%   group in which \cs{iow_wrap:nnnN} works).  The next call (at the
-%   beginning of the second line) disables any later call and sets the
-%   \cs{l_@@_target_count_int} to the correct value, namely the
-%   \cs{l_iow_line_count_int} shortened by the length of the run-on
-%   text (the shift by~$1$ is due to the presence of \cs{iow_newline:}
-%   in \cs{l_@@_newline_tl}).
-%   This is a bit of a hack to measure the string length of the run on text
-%   without the \pkg{l3str} module (which is still experimental). This should
-%   be replaced once the string module is finalised with something a little
-%   cleaner.
+% \begin{macro}[aux]{\@@_wrap_do:, \@@_wrap_start:w}
+%   Escape spaces.  Set up a few variables, in particular the initial
+%   value of \cs{l_@@_wrap_tl}: the space will stop the
+%   \texttt{f}-expansion of the main wrapping function and
+%   \cs{use_none:n} will remove a newline marker inserted by later code.
+%   The main loop consists of repeatedly calling the \texttt{chunk}
+%   auxiliary to wrap chunks delimited by (newline or indentation)
+%   markers.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_wrap_set_target:
+\cs_new_protected:Npn \@@_wrap_do:
   {
-    \cs_set_protected:Npn \@@_wrap_set_target:
+    \tl_set:Nx \l_@@_wrap_tl
       {
-        \cs_set_protected:Npn \@@_wrap_set_target: { }
-        \tl_replace_all:Nnn \l_@@_newline_tl { ~ } { \c_space_tl }
-        \int_set:Nn \l_@@_target_count_int
-          { \l_iow_line_count_int - \tl_count:N \l_@@_newline_tl + \c_one }
+        \exp_args:No \__str_to_other_fast:n \l_@@_wrap_tl
+        \c_@@_wrap_end_marker_tl
       }
+    \exp_after:wN \@@_wrap_start:w \l_@@_wrap_tl
   }
+\cs_new_protected:Npn \@@_wrap_start:w
+  {
+    \bool_set_false:N \l_@@_line_break_bool
+    \tl_clear:N \l_@@_line_tl
+    \tl_clear:N \l_@@_line_part_tl
+    \tl_set:Nn \l_@@_wrap_tl { ~ \use_none:n }
+    \int_zero:N \l_@@_indent_int
+    \tl_clear:N \l_@@_indent_tl
+    \@@_wrap_chunk:nw { \l_iow_line_count_int }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_loop:w}
-%   The loop grabs one word in the input, and checks whether it is
-%   the special marker, or a normal word.
+% \begin{macro}[aux]{\@@_wrap_chunk:nw}
+%   This auxiliary is defined indirectly to obtain the expansions of
+%   \cs{c_catcode_other_space_tl} and \cs{c_@@_wrap_marker_tl} in its
+%   definition.  The first argument is a target number of characters.
+%   The second is some string to wrap.  The third is \texttt{newline} or
+%   \texttt{indent} or \texttt{unindent} or \texttt{end} to indicate the
+%   type of marker.  If there is nothing to wrap then simply call the
+%   function corresponding to the type of marker after setting a few
+%   variables.  Otherwise, set up a call to \cs{@@_wrap_line:nw},
+%   including the indentation if the current line is empty, and
+%   including a trailing space (|#1|) before the
+%   \cs{@@_wrap_end_chunk:w} auxiliary.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_wrap_loop:w #1 ~ %
+\cs_set_protected:Npn \@@_tmp:w #1#2
   {
-    \tl_set:Nn \l_@@_current_word_tl {#1}
-    \tl_if_eq:NNTF \l_@@_current_word_tl \c_@@_wrap_marker_tl
-      { \@@_wrap_special:w }
-      { \@@_wrap_word: }
+    \cs_new_protected:Npn \@@_wrap_chunk:nw ##1##2 #2 ##3 #1
+      {
+        \tl_if_empty:nTF {##2}
+          {
+            \tl_clear:N \l_@@_line_part_tl
+            \int_set:Nn \l_@@_target_int {##1}
+          }
+          {
+            \tl_if_empty:NTF \l_@@_line_tl
+              {
+                \@@_wrap_line:nw
+                  { \l_@@_indent_tl }
+                  ##1 - \l_@@_indent_int ;
+              }
+              { \@@_wrap_line:nw { } ##1 ; }
+            ##2 #1
+            \@@_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \q_stop
+          }
+        \use:c { @@_wrap_##3: }
+      }
   }
+\exp_args:NVV \@@_tmp:w \c_catcode_other_space_tl \c_@@_wrap_marker_tl
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_word:}
-% \begin{macro}[aux]{\@@_wrap_word_fits:}
-% \begin{macro}[aux]{\@@_wrap_word_newline:}
-%   For a normal word, update the line count, then test if the current
-%   word would fit in the current line, and call the appropriate function.
-%   If the word fits in the current line, add it to the line, preceded by
-%   a space unless it is the first word of the line.
-%   Otherwise, the current line is added to the result, with the run-on text.
-%   The current word (and its character count) are then put in the new line.
+% \begin{macro}[aux]{\@@_wrap_line:nw}
+% \begin{macro}[EXP,aux]
+%   {
+%     \@@_wrap_line_loop:w,
+%     \@@_wrap_line_aux:Nw,
+%     \@@_wrap_line_end:NnnnnnnnN,
+%     \@@_wrap_line_end:nw,
+%     \@@_wrap_end_chunk:w
+%   }
+%   This is followed by \Arg{string} \meta{intexpr} |;|.  It stores the
+%   \meta{string} and up to \meta{intexpr} characters from the current
+%   chunk into \cs{l_@@_line_part_tl}.  Characters are grabbed 8~at a
+%   time and left in \cs{l_@@_line_part_tl} by the \texttt{line_loop}
+%   auxiliary.  When $k<8$ remain to be found, the \texttt{line_aux}
+%   auxiliary calls the \texttt{line_end} auxiliary followed by (the
+%   single digit) $k$, then $7-k$ empty brace groups, then the chunk's
+%   remaining characters.  The \texttt{line_end} auxiliary leaves
+%   $k$~characters from the chunk in the line part, then ends the
+%   assignment.  Ignore the \cs{use_none:nnnnn} line for now.  If the
+%   next character is a space the line can be broken there:
+%   store what we found into the result and get the next line.
+%   Otherwise some work is needed to find a break-point.  So far we have
+%   ignored what happens if the chunk is shorter than the requested
+%   number of characters: this is dealt with by the \texttt{end_chunk}
+%   auxiliary, which gets treated like a character by the rest of the
+%   code.  It ends up being called either as one of the arguments
+%   |#2|--|#9| of the \texttt{line_loop} auxiliary or as one of the
+%   arguments |#2|--|#8| of the \texttt{line_end} auxiliary.  In both
+%   cases stop the assignment and work out how many characters are still
+%   needed.  The weird \cs{use_none:nnnnn} ensures that the required
+%   data is in the right place.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_wrap_word:
+\cs_new_protected:Npn \@@_wrap_line:nw #1
   {
-    \int_set:Nn \l_@@_current_word_int
-      { \exp_args:No  \str_count_ignore_spaces:n \l_@@_current_word_tl }
-    \int_add:Nn \l_@@_current_line_int { \l_@@_current_word_int }
-    \int_compare:nNnTF \l_@@_current_line_int < \l_@@_target_count_int
-      { \@@_wrap_word_fits: }
-      { \@@_wrap_word_newline: }
-    \@@_wrap_loop:w
+    \tex_edef:D \l_@@_line_part_tl { \if_false: } \fi:
+    #1
+    \exp_after:wN \@@_wrap_line_loop:w
+    \__int_value:w \__int_eval:w
   }
-\cs_new_protected:Npn \@@_wrap_word_fits:
+\cs_new:Npn \@@_wrap_line_loop:w #1 ; #2#3#4#5#6#7#8#9
   {
-    \bool_if:NTF \l_@@_line_start_bool
+    \if_int_compare:w #1 < \c_eight
+      \@@_wrap_line_aux:Nw #1
+    \fi:
+    #2 #3 #4 #5 #6 #7 #8 #9
+    \exp_after:wN \@@_wrap_line_loop:w
+    \__int_value:w \__int_eval:w #1 - \c_eight ;
+  }
+\cs_new:Npn \@@_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 ;
+  {
+    #2
+    \exp_after:wN \@@_wrap_line_end:NnnnnnnnN
+    \exp_after:wN #1
+    \exp:w \exp_end_continue_f:w
+    \exp_after:wN \exp_after:wN
+    \if_case:w #1 \exp_stop_f:
+         \prg_do_nothing:
+    \or: \use_none:n
+    \or: \use_none:nn
+    \or: \use_none:nnn
+    \or: \use_none:nnnn
+    \or: \use_none:nnnnn
+    \or: \use_none:nnnnnn
+    \or: \use_none:nnnnnnn
+    \fi:
+    { } { } { } { } { } { } { } #3
+  }
+\cs_new:Npn \@@_wrap_line_end:NnnnnnnnN #1#2#3#4#5#6#7#8#9
+  {
+    #2 #3 #4 #5 #6 #7 #8
+    \use_none:nnnnn \__int_eval:w \c_eight - ; #9
+    \token_if_eq_charcode:NNTF \c_space_token #9
+      { \@@_wrap_line_end:nw { } }
+      { \if_false: { \fi: } \@@_wrap_break:w #9 }
+  }
+\cs_new:Npn \@@_wrap_line_end:nw #1
+  {
+    \if_false: { \fi: }
+    \@@_wrap_store_do:n {#1}
+    \@@_wrap_next_line:w
+  }
+\cs_new:Npn \@@_wrap_end_chunk:w
+    #1 \__int_eval:w #2 - #3 ; #4#5 \q_stop
+  {
+    \if_false: { \fi: }
+    \int_set:Nn \l_@@_target_int { #2 - #4 }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP,aux]{\@@_wrap_break:w}
+% \begin{macro}[EXP,aux]
+%   {
+%     \@@_wrap_break_first:w,
+%     \@@_wrap_break_none:w,
+%     \@@_wrap_break_loop:w,
+%     \@@_wrap_break_end:w,
+%   }
+%   Functions here are defined indirectly: \cs{@@_tmp:w} is eventually
+%   called with an \enquote{other} space as its argument.  The goal is
+%   to remove from \cs{l_@@_line_part_tl} the part after the last space.
+%   In most cases this is done by repeatedly calling the
+%   \texttt{break_loop} auxiliary, which leaves \enquote{words}
+%   (delimited by spaces) until it hits the trailing space: then its
+%   argument |##3| is |?| \cs{@@_wrap_break_end:w} instead of a single
+%   token, and that \texttt{break_end} auxiliary leaves in the
+%   assignment the line until the last space, then calls
+%   \cs{@@_wrap_line_end:nw} to finish up the line and move on to the
+%   next.  If there is no space in \cs{l_@@_line_part_tl} then the
+%   \texttt{break_first} auxiliary calls the \texttt{break_none}
+%   auxiliary.  In that case, if the current line is empty, the complete
+%   word (including |##4|, characters beyond what we had grabbed) is
+%   added to the line, making it over-long.  Otherwise, the word will be
+%   used for the following line (and the last space of the line so far
+%   is removed because it was inserted due to the presence of a marker).
+%    \begin{macrocode}
+\cs_set_protected:Npn \@@_tmp:w #1
+  {
+    \cs_new:Npn \@@_wrap_break:w
       {
-        \bool_set_false:N \l_@@_line_start_bool
-        \tl_put_right:Nx \l_@@_current_line_tl
-          { \l_@@_current_indentation_tl \l_@@_current_word_tl }
-        \int_add:Nn \l_@@_current_line_int
-          { \l_@@_current_indentation_int }
+        \tex_edef:D \l_@@_line_part_tl
+          { \if_false: } \fi:
+            \exp_after:wN \@@_wrap_break_first:w
+            \l_@@_line_part_tl
+            #1
+            { ? \@@_wrap_break_end:w }
+            \q_mark
       }
+    \cs_new:Npn \@@_wrap_break_first:w ##1 #1 ##2
       {
-        \tl_put_right:Nx \l_@@_current_line_tl
-          { ~ \l_@@_current_word_tl }
-        \int_incr:N \l_@@_current_line_int
+        \use_none:nn ##2 \@@_wrap_break_none:w
+        \@@_wrap_break_loop:w ##1 #1 ##2
       }
-  }
-\cs_new_protected:Npn \@@_wrap_word_newline:
-  {
-    \@@_wrap_set_target:
-    \tl_put_right:Nx \l_@@_wrap_tl
-      { \l_@@_current_line_tl \l_@@_newline_tl }
-    \int_set:Nn \l_@@_current_line_int
+    \cs_new:Npn \@@_wrap_break_none:w ##1##2 #1 ##3 \q_mark ##4 #1
       {
-        \l_@@_current_word_int
-        + \l_@@_current_indentation_int
+        \tl_if_empty:NTF \l_@@_line_tl
+          { ##2 ##4 \@@_wrap_line_end:nw { } }
+          { \@@_wrap_line_end:nw { \@@_wrap_trim:N } ##2 ##4 #1 }
       }
-    \tl_set:Nx \l_@@_current_line_tl
-      { \l_@@_current_indentation_tl \l_@@_current_word_tl }
+    \cs_new:Npn \@@_wrap_break_loop:w ##1 #1 ##2 #1 ##3
+      {
+        \use_none:n ##3
+        ##1 #1
+        \@@_wrap_break_loop:w ##2 #1 ##3
+      }
+    \cs_new:Npn \@@_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \q_mark
+      { ##1 \@@_wrap_line_end:nw { } ##3 }
   }
+\exp_args:NV \@@_tmp:w \c_catcode_other_space_tl
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_special:w}
-% \begin{macro}[aux]{\@@_wrap_newline:w}
-% \begin{macro}[aux]{\@@_wrap_indent:w}
-% \begin{macro}[aux]{\@@_wrap_unindent:w}
-% \begin{macro}[aux]{\@@_wrap_end:w}
-%   When the \enquote{special} marker is encountered,
-%   read what operation to perform, as a space-delimited
-%   argument, perform it, and remember to loop.
-%   In fact, to avoid spurious spaces when two special
-%   actions follow each other, we look ahead for another
-%   copy of the marker.
-%   Forced newlines are almost identical to those caused by overflow,
-%   except that here the word is empty.
-%   To indent more, add four spaces to the start of the indentation
-%   token list. To reduce indentation, rebuild the indentation token
-%   list using \cs{prg_replicate:nn}.
-%   At the end, we simply save the last line (without the run-on text),
-%   and prevent the loop.
+% \begin{macro}[aux]{\@@_wrap_next_line:w}
+%   The special case where the end of a line coincides with the end of a
+%   chunk is detected here, to avoid a spurious empty line.  Otherwise,
+%   call \cs{@@_wrap_line:nw} to find characters for the next line
+%   (remembering to account for the indentation).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_wrap_special:w #1 ~ #2 ~ #3 ~ %
+\cs_new_protected:Npn \@@_wrap_next_line:w #1#2 \q_stop
   {
-    \use:c { @@_wrap_#1: }
-    \str_if_eq_x:nnTF { #2~#3 } { ~ \c_@@_wrap_marker_tl }
-      { \@@_wrap_special:w }
-      { \@@_wrap_loop:w #2 ~ #3 ~ }
+    \tl_clear:N \l_@@_line_tl
+    \token_if_eq_meaning:NNTF #1 \@@_wrap_end_chunk:w
+      {
+        \tl_clear:N \l_@@_line_part_tl
+        \bool_set_true:N \l_@@_line_break_bool
+        \int_set_eq:NN \l_@@_target_int \l_@@_line_target_int
+      }
+      {
+        \@@_wrap_line:nw
+          { \l_@@_indent_tl }
+          \l_@@_line_target_int - \l_@@_indent_int ;
+          #1 #2 \q_stop
+      }
   }
-\cs_new_protected:Npn \@@_wrap_newline:
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[aux]{\@@_wrap_indent:, \@@_wrap_unindent:}
+%   These functions are called after a chunk has been wrapped, when
+%   encountering \texttt{indent}/\texttt{unindent} markers.  Add the
+%   line part (last line part of the previous chunk) to the line so far
+%   and reset a boolean denoting the presence of a line-break.  Most
+%   importantly, add or remove one indent from the current indent (both
+%   the integer and the token list).  Finally, continue wrapping.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_wrap_indent:
   {
-    \@@_wrap_set_target:
-    \tl_put_right:Nx \l_@@_wrap_tl
-      { \l_@@_current_line_tl \l_@@_newline_tl }
-    \int_zero:N \l_@@_current_line_int
-    \tl_clear:N \l_@@_current_line_tl
-    \bool_set_true:N \l_@@_line_start_bool
+    \tl_put_right:Nx \l_@@_line_tl { \l_@@_line_part_tl }
+    \bool_set_false:N \l_@@_line_break_bool
+    \int_add:Nn \l_@@_indent_int { \l_@@_one_indent_int }
+    \tl_put_right:No \l_@@_indent_tl { \l_@@_one_indent_tl }
+    \@@_wrap_chunk:nw { \l_@@_target_int }
   }
-\cs_new_protected:Npx \@@_wrap_indent:
+\cs_new_protected:Npn \@@_wrap_unindent:
   {
-    \int_add:Nn \l_@@_current_indentation_int \c_four
-    \tl_put_right:Nx \exp_not:N \l_@@_current_indentation_tl
-      { \c_space_tl \c_space_tl \c_space_tl \c_space_tl }
+    \tl_put_right:Nx \l_@@_line_tl { \l_@@_line_part_tl }
+    \bool_set_false:N \l_@@_line_break_bool
+    \int_sub:Nn \l_@@_indent_int { \l_@@_one_indent_int }
+    \tl_set:Nx \l_@@_indent_tl
+      { \exp_after:wN \@@_unindent:w \l_@@_indent_tl }
+    \@@_wrap_chunk:nw { \l_@@_target_int }
   }
-\cs_new_protected:Npn \@@_wrap_unindent:
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[aux]{\@@_wrap_newline:, \@@_wrap_end:}
+%   These functions are called after a chunk has been line-wrapped, when
+%   encountering a \texttt{newline}/\texttt{end} marker.  Unless we just
+%   took a line-break, store the line part and the line so far into the
+%   whole \cs{l_@@_wrap_tl}, trimming a trailing space.  In the
+%   \texttt{newline} case look for a new line (of length
+%   \cs{l_@@_line_target_int}) in a new chunk.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_wrap_newline:
   {
-    \int_sub:Nn \l_@@_current_indentation_int \c_four
-    \tl_set:Nx \l_@@_current_indentation_tl
-      { \prg_replicate:nn \l_@@_current_indentation_int { ~ } }
+    \bool_if:NF \l_@@_line_break_bool
+      { \@@_wrap_store_do:n { \@@_wrap_trim:N } }
+    \bool_set_false:N \l_@@_line_break_bool
+    \@@_wrap_chunk:nw { \l_@@_line_target_int }
   }
 \cs_new_protected:Npn \@@_wrap_end:
   {
-    \tl_put_right:Nx \l_@@_wrap_tl
-      { \l_@@_current_line_tl }
-    \use_none_delimit_by_q_stop:w
+    \bool_if:NF \l_@@_line_break_bool
+      { \@@_wrap_store_do:n { \@@_wrap_trim:N } }
+    \bool_set_false:N \l_@@_line_break_bool
   }
 %    \end{macrocode}
 % \end{macro}
+%
+% \begin{macro}[aux]{\@@_wrap_store_do:n}
+%   First add the last line part to the line, then append it to
+%   \cs{l_@@_wrap_tl} with the appropriate new line (with
+%   \enquote{run-on} text), possibly with its last space removed (|#1|
+%   is empty or \cs{@@_wrap_trim:N}).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_wrap_store_do:n #1
+  {
+    \tl_set:Nx \l_@@_line_tl
+      { \l_@@_line_tl \l_@@_line_part_tl }
+    \tl_set:Nx \l_@@_wrap_tl
+      {
+        \l_@@_wrap_tl
+        \l_@@_newline_tl
+        #1 \l_@@_line_tl
+      }
+    \tl_clear:N \l_@@_line_tl
+  }
+%    \end{macrocode}
 % \end{macro}
+%
+% \begin{macro}[EXP, aux]{\@@_wrap_trim:N, \@@_wrap_trim:w}
+%   Remove one trailing \enquote{other} space from the argument.
+%    \begin{macrocode}
+\cs_set_protected:Npn \@@_tmp:w #1
+  {
+    \cs_new:Npn \@@_wrap_trim:N ##1
+      { \tl_if_empty:NF ##1 { \exp_after:wN \@@_wrap_trim:w ##1 \q_stop } }
+    \cs_new:Npn \@@_wrap_trim:w ##1 #1 \q_stop {##1}
+  }
+\exp_args:NV \@@_tmp:w \c_catcode_other_space_tl
+%    \end{macrocode}
 % \end{macro}
-% \end{macro}
-% \end{macro}
 %
 % \subsection{Messages}
 %
@@ -1878,8 +2061,13 @@
   {
     File~names~must~contain~balanced~numbers~of~quotes~(").
   }
-\__msg_kernel_new:nnn { kernel } { indent-outside-wrapping-code }
-  { Only~\iow_wrap:nnnN~(arg~1)~allows~\iow_indent:n }
+\__msg_kernel_new:nnnn { kernel } { iow-indent }
+  { Only~#1 (arg~1)~allows~#2 }
+  {
+    The~command~#2 can~only~be~used~in~messages~
+    which~will~be~wrapped~using~#1.~
+    It~was~called~with~argument~'#3'.
+  }
 %    \end{macrocode}
 %
 % \subsection{Deprecated functions}

Modified: trunk/l3kernel/l3str.dtx
===================================================================
--- trunk/l3kernel/l3str.dtx	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/l3str.dtx	2017-02-11 03:16:17 UTC (rev 6880)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-%% File: l3str.dtx Copyright (C) 2011-2016 The LaTeX3 Project
+%% File: l3str.dtx Copyright (C) 2011-2017 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
@@ -612,6 +612,15 @@
 %   time quadratic in the character count of the string.
 % \end{function}
 %
+% \begin{function}[rEXP]{\__str_to_other_fast:n}
+%   \begin{syntax}
+%     \cs{__str_to_other_fast:n} \Arg{token list}
+%   \end{syntax}
+%   Same behaviour \cs{__str_to_other:n} but only restricted-expandable.
+%   It takes a time linear in the character count of the string.
+%   It is used for \cs{iow_wrap:nnnN}.
+% \end{function}
+%
 % \begin{function}[EXP]{\__str_count:n}
 %   \begin{syntax}
 %     \cs{__str_count:n} \Arg{other string}
@@ -976,6 +985,38 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}[rEXP, int]{\@@_to_other_fast:n}
+% \begin{macro}[rEXP, aux]{\@@_to_other_fast_loop:w, \@@_to_other_fast_end:w}
+%   The difference with \cs{@@_to_other:n} is that the converted part is
+%   left in the input stream, making these commands only
+%   restricted-expandable.
+%    \begin{macrocode}
+\cs_new:Npn \@@_to_other_fast:n #1
+  {
+    \exp_after:wN \@@_to_other_fast_loop:w \tl_to_str:n {#1} ~
+      A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_stop
+  }
+\group_begin:
+\tex_lccode:D `\* = `\  %
+\tex_lccode:D `\A = `\A 
+\tex_lowercase:D
+  {
+    \group_end:
+    \cs_new:Npn \@@_to_other_fast_loop:w
+      #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 ~
+      {
+        \if_meaning:w A #9
+          \@@_to_other_fast_end:w
+        \fi:
+        #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * #9
+        \@@_to_other_fast_loop:w *
+      }
+    \cs_new:Npn \@@_to_other_fast_end:w #1 * A #2 \q_stop {#1}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}[EXP]
 %   {\str_item:Nn, \str_item:cn, \str_item:nn, \str_item_ignore_spaces:nn}
 % \begin{macro}[EXP, aux]{\@@_item:nn, \@@_item:w}

Modified: trunk/l3kernel/testfiles/m3expl001.luatex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl001.luatex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl001.luatex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -717,6 +717,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2854,48 +2857,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count118
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count119
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count120
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count121
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count122
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count119
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count120
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count121
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count122
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl001.ptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl001.ptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl001.ptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2842,48 +2845,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count119
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count120
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count121
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count122
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count123
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count120
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count121
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count122
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count123
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl001.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl001.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl001.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2842,48 +2845,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count118
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count119
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count120
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count121
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count122
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count119
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count120
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count121
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count122
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl001.uptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl001.uptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl001.uptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2842,48 +2845,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count119
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count120
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count121
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count122
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count123
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count120
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count121
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count122
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count123
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl001.xetex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl001.xetex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl001.xetex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2852,48 +2855,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count118
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count119
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count120
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count121
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count122
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count119
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count120
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count121
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count122
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl002.luatex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl002.luatex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl002.luatex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -10,10 +10,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl002.ptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl002.ptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl002.ptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count117
 \g__prg_map_int=\count118
 \l_iow_line_count_int=\count119
-\l__iow_target_count_int=\count120
-\l__iow_current_line_int=\count121
-\l__iow_current_word_int=\count122
-\l__iow_current_indentation_int=\count123
+\l__iow_line_target_int=\count120
+\l__iow_target_int=\count121
+\l__iow_one_indent_int=\count122
+\l__iow_indent_int=\count123
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl002.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl002.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl002.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl002.uptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl002.uptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl002.uptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count117
 \g__prg_map_int=\count118
 \l_iow_line_count_int=\count119
-\l__iow_target_count_int=\count120
-\l__iow_current_line_int=\count121
-\l__iow_current_word_int=\count122
-\l__iow_current_indentation_int=\count123
+\l__iow_line_target_int=\count120
+\l__iow_target_int=\count121
+\l__iow_one_indent_int=\count122
+\l__iow_indent_int=\count123
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl002.xetex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl002.xetex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl002.xetex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl003.luatex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl003.luatex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl003.luatex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -717,6 +717,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2855,48 +2858,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count118
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count119
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count120
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count121
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count122
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count119
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count120
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count121
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count122
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl003.ptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl003.ptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl003.ptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2843,48 +2846,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count119
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count120
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count121
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count122
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count123
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count120
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count121
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count122
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count123
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl003.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl003.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl003.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2843,48 +2846,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count118
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count119
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count120
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count121
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count122
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count119
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count120
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count121
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count122
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl003.uptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl003.uptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl003.uptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2843,48 +2846,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count119
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count120
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count121
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count122
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count123
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count120
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count121
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count122
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count123
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl003.xetex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl003.xetex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl003.xetex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -715,6 +715,9 @@
 Defining \__str_to_other:n on line ...
 Defining \__str_to_other_loop:w on line ...
 Defining \__str_to_other_end:w on line ...
+Defining \__str_to_other_fast:n on line ...
+Defining \__str_to_other_fast_loop:w on line ...
+Defining \__str_to_other_fast_end:w on line ...
 Defining \str_item:Nn on line ...
 Defining \str_item:cn on line ...
 Defining \str_item:nn on line ...
@@ -2853,48 +2856,63 @@
 Defining \iow_term:n on line ...
 Defining \iow_newline: on line ...
 Defining \iow_char:N on line ...
+Defining \c_catcode_other_space_tl on line ...
 Defining \l_iow_line_count_int on line ...
 \l_iow_line_count_int=\count118
-Defining \l__iow_target_count_int on line ...
-\l__iow_target_count_int=\count119
-Defining \l__iow_current_line_int on line ...
-\l__iow_current_line_int=\count120
-Defining \l__iow_current_word_int on line ...
-\l__iow_current_word_int=\count121
-Defining \l__iow_current_indentation_int on line ...
-\l__iow_current_indentation_int=\count122
-Defining \l__iow_current_line_tl on line ...
-Defining \l__iow_current_word_tl on line ...
-Defining \l__iow_current_indentation_tl on line ...
+Defining \l__iow_newline_tl on line ...
+Defining \l__iow_line_target_int on line ...
+\l__iow_line_target_int=\count119
+Defining \l__iow_target_int on line ...
+\l__iow_target_int=\count120
+Defining \l__iow_one_indent_tl on line ...
+Defining \l__iow_one_indent_int on line ...
+\l__iow_one_indent_int=\count121
+Defining \__iow_unindent:w on line ...
+Defining \__iow_set_indent:n on line ...
+Defining \l__iow_indent_tl on line ...
+Defining \l__iow_indent_int on line ...
+\l__iow_indent_int=\count122
+Defining \l__iow_line_tl on line ...
+Defining \l__iow_line_part_tl on line ...
+Defining \l__iow_line_break_bool on line ...
 Defining \l__iow_wrap_tl on line ...
-Defining \l__iow_newline_tl on line ...
-Defining \l__iow_line_start_bool on line ...
-Defining \c_catcode_other_space_tl on line ...
 Defining c__iow_wrap_marker_tl on line ...
 Defining \c__iow_wrap_end_marker_tl on line ...
 Defining \c__iow_wrap_newline_marker_tl on line ...
 Defining \c__iow_wrap_indent_marker_tl on line ...
 Defining \c__iow_wrap_unindent_marker_tl on line ...
+Defining \iow_indent:n on line ...
 Defining \__iow_indent:n on line ...
 Defining \__iow_indent_error:n on line ...
-Defining \iow_indent:n on line ...
 Defining \iow_wrap:nnnN on line ...
 Defining \__iow_wrap_set:Nx on line ...
-Defining \__iow_wrap_set_target: on line ...
-Defining \__iow_wrap_loop:w on line ...
-Defining \__iow_wrap_word: on line ...
-Defining \__iow_wrap_word_fits: on line ...
-Defining \__iow_wrap_word_newline: on line ...
-Defining \__iow_wrap_special:w on line ...
-Defining \__iow_wrap_newline: on line ...
+Defining \__iow_wrap_do: on line ...
+Defining \__iow_wrap_start:w on line ...
+Defining \__iow_wrap_chunk:nw on line ...
+Defining \__iow_wrap_line:nw on line ...
+Defining \__iow_wrap_line_loop:w on line ...
+Defining \__iow_wrap_line_aux:Nw on line ...
+Defining \__iow_wrap_line_end:NnnnnnnnN on line ...
+Defining \__iow_wrap_line_end:nw on line ...
+Defining \__iow_wrap_end_chunk:w on line ...
+Defining \__iow_wrap_break:w on line ...
+Defining \__iow_wrap_break_first:w on line ...
+Defining \__iow_wrap_break_none:w on line ...
+Defining \__iow_wrap_break_loop:w on line ...
+Defining \__iow_wrap_break_end:w on line ...
+Defining \__iow_wrap_next_line:w on line ...
 Defining \__iow_wrap_indent: on line ...
 Defining \__iow_wrap_unindent: on line ...
+Defining \__iow_wrap_newline: on line ...
 Defining \__iow_wrap_end: on line ...
+Defining \__iow_wrap_store_do:n on line ...
+Defining \__iow_wrap_trim:N on line ...
+Defining \__iow_wrap_trim:w on line ...
 Defining message LaTeX/kernel/file-not-found on line ...
 Defining message LaTeX/kernel/input-streams-exhausted on line ...
 Defining message LaTeX/kernel/output-streams-exhausted on line ...
 Defining message LaTeX/kernel/unbalanced-quote-in-filename on line ...
-Defining message LaTeX/kernel/indent-outside-wrapping-code on line ...
+Defining message LaTeX/kernel/iow-indent on line ...
 Defining \ior_get_str:NN on line ...
 Defining \if_dim:w on line ...
 Defining \__dim_eval:w on line ...

Modified: trunk/l3kernel/testfiles/m3expl004.luatex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl004.luatex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl004.luatex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -10,10 +10,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl004.ptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl004.ptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl004.ptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count117
 \g__prg_map_int=\count118
 \l_iow_line_count_int=\count119
-\l__iow_target_count_int=\count120
-\l__iow_current_line_int=\count121
-\l__iow_current_word_int=\count122
-\l__iow_current_indentation_int=\count123
+\l__iow_line_target_int=\count120
+\l__iow_target_int=\count121
+\l__iow_one_indent_int=\count122
+\l__iow_indent_int=\count123
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl004.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl004.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl004.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl004.uptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl004.uptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl004.uptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count117
 \g__prg_map_int=\count118
 \l_iow_line_count_int=\count119
-\l__iow_target_count_int=\count120
-\l__iow_current_line_int=\count121
-\l__iow_current_word_int=\count122
-\l__iow_current_indentation_int=\count123
+\l__iow_line_target_int=\count120
+\l__iow_target_int=\count121
+\l__iow_one_indent_int=\count122
+\l__iow_indent_int=\count123
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl004.xetex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl004.xetex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl004.xetex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -9,10 +9,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl006.luatex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl006.luatex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl006.luatex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -11,10 +11,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl006.ptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl006.ptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl006.ptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -10,10 +10,10 @@
 \g_tmpb_int=\count117
 \g__prg_map_int=\count118
 \l_iow_line_count_int=\count119
-\l__iow_target_count_int=\count120
-\l__iow_current_line_int=\count121
-\l__iow_current_word_int=\count122
-\l__iow_current_indentation_int=\count123
+\l__iow_line_target_int=\count120
+\l__iow_target_int=\count121
+\l__iow_one_indent_int=\count122
+\l__iow_indent_int=\count123
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl006.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl006.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl006.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -10,10 +10,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl006.uptex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl006.uptex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl006.uptex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -10,10 +10,10 @@
 \g_tmpb_int=\count117
 \g__prg_map_int=\count118
 \l_iow_line_count_int=\count119
-\l__iow_target_count_int=\count120
-\l__iow_current_line_int=\count121
-\l__iow_current_word_int=\count122
-\l__iow_current_indentation_int=\count123
+\l__iow_line_target_int=\count120
+\l__iow_target_int=\count121
+\l__iow_one_indent_int=\count122
+\l__iow_indent_int=\count123
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3expl006.xetex.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3expl006.xetex.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3expl006.xetex.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -10,10 +10,10 @@
 \g_tmpb_int=\count116
 \g__prg_map_int=\count117
 \l_iow_line_count_int=\count118
-\l__iow_target_count_int=\count119
-\l__iow_current_line_int=\count120
-\l__iow_current_word_int=\count121
-\l__iow_current_indentation_int=\count122
+\l__iow_line_target_int=\count119
+\l__iow_target_int=\count120
+\l__iow_one_indent_int=\count121
+\l__iow_indent_int=\count122
 \c_zero_dim=\dimen132
 \c_max_dim=\dimen133
 \l_tmpa_dim=\dimen134

Modified: trunk/l3kernel/testfiles/m3msg002.tlg
===================================================================
--- trunk/l3kernel/testfiles/m3msg002.tlg	2017-02-11 03:01:59 UTC (rev 6879)
+++ trunk/l3kernel/testfiles/m3msg002.tlg	2017-02-11 03:16:17 UTC (rev 6880)
@@ -176,15 +176,21 @@
 TEST 7: Misused indentation
 ============================================================
 1
-! Undefined control sequence.
-<argument> \LaTeX3 error: 
-                           Only \iow_wrap:nnnN (arg 1) allows \iow_indent:n 
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+! LaTeX error: "kernel/iow-indent"
+! 
+! Only \iow_wrap:nnnN (arg 1) allows \iow_indent:n 
+! 
+! See the LaTeX3 documentation for further information.
+! 
+! For immediate help type H <return>.
+!...............................................  
 l. ...  }
-The control sequence at the end of the top line
-of your error message was never \def'ed. If you have
-misspelled it (e.g., `\hobx'), type `I' and the correct
-spelling (e.g., `I\hbox'). Otherwise just continue,
-and I'll forget about whatever was undefined.
+|'''''''''''''''''''''''''''''''''''''''''''''''
+| The command \iow_indent:n can only be used in messages which will be wrapped
+| using \iow_wrap:nnnN . It was called with argument '\TYPE {2}'.
+|...............................................
 2
 ! Undefined control sequence.
 <argument> \LaTeX3 error: 



More information about the latex3-commits mailing list