xref: /aosp_15_r20/frameworks/rs/script_api/Scanner.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_API_GENERATOR_SCANNER_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_API_GENERATOR_SCANNER_H
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker #include <fstream>
21*e1eccf28SAndroid Build Coastguard Worker #include <string>
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker struct ParameterEntry;
24*e1eccf28SAndroid Build Coastguard Worker 
25*e1eccf28SAndroid Build Coastguard Worker class Scanner {
26*e1eccf28SAndroid Build Coastguard Worker private:
27*e1eccf28SAndroid Build Coastguard Worker     std::string mFileName;
28*e1eccf28SAndroid Build Coastguard Worker     // The file being parsed
29*e1eccf28SAndroid Build Coastguard Worker     FILE* mFile;
30*e1eccf28SAndroid Build Coastguard Worker     // The line number of the current entry.
31*e1eccf28SAndroid Build Coastguard Worker     int mLineNumber;
32*e1eccf28SAndroid Build Coastguard Worker     // The tag of the current entry to be processed.  See FindTag().
33*e1eccf28SAndroid Build Coastguard Worker     std::string mTag;
34*e1eccf28SAndroid Build Coastguard Worker     // The value of this entry.  See FindTag().
35*e1eccf28SAndroid Build Coastguard Worker     std::string mValue;
36*e1eccf28SAndroid Build Coastguard Worker     // Was the current tag processed?
37*e1eccf28SAndroid Build Coastguard Worker     bool mTagConsumed;
38*e1eccf28SAndroid Build Coastguard Worker     // Number of errors encountered.
39*e1eccf28SAndroid Build Coastguard Worker     int mErrorCount;
40*e1eccf28SAndroid Build Coastguard Worker 
41*e1eccf28SAndroid Build Coastguard Worker     /* Returns the next character from the file, incrementing the line count
42*e1eccf28SAndroid Build Coastguard Worker      * if \n is found.
43*e1eccf28SAndroid Build Coastguard Worker      */
44*e1eccf28SAndroid Build Coastguard Worker     int getChar();
45*e1eccf28SAndroid Build Coastguard Worker     /* Reads from the file, adding the characters to "segment" until
46*e1eccf28SAndroid Build Coastguard Worker      * the delimiter is found, a new line, or the eof.  The delimiter is added.
47*e1eccf28SAndroid Build Coastguard Worker      */
48*e1eccf28SAndroid Build Coastguard Worker     void readUpTo(char delimiter, std::string* segment);
49*e1eccf28SAndroid Build Coastguard Worker     /* Reads from the file, adding the characters to "segment" until
50*e1eccf28SAndroid Build Coastguard Worker      * the end of the line.
51*e1eccf28SAndroid Build Coastguard Worker      */
52*e1eccf28SAndroid Build Coastguard Worker     void readRestOfLine(std::string* segment);
53*e1eccf28SAndroid Build Coastguard Worker 
54*e1eccf28SAndroid Build Coastguard Worker     /* Finds the next line that's not a comment (a line that starts with #).
55*e1eccf28SAndroid Build Coastguard Worker      * This line is parsed into a tag and a value.
56*e1eccf28SAndroid Build Coastguard Worker      * A line that starts with a space (or is empty) is considered to have
57*e1eccf28SAndroid Build Coastguard Worker      * a null tag and all but the first character are the value.
58*e1eccf28SAndroid Build Coastguard Worker      * Lines that start with a non-space charcter should have a ": " to
59*e1eccf28SAndroid Build Coastguard Worker      * separate the tag from the value.
60*e1eccf28SAndroid Build Coastguard Worker      * Returns false if no more entries.
61*e1eccf28SAndroid Build Coastguard Worker      */
62*e1eccf28SAndroid Build Coastguard Worker     bool getNextEntry();
63*e1eccf28SAndroid Build Coastguard Worker 
64*e1eccf28SAndroid Build Coastguard Worker public:
65*e1eccf28SAndroid Build Coastguard Worker     Scanner(const std::string& fileName, FILE* file);
66*e1eccf28SAndroid Build Coastguard Worker     bool atEnd();
getValue()67*e1eccf28SAndroid Build Coastguard Worker     std::string getValue() { return mValue; }
getNextTag()68*e1eccf28SAndroid Build Coastguard Worker     std::string getNextTag() {
69*e1eccf28SAndroid Build Coastguard Worker         mTagConsumed = true;
70*e1eccf28SAndroid Build Coastguard Worker         return mTag;
71*e1eccf28SAndroid Build Coastguard Worker     }
72*e1eccf28SAndroid Build Coastguard Worker 
73*e1eccf28SAndroid Build Coastguard Worker     // Skips over blank entries, reporting errors that start with a space.
74*e1eccf28SAndroid Build Coastguard Worker     void skipBlankEntries();
75*e1eccf28SAndroid Build Coastguard Worker     /* Finds the next unprocessed tag.  This entry should start with the specified tag.
76*e1eccf28SAndroid Build Coastguard Worker      * Returns false if the tag is not found and prints an error.
77*e1eccf28SAndroid Build Coastguard Worker      */
78*e1eccf28SAndroid Build Coastguard Worker     bool findTag(const char* tag);
79*e1eccf28SAndroid Build Coastguard Worker     // Same as findTag but does not print an error if the tag is not found.
80*e1eccf28SAndroid Build Coastguard Worker     bool findOptionalTag(const char* tag);
81*e1eccf28SAndroid Build Coastguard Worker     // Keep reading from the stream until the tag is found.
82*e1eccf28SAndroid Build Coastguard Worker     void skipUntilTag(const char* tag);
83*e1eccf28SAndroid Build Coastguard Worker     // Verifies there's no value.
84*e1eccf28SAndroid Build Coastguard Worker     void checkNoValue();
85*e1eccf28SAndroid Build Coastguard Worker 
86*e1eccf28SAndroid Build Coastguard Worker     std::ostream& error();
87*e1eccf28SAndroid Build Coastguard Worker     std::ostream& error(int lineNumber);
88*e1eccf28SAndroid Build Coastguard Worker 
89*e1eccf28SAndroid Build Coastguard Worker     /* Removes an optional double quoted "documentation" found at the end of a line.
90*e1eccf28SAndroid Build Coastguard Worker      * Erases that documention from the input string.
91*e1eccf28SAndroid Build Coastguard Worker      */
92*e1eccf28SAndroid Build Coastguard Worker     void parseDocumentation(std::string* s, std::string* documentation);
93*e1eccf28SAndroid Build Coastguard Worker     /* Parse an arg: definition.  It's of the form:
94*e1eccf28SAndroid Build Coastguard Worker      *    type[*] name [, test_option] [, "documentation"]
95*e1eccf28SAndroid Build Coastguard Worker      * The type and name are required.  The * indicates it's an output parameter.
96*e1eccf28SAndroid Build Coastguard Worker      * The test_option specifiies restrictions on values used when generating the test cases.
97*e1eccf28SAndroid Build Coastguard Worker      * It's one of range(), compatible(), conditional(), above().
98*e1eccf28SAndroid Build Coastguard Worker      * The documentation is enclosed in double quotes.
99*e1eccf28SAndroid Build Coastguard Worker      */
100*e1eccf28SAndroid Build Coastguard Worker     ParameterEntry* parseArgString(bool isReturn);
getErrorCount()101*e1eccf28SAndroid Build Coastguard Worker     bool getErrorCount() const { return mErrorCount; }
102*e1eccf28SAndroid Build Coastguard Worker };
103*e1eccf28SAndroid Build Coastguard Worker 
104*e1eccf28SAndroid Build Coastguard Worker #endif  // ANDROID_RS_API_GENERATOR_SCANNER_H
105