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#ifndef TOOLS_GN_ESCAPE_H_
6#define TOOLS_GN_ESCAPE_H_
7
8#include <iosfwd>
9
10#include "base/strings/string_piece.h"
11
12enum EscapingMode {
13  // No escaping.
14  ESCAPE_NONE,
15
16  // Ninja string escaping.
17  ESCAPE_NINJA,
18
19  // For writing commands to ninja files.
20  ESCAPE_NINJA_COMMAND,
21};
22
23enum EscapingPlatform {
24  // Do escaping for the current platform.
25  ESCAPE_PLATFORM_CURRENT,
26
27  // Force escaping for the given platform.
28  ESCAPE_PLATFORM_POSIX,
29  ESCAPE_PLATFORM_WIN,
30};
31
32struct EscapeOptions {
33  EscapeOptions()
34      : mode(ESCAPE_NONE),
35        platform(ESCAPE_PLATFORM_CURRENT),
36        inhibit_quoting(false) {
37  }
38
39  EscapingMode mode;
40
41  // Controls how "fork" escaping is done. You will generally want to keep the
42  // default "current" platform.
43  EscapingPlatform platform;
44
45  // When the escaping mode is ESCAPE_SHELL, the escaper will normally put
46  // quotes around things with spaces. If this value is set to true, we'll
47  // disable the quoting feature and just add the spaces.
48  //
49  // This mode is for when quoting is done at some higher-level. Defaults to
50  // false. Note that Windows has strange behavior where the meaning of the
51  // backslashes changes according to if it is followed by a quote. The
52  // escaping rules assume that a double-quote will be appended to the result.
53  bool inhibit_quoting;
54};
55
56// Escapes the given input, returnining the result.
57//
58// If needed_quoting is non-null, whether the string was or should have been
59// (if inhibit_quoting was set) quoted will be written to it. This value should
60// be initialized to false by the caller and will be written to only if it's
61// true (the common use-case is for chaining calls).
62std::string EscapeString(const base::StringPiece& str,
63                         const EscapeOptions& options,
64                         bool* needed_quoting);
65
66// Same as EscapeString but writes the results to the given stream, saving a
67// copy.
68void EscapeStringToStream(std::ostream& out,
69                          const base::StringPiece& str,
70                          const EscapeOptions& options);
71
72#endif  // TOOLS_GN_ESCAPE_H_
73