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