42 char* in = &(*content)[0];
43 char* end = in + content->size();
44 bool have_target =
false;
45 bool have_secondary_target_on_this_rule =
false;
46 bool have_newline_since_primary_target =
false;
47 bool warned_distinct_target_lines =
false;
48 bool parsing_targets =
true;
50 bool have_newline =
false;
58 const char* start = in;
59 char* yymarker = NULL;
63 static const unsigned char yybm[] = {
64 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 0, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0, 0, 0,
68 0, 128, 0, 0, 0, 128, 0, 0,
69 128, 128, 0, 128, 128, 128, 128, 128,
70 128, 128, 128, 128, 128, 128, 128, 128,
71 128, 128, 128, 0, 0, 128, 0, 0,
72 128, 128, 128, 128, 128, 128, 128, 128,
73 128, 128, 128, 128, 128, 128, 128, 128,
74 128, 128, 128, 128, 128, 128, 128, 128,
75 128, 128, 128, 0, 0, 0, 0, 128,
76 0, 128, 128, 128, 128, 128, 128, 128,
77 128, 128, 128, 128, 128, 128, 128, 128,
78 128, 128, 128, 128, 128, 128, 128, 128,
79 128, 128, 128, 128, 0, 128, 128, 0,
80 128, 128, 128, 128, 128, 128, 128, 128,
81 128, 128, 128, 128, 128, 128, 128, 128,
82 128, 128, 128, 128, 128, 128, 128, 128,
83 128, 128, 128, 128, 128, 128, 128, 128,
84 128, 128, 128, 128, 128, 128, 128, 128,
85 128, 128, 128, 128, 128, 128, 128, 128,
86 128, 128, 128, 128, 128, 128, 128, 128,
87 128, 128, 128, 128, 128, 128, 128, 128,
88 128, 128, 128, 128, 128, 128, 128, 128,
89 128, 128, 128, 128, 128, 128, 128, 128,
90 128, 128, 128, 128, 128, 128, 128, 128,
91 128, 128, 128, 128, 128, 128, 128, 128,
92 128, 128, 128, 128, 128, 128, 128, 128,
93 128, 128, 128, 128, 128, 128, 128, 128,
94 128, 128, 128, 128, 128, 128, 128, 128,
95 128, 128, 128, 128, 128, 128, 128, 128,
98 if (yybm[0+yych] & 128) {
103 if (yych >= 0x01)
goto yy4;
105 if (yych <=
'\n')
goto yy6;
106 if (yych <=
'\f')
goto yy4;
111 if (yych <=
'#')
goto yy4;
114 if (yych ==
'\\')
goto yy13;
139 if (yych ==
'\n')
goto yy6;
143 if (yybm[0+yych] & 128) {
148 int len = (int)(in - start);
151 memmove(out, start, len);
157 if (yych ==
'$')
goto yy14;
160 yych = *(yymarker = ++in);
163 if (yych <= 0x00)
goto yy5;
164 if (yych ==
'\n')
goto yy18;
167 if (yych <=
'\r')
goto yy20;
168 if (yych ==
' ')
goto yy22;
173 if (yych <=
'#')
goto yy22;
174 if (yych ==
'*')
goto yy22;
177 if (yych <=
']')
goto yy22;
178 if (yych ==
'|')
goto yy22;
205 if (yych ==
'\n')
goto yy18;
219 int len = (int)(out - filename);
220 const bool is_dependency = !parsing_targets;
221 if (len > 0 && filename[len - 1] ==
':') {
223 parsing_targets =
false;
229 if (have_secondary_target_on_this_rule) {
230 if (!have_newline_since_primary_target) {
231 *err =
"depfile has multiple output paths";
236 "depfile has multiple output paths (on separate lines)" 237 " [-w depfilemulti=err]";
240 if (!warned_distinct_target_lines) {
241 warned_distinct_target_lines =
true;
242 Warning(
"depfile has multiple output paths (on separate lines); " 243 "continuing anyway [-w depfilemulti=warn]");
252 have_secondary_target_on_this_rule =
true;
258 parsing_targets =
true;
259 have_secondary_target_on_this_rule =
false;
261 have_newline_since_primary_target =
true;
266 *err =
"expected ':' in depfile";
StringPiece represents a slice of a string whose memory is managed externally.
bool Parse(string *content, string *err)
Parse an input file.
DepfileParserOptions options_
DepfileDistinctTargetLinesAction depfile_distinct_target_lines_action_
vector< StringPiece > ins_
DepfileParser(DepfileParserOptions options=DepfileParserOptions())
void Warning(const char *msg,...)
Log a warning message.