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