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