1//===- LineIterator.cpp - Implementation of line iteration ----------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "llvm/Support/LineIterator.h" 11#include "llvm/Support/MemoryBuffer.h" 12 13using namespace llvm; 14 15line_iterator::line_iterator(const MemoryBuffer &Buffer, char CommentMarker) 16 : Buffer(Buffer.getBufferSize() ? &Buffer : nullptr), 17 CommentMarker(CommentMarker), LineNumber(1), 18 CurrentLine(Buffer.getBufferSize() ? Buffer.getBufferStart() : nullptr, 19 0) { 20 // Ensure that if we are constructed on a non-empty memory buffer that it is 21 // a null terminated buffer. 22 if (Buffer.getBufferSize()) { 23 assert(Buffer.getBufferEnd()[0] == '\0'); 24 advance(); 25 } 26} 27 28void line_iterator::advance() { 29 assert(Buffer && "Cannot advance past the end!"); 30 31 const char *Pos = CurrentLine.end(); 32 assert(Pos == Buffer->getBufferStart() || *Pos == '\n' || *Pos == '\0'); 33 34 if (CommentMarker == '\0') { 35 // If we're not stripping comments, this is simpler. 36 size_t Blanks = 0; 37 while (Pos[Blanks] == '\n') 38 ++Blanks; 39 Pos += Blanks; 40 LineNumber += Blanks; 41 } else { 42 // Skip comments and count line numbers, which is a bit more complex. 43 for (;;) { 44 if (*Pos == CommentMarker) 45 do { 46 ++Pos; 47 } while (*Pos != '\0' && *Pos != '\n'); 48 if (*Pos != '\n') 49 break; 50 ++Pos; 51 ++LineNumber; 52 } 53 } 54 55 if (*Pos == '\0') { 56 // We've hit the end of the buffer, reset ourselves to the end state. 57 Buffer = nullptr; 58 CurrentLine = StringRef(); 59 return; 60 } 61 62 // Measure the line. 63 size_t Length = 0; 64 do { 65 ++Length; 66 } while (Pos[Length] != '\0' && Pos[Length] != '\n'); 67 68 CurrentLine = StringRef(Pos, Length); 69} 70