52 char* in = &(*content)[0];
53 char* end = in + content->size();
54 bool have_target =
false;
55 bool parsing_targets =
true;
56 bool poisoned_input =
false;
58 bool have_newline =
false;
66 const char* start = in;
67 char* yymarker = NULL;
71 static const unsigned char yybm[] = {
72 0, 0, 0, 0, 0, 0, 0, 0,
73 0, 0, 0, 0, 0, 0, 0, 0,
74 0, 0, 0, 0, 0, 0, 0, 0,
75 0, 0, 0, 0, 0, 0, 0, 0,
76 0, 128, 0, 0, 0, 128, 0, 0,
77 128, 128, 0, 128, 128, 128, 128, 128,
78 128, 128, 128, 128, 128, 128, 128, 128,
79 128, 128, 128, 0, 0, 128, 0, 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, 0, 128, 0, 128,
84 0, 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, 0, 128, 128, 0,
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,
96 128, 128, 128, 128, 128, 128, 128, 128,
97 128, 128, 128, 128, 128, 128, 128, 128,
98 128, 128, 128, 128, 128, 128, 128, 128,
99 128, 128, 128, 128, 128, 128, 128, 128,
100 128, 128, 128, 128, 128, 128, 128, 128,
101 128, 128, 128, 128, 128, 128, 128, 128,
102 128, 128, 128, 128, 128, 128, 128, 128,
103 128, 128, 128, 128, 128, 128, 128, 128,
106 if (yybm[0+yych] & 128) {
111 if (yych >= 0x01)
goto yy4;
113 if (yych <=
'\n')
goto yy6;
114 if (yych <=
'\f')
goto yy4;
119 if (yych <=
'#')
goto yy4;
122 if (yych <=
'?')
goto yy4;
123 if (yych <=
'\\')
goto yy13;
148 if (yych ==
'\n')
goto yy6;
152 if (yybm[0+yych] & 128) {
158 int len = (int)(in - start);
161 memmove(out, start, len);
167 if (yych ==
'$')
goto yy14;
170 yych = *(yymarker = ++in);
173 if (yych <= 0x00)
goto yy5;
174 if (yych <=
'\t')
goto yy16;
177 if (yych ==
'\r')
goto yy19;
178 if (yych <= 0x1F)
goto yy16;
183 if (yych ==
'#')
goto yy23;
186 if (yych <=
':')
goto yy25;
187 if (yych ==
'\\')
goto yy27;
209 if (yych ==
'\n')
goto yy17;
216 int len = (int)(in - start);
219 memset(out,
'\\', n);
228 int len = (int)(in - start);
229 if (len > 2 && out < start)
230 memset(out,
'\\', len - 2);
238 if (yych <= 0x00)
goto yy28;
239 if (yych <= 0x08)
goto yy26;
240 if (yych <=
'\n')
goto yy28;
242 if (yych <=
'\r')
goto yy28;
243 if (yych ==
' ')
goto yy28;
250 int len = (int)(in - start);
251 if (len > 2 && out < start)
252 memset(out,
'\\', len - 2);
261 if (yych <= 0x00)
goto yy11;
262 if (yych <=
'\t')
goto yy16;
265 if (yych ==
'\r')
goto yy11;
266 if (yych <= 0x1F)
goto yy16;
271 if (yych ==
'#')
goto yy23;
274 if (yych <=
':')
goto yy25;
275 if (yych ==
'\\')
goto yy32;
284 int len = (int)(in - start - 1);
287 memmove(out, start, len);
289 if (*(in - 1) ==
'\n')
297 int len = (int)(in - start);
299 memset(out,
'\\', len - 1);
307 if (yych <= 0x00)
goto yy11;
308 if (yych <=
'\t')
goto yy16;
311 if (yych ==
'\r')
goto yy11;
312 if (yych <= 0x1F)
goto yy16;
317 if (yych ==
'#')
goto yy23;
320 if (yych <=
':')
goto yy25;
321 if (yych ==
'\\')
goto yy27;
329 int len = (int)(out - filename);
330 const bool is_dependency = !parsing_targets;
331 if (len > 0 && filename[len - 1] ==
':') {
333 parsing_targets =
false;
340 std::vector<StringPiece>::iterator pos = std::find(
ins_.begin(),
ins_.end(), piece);
341 if (pos ==
ins_.end()) {
343 if (poisoned_input) {
344 *err =
"inputs may not also have inputs";
348 ins_.push_back(piece);
352 outs_.push_back(piece);
354 }
else if (!is_dependency) {
356 poisoned_input =
true;
362 parsing_targets =
true;
363 poisoned_input =
false;
367 *err =
"expected ':' in depfile";
StringPiece represents a slice of a string whose memory is managed externally.
bool Parse(std::string *content, std::string *err)
Parse an input file.
std::vector< StringPiece > outs_
std::vector< StringPiece > ins_
DepfileParser(DepfileParserOptions options=DepfileParserOptions())