diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-11-03 14:09:47 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-11-03 14:09:47 +0000 |
commit | 42bce8f69db28b6b39453ecfbf8da6fc45fb14bf (patch) | |
tree | 885370aceaffddb991f1a423b718e85e7dbe350d /llvm/lib/Support/LineIterator.cpp | |
parent | 5eac3c6a44405e86639901e802fa86a4f02792f3 (diff) | |
download | bcm5719-llvm-42bce8f69db28b6b39453ecfbf8da6fc45fb14bf.tar.gz bcm5719-llvm-42bce8f69db28b6b39453ecfbf8da6fc45fb14bf.zip |
Add CRLF support to LineIterator.
The MRI scripts have to work with CRLF, and in general it is probably
a good idea to support this in a core utility like LineIterator.
llvm-svn: 221153
Diffstat (limited to 'llvm/lib/Support/LineIterator.cpp')
-rw-r--r-- | llvm/lib/Support/LineIterator.cpp | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/llvm/lib/Support/LineIterator.cpp b/llvm/lib/Support/LineIterator.cpp index 573e21a3cba..5baa1a37f38 100644 --- a/llvm/lib/Support/LineIterator.cpp +++ b/llvm/lib/Support/LineIterator.cpp @@ -12,6 +12,26 @@ using namespace llvm; +static bool isAtLineEnd(const char *P) { + if (*P == '\n') + return true; + if (*P == '\r' && *(P + 1) == '\n') + return true; + return false; +} + +static bool skipIfAtLineEnd(const char *&P) { + if (*P == '\n') { + ++P; + return true; + } + if (*P == '\r' && *(P + 1) == '\n') { + P += 2; + return true; + } + return false; +} + line_iterator::line_iterator(const MemoryBuffer &Buffer, bool SkipBlanks, char CommentMarker) : Buffer(Buffer.getBufferSize() ? &Buffer : nullptr), @@ -23,7 +43,7 @@ line_iterator::line_iterator(const MemoryBuffer &Buffer, bool SkipBlanks, if (Buffer.getBufferSize()) { assert(Buffer.getBufferEnd()[0] == '\0'); // Make sure we don't skip a leading newline if we're keeping blanks - if (SkipBlanks || *Buffer.getBufferStart() != '\n') + if (SkipBlanks || !isAtLineEnd(Buffer.getBufferStart())) advance(); } } @@ -32,33 +52,27 @@ void line_iterator::advance() { assert(Buffer && "Cannot advance past the end!"); const char *Pos = CurrentLine.end(); - assert(Pos == Buffer->getBufferStart() || *Pos == '\n' || *Pos == '\0'); + assert(Pos == Buffer->getBufferStart() || isAtLineEnd(Pos) || *Pos == '\0'); - if (*Pos == '\n') { - ++Pos; + if (skipIfAtLineEnd(Pos)) ++LineNumber; - } - if (!SkipBlanks && *Pos == '\n') { + if (!SkipBlanks && isAtLineEnd(Pos)) { // Nothing to do for a blank line. } else if (CommentMarker == '\0') { // If we're not stripping comments, this is simpler. - size_t Blanks = 0; - while (Pos[Blanks] == '\n') - ++Blanks; - Pos += Blanks; - LineNumber += Blanks; + while (skipIfAtLineEnd(Pos)) + ++LineNumber; } else { // Skip comments and count line numbers, which is a bit more complex. for (;;) { - if (*Pos == '\n' && !SkipBlanks) + if (isAtLineEnd(Pos) && !SkipBlanks) break; if (*Pos == CommentMarker) do { ++Pos; - } while (*Pos != '\0' && *Pos != '\n'); - if (*Pos != '\n') + } while (*Pos != '\0' && !isAtLineEnd(Pos)); + if (!skipIfAtLineEnd(Pos)) break; - ++Pos; ++LineNumber; } } @@ -72,7 +86,7 @@ void line_iterator::advance() { // Measure the line. size_t Length = 0; - while (Pos[Length] != '\0' && Pos[Length] != '\n') { + while (Pos[Length] != '\0' && !isAtLineEnd(&Pos[Length])) { ++Length; } |