Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(437)

Side by Side Diff: tools/gn/escape.cc

Issue 21114002: Add initial prototype for the GN meta-buildsystem. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add owners and readme Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/gn/escape.h ('k') | tools/gn/escape_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "tools/gn/escape.h"
6
7 #include "base/containers/stack_container.h"
8
9 namespace {
10
11 template<typename DestString>
12 void EscapeStringToString(const base::StringPiece& str,
13 const EscapeOptions& options,
14 DestString* dest) {
15 bool used_quotes = false;
16
17 for (size_t i = 0; i < str.size(); i++) {
18 if (str[i] == '$' && options.mode == ESCAPE_NINJA) {
19 // Escape dollars signs since ninja treats these specially.
20 dest->push_back('$');
21 dest->push_back('$');
22 } else if (str[i] == '"' && options.mode == ESCAPE_SHELL) {
23 // Escape quotes with backslashes for the command-line (Ninja doesn't
24 // care).
25 dest->push_back('\\');
26 dest->push_back('"');
27 } else if (str[i] == ' ') {
28 if (options.mode == ESCAPE_NINJA) {
29 // For ninja just escape spaces with $.
30 dest->push_back('$');
31 } else if (options.mode == ESCAPE_SHELL && !options.inhibit_quoting) {
32 // For the shell, quote the whole string.
33 if (!used_quotes) {
34 used_quotes = true;
35 dest->insert(dest->begin(), '"');
36 }
37 }
38 dest->push_back(' ');
39 #if defined(OS_WIN)
40 } else if (str[i] == '/' && options.convert_slashes) {
41 // Convert slashes on Windows if requested.
42 dest->push_back('\\');
43 #else
44 } else if (str[i] == '\\' && options.mode == ESCAPE_SHELL) {
45 // For non-Windows shell, escape backslashes.
46 dest->push_back('\\');
47 dest->push_back('\\');
48 #endif
49 } else {
50 dest->push_back(str[i]);
51 }
52 }
53
54 if (used_quotes)
55 dest->push_back('"');
56 }
57
58 } // namespace
59
60 std::string EscapeString(const base::StringPiece& str,
61 const EscapeOptions& options) {
62 std::string result;
63 result.reserve(str.size() + 4); // Guess we'll add a couple of extra chars.
64 EscapeStringToString(str, options, &result);
65 return result;
66 }
67
68 void EscapeStringToStream(std::ostream& out,
69 const base::StringPiece& str,
70 const EscapeOptions& options) {
71 // Escape to a stack buffer and then write out to the stream.
72 base::StackVector<char, 256> result;
73 result->reserve(str.size() + 4); // Guess we'll add a couple of extra chars.
74 EscapeStringToString(str, options, &result.container());
75 if (!result->empty())
76 out.write(result->data(), result->size());
77 }
OLDNEW
« no previous file with comments | « tools/gn/escape.h ('k') | tools/gn/escape_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698