1 //
2 // Copyright 2011 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 #ifndef COMPILER_PREPROCESSOR_INPUT_H_
8 #define COMPILER_PREPROCESSOR_INPUT_H_
9 
10 #include <cstddef>
11 #include <vector>
12 
13 namespace angle
14 {
15 
16 namespace pp
17 {
18 
19 // Holds and reads input for Lexer.
20 class Input
21 {
22   public:
23     Input();
24     ~Input();
25     Input(size_t count, const char *const string[], const int length[]);
26 
count()27     size_t count() const { return mCount; }
string(size_t index)28     const char *string(size_t index) const { return mString[index]; }
length(size_t index)29     size_t length(size_t index) const { return mLength[index]; }
30 
31     size_t read(char *buf, size_t maxSize, int *lineNo);
32 
33     struct Location
34     {
35         size_t sIndex;  // String index;
36         size_t cIndex;  // Char index.
37 
LocationLocation38         Location() : sIndex(0), cIndex(0) {}
39     };
readLoc()40     const Location &readLoc() const { return mReadLoc; }
41 
42   private:
43     // Skip a character and return the next character after the one that was skipped.
44     // Return nullptr if data runs out.
45     const char *skipChar();
46 
47     // Input.
48     size_t mCount;
49     const char *const *mString;
50     std::vector<size_t> mLength;
51 
52     Location mReadLoc;
53 };
54 
55 }  // namespace pp
56 
57 }  // namespace angle
58 
59 #endif  // COMPILER_PREPROCESSOR_INPUT_H_
60