raw_ostream: Reduce FormattedStream's reliance on raw_ostream's implementation.
authorDaniel Dunbar <daniel@zuster.org>
Tue, 18 Aug 2009 23:36:04 +0000 (23:36 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 18 Aug 2009 23:36:04 +0000 (23:36 +0000)
 - Kill off begin(), end(), and iterator. It isn't clear what these
   mean. Instead provide getBufferStart(), which can be used with
   GetNumBytesInBuffer to the same effect.

 - Update ComputeColumn to take arguments for the buffer to scan, this
   simplifies the implementation of write_impl substantially.

 - This should also fix possible problems with the scanning pointer pointing
   outside of the current raw_ostream buffer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79379 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/FormattedStream.h
include/llvm/Support/raw_ostream.h
lib/Support/FormattedStream.cpp

index 6157c40de68dc54efe653cf6c376087474b82342..3a872058c9d82f601bedf369e1ba8c849b496ecc 100644 (file)
@@ -58,7 +58,7 @@ namespace llvm
     /// Scanned - This points to one past the last character in the
     /// buffer we've scanned.
     ///
-    iterator Scanned;
+    const char *Scanned;
 
     virtual void write_impl(const char *Ptr, size_t Size);
 
@@ -70,10 +70,10 @@ namespace llvm
       return TheStream->tell() - TheStream->GetNumBytesInBuffer();
     }
 
-    /// ComputeColumn - Examine the current output and figure out
-    /// which column we end up in after output.
+    /// ComputeColumn - Examine the given output buffer and figure out which
+    /// column we end up in after output.
     ///
-    void ComputeColumn();
+    void ComputeColumn(const char *Ptr, size_t size);
 
   public:
     /// formatted_raw_ostream - Open the specified file for
@@ -92,7 +92,7 @@ namespace llvm
     }
     explicit formatted_raw_ostream()
       : raw_ostream(), TheStream(0), DeleteStream(false), ColumnScanned(0) {
-      Scanned = begin();
+      Scanned = 0;
     }
 
     ~formatted_raw_ostream() {
@@ -116,7 +116,7 @@ namespace llvm
         SetUnbuffered();
       TheStream->SetUnbuffered();
 
-      Scanned = begin();
+      Scanned = 0;
     }
 
     /// PadToColumn - Align the output to some column number.  If the current
index b1b96f231695b6bbf80d7912e7bdb895c36952fa..5e20deb16644d282eb7ee5e7c8adae5f931f42fd 100644 (file)
@@ -251,9 +251,9 @@ protected:
   /// been encountered.
   void error_detected() { Error = true; }
 
-  typedef char * iterator;
-  iterator begin() { return OutBufStart; }
-  iterator end() { return OutBufCur; }
+  /// getBufferStart - Return the beginning of the current stream buffer, or 0
+  /// if the stream is unbuffered.
+  const char *getBufferStart() const { return OutBufStart; }
 
   //===--------------------------------------------------------------------===//
   // Private Interface
index 0c787f8c4f90c508305d9950c20ebb0eabb401cb..4e624275300eec0e7186cb48964fa6ec04b2eb80 100644 (file)
@@ -36,13 +36,20 @@ static unsigned CountColumns(unsigned Column, const char *Ptr, size_t Size) {
 
 /// ComputeColumn - Examine the current output and figure out which
 /// column we end up in after output.
-void formatted_raw_ostream::ComputeColumn() {
-  // The buffer may have been allocated underneath us.
-  if (Scanned == 0) Scanned = begin();
-  // Scan all characters added since our last scan to determine the new column.
-  ColumnScanned = CountColumns(ColumnScanned, Scanned, end() - Scanned);
-  // We're now current with everything in the buffer.
-  Scanned = end();
+void formatted_raw_ostream::ComputeColumn(const char *Ptr, size_t Size) {
+  // If our previous scan pointer is inside the buffer, assume we already
+  // scanned those bytes. This depends on raw_ostream to not change our buffer
+  // in unexpected ways.
+  if (Ptr <= Scanned && Scanned <= Ptr + Size) {
+    // Scan all characters added since our last scan to determine the new
+    // column.
+    ColumnScanned = CountColumns(ColumnScanned, Scanned, 
+                                 Size - (Scanned - Ptr));
+  } else
+    ColumnScanned = CountColumns(ColumnScanned, Ptr, Size);
+
+  // Update the scanning pointer.
+  Scanned = Ptr + Size;
 }
 
 /// PadToColumn - Align the output to some column number.
@@ -53,7 +60,7 @@ void formatted_raw_ostream::ComputeColumn() {
 ///
 void formatted_raw_ostream::PadToColumn(unsigned NewCol) { 
   // Figure out what's in the buffer and add it to the column count.
-  ComputeColumn();
+  ComputeColumn(getBufferStart(), GetNumBytesInBuffer());
 
   // Output spaces until we reach the desired column.
   unsigned num = NewCol - ColumnScanned;
@@ -70,24 +77,14 @@ void formatted_raw_ostream::PadToColumn(unsigned NewCol) {
 
 void formatted_raw_ostream::write_impl(const char *Ptr, size_t Size) {
   // Figure out what's in the buffer and add it to the column count.
-  ComputeColumn();
+  ComputeColumn(Ptr, Size);
 
   // Write the data to the underlying stream (which is unbuffered, so
   // the data will be immediately written out).
   TheStream->write(Ptr, Size);
 
-  // If this FormattedStream is unbuffered, scan the string that
-  // was just written to determine the new column.
-  if (Ptr == begin()) {
-    // Buffered mode. The buffer is being flushed; reset the scanning
-    // position to the beginning of the buffer.
-    assert(Ptr + Size == end() && "Buffer is not being fully flushed!");
-    Scanned = begin();
-  } else {
-    // Unbuffered mode. Immediately scan the string that was just
-    // written to determine the new column.
-    ColumnScanned = CountColumns(ColumnScanned, Ptr, Size);
-  }
+  // Reset the scanning pointer.
+  Scanned = 0;
 }
 
 /// fouts() - This returns a reference to a formatted_raw_ostream for