| /* | |
| * Copyright (C) 2015 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef ANDROID_RS_API_GENERATOR_SCANNER_H | |
| #define ANDROID_RS_API_GENERATOR_SCANNER_H | |
| #include <fstream> | |
| #include <string> | |
| struct ParameterEntry; | |
| class Scanner { | |
| private: | |
| std::string mFileName; | |
| // The file being parsed | |
| FILE* mFile; | |
| // The line number of the current entry. | |
| int mLineNumber; | |
| // The tag of the current entry to be processed. See FindTag(). | |
| std::string mTag; | |
| // The value of this entry. See FindTag(). | |
| std::string mValue; | |
| // Was the current tag processed? | |
| bool mTagConsumed; | |
| // Number of errors encountered. | |
| int mErrorCount; | |
| /* Returns the next character from the file, incrementing the line count | |
| * if \n is found. | |
| */ | |
| int getChar(); | |
| /* Reads from the file, adding the characters to "segment" until | |
| * the delimiter is found, a new line, or the eof. The delimiter is added. | |
| */ | |
| void readUpTo(char delimiter, std::string* segment); | |
| /* Reads from the file, adding the characters to "segment" until | |
| * the end of the line. | |
| */ | |
| void readRestOfLine(std::string* segment); | |
| /* Finds the next line that's not a comment (a line that starts with #). | |
| * This line is parsed into a tag and a value. | |
| * A line that starts with a space (or is empty) is considered to have | |
| * a null tag and all but the first character are the value. | |
| * Lines that start with a non-space charcter should have a ": " to | |
| * separate the tag from the value. | |
| * Returns false if no more entries. | |
| */ | |
| bool getNextEntry(); | |
| public: | |
| Scanner(const std::string& fileName, FILE* file); | |
| bool atEnd(); | |
| std::string getValue() { return mValue; } | |
| std::string getNextTag() { | |
| mTagConsumed = true; | |
| return mTag; | |
| } | |
| // Skips over blank entries, reporting errors that start with a space. | |
| void skipBlankEntries(); | |
| /* Finds the next unprocessed tag. This entry should start with the specified tag. | |
| * Returns false if the tag is not found and prints an error. | |
| */ | |
| bool findTag(const char* tag); | |
| // Same as findTag but does not print an error if the tag is not found. | |
| bool findOptionalTag(const char* tag); | |
| // Keep reading from the stream until the tag is found. | |
| void skipUntilTag(const char* tag); | |
| // Verifies there's no value. | |
| void checkNoValue(); | |
| std::ostream& error(); | |
| std::ostream& error(int lineNumber); | |
| /* Removes an optional double quoted "documentation" found at the end of a line. | |
| * Erases that documention from the input string. | |
| */ | |
| void parseDocumentation(std::string* s, std::string* documentation); | |
| /* Parse an arg: definition. It's of the form: | |
| * type[*] name [, test_option] [, "documentation"] | |
| * The type and name are required. The * indicates it's an output parameter. | |
| * The test_option specifiies restrictions on values used when generating the test cases. | |
| * It's one of range(), compatible(), conditional(), above(). | |
| * The documentation is enclosed in double quotes. | |
| */ | |
| ParameterEntry* parseArgString(bool isReturn); | |
| bool getErrorCount() const { return mErrorCount; } | |
| }; | |
| #endif // ANDROID_RS_API_GENERATOR_SCANNER_H |