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
|