Add puts_unfiltered method to ui_file
authorTom Tromey <tom@tromey.com>
Fri, 31 Dec 2021 21:34:07 +0000 (14:34 -0700)
committerTom Tromey <tom@tromey.com>
Tue, 29 Mar 2022 18:46:24 +0000 (12:46 -0600)
When the pager is rewritten as a ui_file, gdb will still need a way to
bypass the filtering.  After examining a few approaches, I chose this
patch, which adds a puts_unfiltered method to ui_file.  For most
implementations of ui_file, this will just delegate to puts.  This
patch also switches printf_unfiltered to use the new method.

gdb/ui-file.h
gdb/utils.c

index 8d41f6f8300cf6311fb7ad219eb3d2c248ea7c15..7ae3937e41af535e7ae1ea0e63b6822e0b2576a3 100644 (file)
@@ -124,6 +124,14 @@ public:
      used to force out output from the wrap_buffer.  */
   void wrap_here (int indent);
 
+  /* Print STR, bypassing any paging that might be done by this
+     ui_file.  Note that nearly no code should call this -- it's
+     intended for use by printf_filtered, but nothing else.  */
+  virtual void puts_unfiltered (const char *str)
+  {
+    this->puts (str);
+  }
+
 private:
 
   /* Helper function for putstr and putstrn.  Print the character C on
@@ -342,6 +350,12 @@ public:
     return m_one->can_page () || m_two->can_page ();
   }
 
+  void puts_unfiltered (const char *str) override
+  {
+    m_one->puts_unfiltered (str);
+    m_two->puts_unfiltered (str);
+  }
+
 private:
   /* The two underlying ui_files.  */
   ui_file *m_one;
index a0717213f0f09df9315eb8fe91fbba5277b7a874..8f479c487d349a982c97b9260a056a7d58eeb4ce 100644 (file)
@@ -2025,7 +2025,9 @@ printf_unfiltered (const char *format, ...)
   va_list args;
 
   va_start (args, format);
-  vfprintf_unfiltered (gdb_stdout, format, args);
+  string_file file (gdb_stdout->can_emit_style_escape ());
+  file.vprintf (format, args);
+  gdb_stdout->puts_unfiltered (file.string ().c_str ());
   va_end (args);
 }