| // 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. | 
 |  | 
 | #ifndef TOOLS_GN_ESCAPE_H_ | 
 | #define TOOLS_GN_ESCAPE_H_ | 
 |  | 
 | #include <iosfwd> | 
 |  | 
 | #include "base/strings/string_piece.h" | 
 |  | 
 | enum EscapingMode { | 
 |   // No escaping. | 
 |   ESCAPE_NONE, | 
 |  | 
 |   // Ninja string escaping. | 
 |   ESCAPE_NINJA, | 
 |  | 
 |   // For writing commands to ninja files. This assumes the output is "one | 
 |   // thing" like a filename, so will escape or quote spaces as necessary for | 
 |   // both Ninja and the shell to keep that thing together. | 
 |   ESCAPE_NINJA_COMMAND, | 
 |  | 
 |   // For writing preformatted shell commands to Ninja files. This assumes the | 
 |   // output already has the proper quoting and may include special shell | 
 |   // shell characters which we want to pass to the shell (like when writing | 
 |   // tool commands). Only Ninja "$" are escaped. | 
 |   ESCAPE_NINJA_PREFORMATTED_COMMAND, | 
 | }; | 
 |  | 
 | enum EscapingPlatform { | 
 |   // Do escaping for the current platform. | 
 |   ESCAPE_PLATFORM_CURRENT, | 
 |  | 
 |   // Force escaping for the given platform. | 
 |   ESCAPE_PLATFORM_POSIX, | 
 |   ESCAPE_PLATFORM_WIN, | 
 | }; | 
 |  | 
 | struct EscapeOptions { | 
 |   EscapeOptions() | 
 |       : mode(ESCAPE_NONE), | 
 |         platform(ESCAPE_PLATFORM_CURRENT), | 
 |         inhibit_quoting(false) {} | 
 |  | 
 |   EscapingMode mode; | 
 |  | 
 |   // Controls how "fork" escaping is done. You will generally want to keep the | 
 |   // default "current" platform. | 
 |   EscapingPlatform platform; | 
 |  | 
 |   // When the escaping mode is ESCAPE_SHELL, the escaper will normally put | 
 |   // quotes around things with spaces. If this value is set to true, we'll | 
 |   // disable the quoting feature and just add the spaces. | 
 |   // | 
 |   // This mode is for when quoting is done at some higher-level. Defaults to | 
 |   // false. Note that Windows has strange behavior where the meaning of the | 
 |   // backslashes changes according to if it is followed by a quote. The | 
 |   // escaping rules assume that a double-quote will be appended to the result. | 
 |   bool inhibit_quoting; | 
 | }; | 
 |  | 
 | // Escapes the given input, returnining the result. | 
 | // | 
 | // If needed_quoting is non-null, whether the string was or should have been | 
 | // (if inhibit_quoting was set) quoted will be written to it. This value should | 
 | // be initialized to false by the caller and will be written to only if it's | 
 | // true (the common use-case is for chaining calls). | 
 | std::string EscapeString(const base::StringPiece& str, | 
 |                          const EscapeOptions& options, | 
 |                          bool* needed_quoting); | 
 |  | 
 | // Same as EscapeString but writes the results to the given stream, saving a | 
 | // copy. | 
 | void EscapeStringToStream(std::ostream& out, | 
 |                           const base::StringPiece& str, | 
 |                           const EscapeOptions& options); | 
 |  | 
 | #endif  // TOOLS_GN_ESCAPE_H_ |