OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/gn/file_template.h" | 5 #include "tools/gn/file_template.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <iostream> | 8 #include <iostream> |
9 | 9 |
10 #include "tools/gn/escape.h" | 10 #include "tools/gn/escape.h" |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 if (t[subrange_i].type == Subrange::LITERAL) | 159 if (t[subrange_i].type == Subrange::LITERAL) |
160 cur_output.append(t[subrange_i].literal); | 160 cur_output.append(t[subrange_i].literal); |
161 else | 161 else |
162 cur_output.append(subst[t[subrange_i].type]); | 162 cur_output.append(subst[t[subrange_i].type]); |
163 } | 163 } |
164 } | 164 } |
165 } | 165 } |
166 | 166 |
167 void FileTemplate::WriteWithNinjaExpansions(std::ostream& out) const { | 167 void FileTemplate::WriteWithNinjaExpansions(std::ostream& out) const { |
168 EscapeOptions escape_options; | 168 EscapeOptions escape_options; |
169 escape_options.mode = ESCAPE_NINJA_SHELL; | 169 escape_options.mode = ESCAPE_NINJA_COMMAND; |
170 escape_options.inhibit_quoting = true; | 170 escape_options.inhibit_quoting = true; |
171 | 171 |
172 for (size_t template_i = 0; | 172 for (size_t template_i = 0; |
173 template_i < templates_.container().size(); template_i++) { | 173 template_i < templates_.container().size(); template_i++) { |
174 out << " "; // Separate args with spaces. | 174 out << " "; // Separate args with spaces. |
175 | 175 |
176 const Template& t = templates_[template_i]; | 176 const Template& t = templates_[template_i]; |
177 | 177 |
178 // Escape each subrange into a string. Since we're writing out Ninja | 178 // Escape each subrange into a string. Since we're writing out Ninja |
179 // variables, we can't quote the whole thing, so we write in pieces, only | 179 // variables, we can't quote the whole thing, so we write in pieces, only |
180 // escaping the literals, and then quoting the whole thing at the end if | 180 // escaping the literals, and then quoting the whole thing at the end if |
181 // necessary. | 181 // necessary. |
182 bool needs_quoting = false; | 182 bool needs_quoting = false; |
183 std::string item_str; | 183 std::string item_str; |
184 for (size_t subrange_i = 0; subrange_i < t.container().size(); | 184 for (size_t subrange_i = 0; subrange_i < t.container().size(); |
185 subrange_i++) { | 185 subrange_i++) { |
186 if (t[subrange_i].type == Subrange::LITERAL) { | 186 if (t[subrange_i].type == Subrange::LITERAL) { |
| 187 bool cur_needs_quoting = false; |
187 item_str.append(EscapeString(t[subrange_i].literal, escape_options, | 188 item_str.append(EscapeString(t[subrange_i].literal, escape_options, |
188 &needs_quoting)); | 189 &cur_needs_quoting)); |
| 190 needs_quoting |= cur_needs_quoting; |
189 } else { | 191 } else { |
190 // Don't escape this since we need to preserve the $. | 192 // Don't escape this since we need to preserve the $. |
191 item_str.append("${"); | 193 item_str.append("${"); |
192 item_str.append(GetNinjaVariableNameForType(t[subrange_i].type)); | 194 item_str.append(GetNinjaVariableNameForType(t[subrange_i].type)); |
193 item_str.append("}"); | 195 item_str.append("}"); |
194 } | 196 } |
195 } | 197 } |
196 | 198 |
197 if (needs_quoting || item_str.empty()) { | 199 if (needs_quoting || item_str.empty()) { |
198 // Need to shell quote the whole string. We also need to quote empty | 200 // Need to shell quote the whole string. We also need to quote empty |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 cur = next + arraysize(kSourceFilePart) - 1; | 308 cur = next + arraysize(kSourceFilePart) - 1; |
307 } else { | 309 } else { |
308 // If it's not a match, treat it like a one-char literal (this will be | 310 // If it's not a match, treat it like a one-char literal (this will be |
309 // rare, so it's not worth the bother to add to the previous literal) so | 311 // rare, so it's not worth the bother to add to the previous literal) so |
310 // we can keep going. | 312 // we can keep going. |
311 t.container().push_back(Subrange(Subrange::LITERAL, "{")); | 313 t.container().push_back(Subrange(Subrange::LITERAL, "{")); |
312 cur = next + 1; | 314 cur = next + 1; |
313 } | 315 } |
314 } | 316 } |
315 } | 317 } |
OLD | NEW |