[llvm-commits] [llvm] r79379 - in /llvm/trunk: include/llvm/Support/FormattedStream.h include/llvm/Support/raw_ostream.h lib/Support/FormattedStream.cpp

Daniel Dunbar daniel at zuster.org
Tue Aug 18 16:36:04 PDT 2009


Author: ddunbar
Date: Tue Aug 18 18:36:04 2009
New Revision: 79379

URL: http://llvm.org/viewvc/llvm-project?rev=79379&view=rev
Log:
raw_ostream: Reduce FormattedStream's reliance on raw_ostream's implementation.
 - 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.

Modified:
    llvm/trunk/include/llvm/Support/FormattedStream.h
    llvm/trunk/include/llvm/Support/raw_ostream.h
    llvm/trunk/lib/Support/FormattedStream.cpp

Modified: llvm/trunk/include/llvm/Support/FormattedStream.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FormattedStream.h?rev=79379&r1=79378&r2=79379&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Support/FormattedStream.h (original)
+++ llvm/trunk/include/llvm/Support/FormattedStream.h Tue Aug 18 18:36:04 2009
@@ -58,7 +58,7 @@
     /// 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 @@
       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 @@
     }
     explicit formatted_raw_ostream()
       : raw_ostream(), TheStream(0), DeleteStream(false), ColumnScanned(0) {
-      Scanned = begin();
+      Scanned = 0;
     }
 
     ~formatted_raw_ostream() {
@@ -116,7 +116,7 @@
         SetUnbuffered();
       TheStream->SetUnbuffered();
 
-      Scanned = begin();
+      Scanned = 0;
     }
 
     /// PadToColumn - Align the output to some column number.  If the current

Modified: llvm/trunk/include/llvm/Support/raw_ostream.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/raw_ostream.h?rev=79379&r1=79378&r2=79379&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Support/raw_ostream.h (original)
+++ llvm/trunk/include/llvm/Support/raw_ostream.h Tue Aug 18 18:36:04 2009
@@ -251,9 +251,9 @@
   /// 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

Modified: llvm/trunk/lib/Support/FormattedStream.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FormattedStream.cpp?rev=79379&r1=79378&r2=79379&view=diff

==============================================================================
--- llvm/trunk/lib/Support/FormattedStream.cpp (original)
+++ llvm/trunk/lib/Support/FormattedStream.cpp Tue Aug 18 18:36:04 2009
@@ -36,13 +36,20 @@
 
 /// 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::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::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





More information about the llvm-commits mailing list