1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef TOOLS_GN_C_INCLUDE_ITERATOR_H_ 6 #define TOOLS_GN_C_INCLUDE_ITERATOR_H_ 7 8 #include "base/basictypes.h" 9 #include "base/strings/string_piece.h" 10 11 class InputFile; 12 class LocationRange; 13 14 // Iterates through #includes in C source and header files. 15 // 16 // This only returns includes we want to check, which is user includes with 17 // double-quotes: #include "..." 18 class CIncludeIterator { 19 public: 20 // The InputFile pointed to must outlive this class. 21 CIncludeIterator(const InputFile* input); 22 ~CIncludeIterator(); 23 24 // Fills in the string with the contents of the next include, and the 25 // location with where it came from, and returns true, or returns false if 26 // there are no more includes. 27 bool GetNextIncludeString(base::StringPiece* out, LocationRange* location); 28 29 // Maximum numbef of non-includes we'll tolerate before giving up. This does 30 // not count comments or preprocessor. 31 static const int kMaxNonIncludeLines; 32 33 private: 34 // Returns false on EOF, otherwise fills in the given line and the one-based 35 // line number into *line_number; 36 bool GetNextLine(base::StringPiece* line, int* line_number); 37 38 const InputFile* input_file_; 39 40 // This just points into input_file_.contents() for convenience. 41 base::StringPiece file_; 42 43 // 0-based offset into the file. 44 size_t offset_; 45 46 int line_number_; // One-based. Indicates the last line we read. 47 48 // Number of lines we've processed since seeing the last include (or the 49 // beginning of the file) with some exceptions. 50 int lines_since_last_include_; 51 52 DISALLOW_COPY_AND_ASSIGN(CIncludeIterator); 53 }; 54 55 #endif // TOOLS_GN_INCLUDE_ITERATOR_H_ 56