diff options
Diffstat (limited to 'tools/gn/escape.cc')
-rw-r--r-- | tools/gn/escape.cc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/tools/gn/escape.cc b/tools/gn/escape.cc new file mode 100644 index 0000000..5fc7b6f --- /dev/null +++ b/tools/gn/escape.cc @@ -0,0 +1,77 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "tools/gn/escape.h" + +#include "base/containers/stack_container.h" + +namespace { + +template<typename DestString> +void EscapeStringToString(const base::StringPiece& str, + const EscapeOptions& options, + DestString* dest) { + bool used_quotes = false; + + for (size_t i = 0; i < str.size(); i++) { + if (str[i] == '$' && options.mode == ESCAPE_NINJA) { + // Escape dollars signs since ninja treats these specially. + dest->push_back('$'); + dest->push_back('$'); + } else if (str[i] == '"' && options.mode == ESCAPE_SHELL) { + // Escape quotes with backslashes for the command-line (Ninja doesn't + // care). + dest->push_back('\\'); + dest->push_back('"'); + } else if (str[i] == ' ') { + if (options.mode == ESCAPE_NINJA) { + // For ninja just escape spaces with $. + dest->push_back('$'); + } else if (options.mode == ESCAPE_SHELL && !options.inhibit_quoting) { + // For the shell, quote the whole string. + if (!used_quotes) { + used_quotes = true; + dest->insert(dest->begin(), '"'); + } + } + dest->push_back(' '); +#if defined(OS_WIN) + } else if (str[i] == '/' && options.convert_slashes) { + // Convert slashes on Windows if requested. + dest->push_back('\\'); +#else + } else if (str[i] == '\\' && options.mode == ESCAPE_SHELL) { + // For non-Windows shell, escape backslashes. + dest->push_back('\\'); + dest->push_back('\\'); +#endif + } else { + dest->push_back(str[i]); + } + } + + if (used_quotes) + dest->push_back('"'); +} + +} // namespace + +std::string EscapeString(const base::StringPiece& str, + const EscapeOptions& options) { + std::string result; + result.reserve(str.size() + 4); // Guess we'll add a couple of extra chars. + EscapeStringToString(str, options, &result); + return result; +} + +void EscapeStringToStream(std::ostream& out, + const base::StringPiece& str, + const EscapeOptions& options) { + // Escape to a stack buffer and then write out to the stream. + base::StackVector<char, 256> result; + result->reserve(str.size() + 4); // Guess we'll add a couple of extra chars. + EscapeStringToString(str, options, &result.container()); + if (!result->empty()) + out.write(result->data(), result->size()); +} |