summaryrefslogtreecommitdiff
path: root/api/Scanner.h
blob: c3d6f337db7713dc2d51d142142d173626a2e39d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
 * 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);
    // 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