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