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