blob: 82a4e8fdbed3bbf06a4d4132920458a5b2ba574b [file] [log] [blame]
Jean-Luc Brouilletc5184e22015-03-13 13:51:24 -07001/*
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
Jean-Luc Brouillet4a730042015-04-02 16:15:25 -070023struct ParameterEntry;
Jean-Luc Brouilletc5184e22015-03-13 13:51:24 -070024
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);
Jean-Luc Brouillet2217eb72015-04-24 14:41:48 -070081 // Keep reading from the stream until the tag is found.
82 void skipUntilTag(const char* tag);
Jean-Luc Brouilletc5184e22015-03-13 13:51:24 -070083 // 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