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