summaryrefslogtreecommitdiff
path: root/lib/Support/FormattedStream.cpp
diff options
context:
space:
mode:
authorDaniel Malea <daniel.malea@intel.com>2013-05-08 20:29:10 +0000
committerDaniel Malea <daniel.malea@intel.com>2013-05-08 20:29:10 +0000
commitf28e3c501e033f103405c03a4bbf848cb6e67a2a (patch)
tree23bf3846cd345be515c1cc3602909bc9db111b6e /lib/Support/FormattedStream.cpp
parentb637b9f89e88e8c1ffe147634c1b2b297fb6edeb (diff)
downloadllvm-f28e3c501e033f103405c03a4bbf848cb6e67a2a.tar.gz
llvm-f28e3c501e033f103405c03a4bbf848cb6e67a2a.tar.bz2
llvm-f28e3c501e033f103405c03a4bbf848cb6e67a2a.tar.xz
Add line tracking support to FormattedStream
- previously formatted_raw_ostream tracked columns, now it tracks lines too - used by (upcoming) DebugIR pass to know the line number to connect to each IR instruction git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181463 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/FormattedStream.cpp')
-rw-r--r--lib/Support/FormattedStream.cpp45
1 files changed, 25 insertions, 20 deletions
diff --git a/lib/Support/FormattedStream.cpp b/lib/Support/FormattedStream.cpp
index 231ae48759..9febf664f2 100644
--- a/lib/Support/FormattedStream.cpp
+++ b/lib/Support/FormattedStream.cpp
@@ -17,38 +17,43 @@
using namespace llvm;
-/// CountColumns - Examine the given char sequence and figure out which
-/// column we end up in after output.
+/// UpdatePosition - Examine the given char sequence and figure out which
+/// column we end up in after output, and how many line breaks are contained.
///
-static unsigned CountColumns(unsigned Column, const char *Ptr, size_t Size) {
- // Keep track of the current column by scanning the string for
- // special characters
+static void UpdatePosition(std::pair<unsigned, unsigned> &Position, const char *Ptr, size_t Size) {
+ unsigned &Column = Position.first;
+ unsigned &Line = Position.second;
+ // Keep track of the current column and line by scanning the string for
+ // special characters
for (const char *End = Ptr + Size; Ptr != End; ++Ptr) {
++Column;
- if (*Ptr == '\n' || *Ptr == '\r')
+ switch (*Ptr) {
+ case '\n':
+ Line += 1;
+ case '\r':
Column = 0;
- else if (*Ptr == '\t')
+ break;
+ case '\t':
// Assumes tab stop = 8 characters.
Column += (8 - (Column & 0x7)) & 0x7;
+ break;
+ }
}
-
- return Column;
}
-/// ComputeColumn - Examine the current output and figure out which
-/// column we end up in after output.
-void formatted_raw_ostream::ComputeColumn(const char *Ptr, size_t Size) {
+/// ComputePosition - Examine the current output and update line and column
+/// counts.
+void formatted_raw_ostream::ComputePosition(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) {
+ 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);
+ UpdatePosition(Position, Scanned, Size - (Scanned - Ptr));
+ else
+ UpdatePosition(Position, Ptr, Size);
// Update the scanning pointer.
Scanned = Ptr + Size;
@@ -60,16 +65,16 @@ void formatted_raw_ostream::ComputeColumn(const char *Ptr, size_t Size) {
///
formatted_raw_ostream &formatted_raw_ostream::PadToColumn(unsigned NewCol) {
// Figure out what's in the buffer and add it to the column count.
- ComputeColumn(getBufferStart(), GetNumBytesInBuffer());
+ ComputePosition(getBufferStart(), GetNumBytesInBuffer());
// Output spaces until we reach the desired column.
- indent(std::max(int(NewCol - ColumnScanned), 1));
+ indent(std::max(int(NewCol - getColumn()), 1));
return *this;
}
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(Ptr, Size);
+ ComputePosition(Ptr, Size);
// Write the data to the underlying stream (which is unbuffered, so
// the data will be immediately written out).