]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix style bug when paging
authorTom Tromey <tromey@adacore.com>
Wed, 1 May 2019 17:13:31 +0000 (11:13 -0600)
committerTom Tromey <tromey@adacore.com>
Wed, 8 May 2019 16:27:52 +0000 (10:27 -0600)
Philippe pointed out a styling bug that would occur in some conditions
when paging:

    https://sourceware.org/ml/gdb-patches/2019-04/msg00101.html

I was finally able to reproduce this, and this patch fixes the bug.

The problem occurred when text overflowed the line, causing a
pagination prompt, but when no wrap column had been set.  In this
case, the current style was reset to show the prompt, but then not
reset back to the previously applied style before emitting the rest of
the line.

The fix is to record the applied style in this case, and re-apply it
afterward -- but only if the pager prompt was emitted, something that
the existing style.exp pointed out on the first, more naive, version
of the patch.

Tested on x86-64 Fedora 29.

gdb/ChangeLog
2019-05-08  Tom Tromey  <tromey@adacore.com>

* utils.c (fputs_maybe_filtered): Reset style after paging, even
when no wrap column is set.

gdb/ChangeLog
gdb/utils.c

index ebd6a5251cdc874ba73ef8b0ea217ad3a6a7c0ae..40fc45283707f29f61075033dc3c9d84ce7fd63f 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-08  Tom Tromey  <tromey@adacore.com>
+
+       * utils.c (fputs_maybe_filtered): Reset style after paging, even
+       when no wrap column is set.
+
 2019-05-04  Tom Tromey  <tom@tromey.com>
 
        * psymtab.c (psymbol_name_matches, match_partial_symbol)
index dd686fa8aa2601603507ec6da461a6a61df7f907..83ddc23a9148a957d97904b696d6039d0f8f0695 100644 (file)
@@ -1808,10 +1808,20 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
            {
              unsigned int save_chars = chars_printed;
 
+             /* If we change the style, below, we'll want to reset it
+                before continuing to print.  If there is no wrap
+                column, then we'll only reset the style if the pager
+                prompt is given; and to avoid emitting style
+                sequences in the middle of a run of text, we track
+                this as well.  */
+             ui_file_style save_style;
+             bool did_paginate = false;
+
              chars_printed = 0;
              lines_printed++;
              if (wrap_column)
                {
+                 save_style = wrap_style;
                  if (can_emit_style_escape (stream))
                    emit_style_escape (ui_file_style (), stream);
                  /* If we aren't actually wrapping, don't output
@@ -1821,21 +1831,27 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
                  fputc_unfiltered ('\n', stream);
                }
              else
-               flush_wrap_buffer (stream);
+               {
+                 save_style = applied_style;
+                 flush_wrap_buffer (stream);
+               }
 
              /* Possible new page.  Note that
                 PAGINATION_DISABLED_FOR_COMMAND might be set during
                 this loop, so we must continue to check it here.  */
              if (lines_printed >= lines_per_page - 1
                  && !pagination_disabled_for_command)
-               prompt_for_continue ();
+               {
+                 prompt_for_continue ();
+                 did_paginate = true;
+               }
 
              /* Now output indentation and wrapped string.  */
              if (wrap_column)
                {
                  fputs_unfiltered (wrap_indent, stream);
                  if (can_emit_style_escape (stream))
-                   emit_style_escape (wrap_style, stream);
+                   emit_style_escape (save_style, stream);
                  /* FIXME, this strlen is what prevents wrap_indent from
                     containing tabs.  However, if we recurse to print it
                     and count its chars, we risk trouble if wrap_indent is
@@ -1846,6 +1862,8 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
                    + (save_chars - wrap_column);
                  wrap_column = 0;      /* And disable fancy wrap */
                }
+             else if (did_paginate && can_emit_style_escape (stream))
+               emit_style_escape (save_style, stream);
            }
        }