1// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef STRUTIL_H_
16#define STRUTIL_H_
17
18#include <string>
19#include <vector>
20
21#include "string_piece.h"
22
23using namespace std;
24
25class WordScanner {
26 public:
27  struct Iterator {
28    Iterator& operator++();
29    StringPiece operator*() const;
30    bool operator!=(const Iterator& r) const {
31      return in != r.in || s != r.s || i != r.i;
32    }
33
34    const StringPiece* in;
35    int s;
36    int i;
37  };
38
39  explicit WordScanner(StringPiece in);
40
41  Iterator begin() const;
42  Iterator end() const;
43
44  void Split(vector<StringPiece>* o);
45
46 private:
47  StringPiece in_;
48};
49
50class WordWriter {
51 public:
52  explicit WordWriter(string* o);
53  void MaybeAddWhitespace();
54  void Write(StringPiece s);
55
56 private:
57  string* out_;
58  bool needs_space_;
59};
60
61// Temporary modifies s[s.size()] to '\0'.
62class ScopedTerminator {
63 public:
64  explicit ScopedTerminator(StringPiece s);
65  ~ScopedTerminator();
66
67 private:
68  StringPiece s_;
69  char c_;
70};
71
72template <class String>
73inline string JoinStrings(vector<String> v, const char* sep) {
74  string r;
75  for (StringPiece s : v) {
76    if (!r.empty()) {
77      r += sep;
78    }
79    r.append(s.begin(), s.end());
80  }
81  return r;
82}
83
84void AppendString(StringPiece str, string* out);
85
86bool HasPrefix(StringPiece str, StringPiece prefix);
87
88bool HasSuffix(StringPiece str, StringPiece suffix);
89
90bool HasWord(StringPiece str, StringPiece w);
91
92StringPiece TrimPrefix(StringPiece str, StringPiece suffix);
93
94StringPiece TrimSuffix(StringPiece str, StringPiece suffix);
95
96class Pattern {
97 public:
98  explicit Pattern(StringPiece pat);
99
100  bool Match(StringPiece str) const;
101
102  StringPiece Stem(StringPiece str) const;
103
104  void AppendSubst(StringPiece str, StringPiece subst, string* out) const;
105
106  void AppendSubstRef(StringPiece str, StringPiece subst, string* out) const;
107
108 private:
109  bool MatchImpl(StringPiece str) const;
110
111  StringPiece pat_;
112  size_t percent_index_;
113};
114
115string NoLineBreak(const string& s);
116
117StringPiece TrimLeftSpace(StringPiece s);
118StringPiece TrimRightSpace(StringPiece s);
119StringPiece TrimSpace(StringPiece s);
120
121StringPiece Dirname(StringPiece s);
122StringPiece Basename(StringPiece s);
123StringPiece GetExt(StringPiece s);
124StringPiece StripExt(StringPiece s);
125void NormalizePath(string* o);
126void AbsPath(StringPiece s, string* o);
127
128size_t FindOutsideParen(StringPiece s, char c);
129size_t FindTwoOutsideParen(StringPiece s, char c1, char c2);
130size_t FindThreeOutsideParen(StringPiece s, char c1, char c2, char c3);
131
132size_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt);
133
134// Strip leading sequences of './' from file names, so that ./file
135// and file are considered to be the same file.
136// From http://www.gnu.org/software/make/manual/make.html#Features
137StringPiece TrimLeadingCurdir(StringPiece s);
138
139void FormatForCommandSubstitution(string* s);
140
141string SortWordsInString(StringPiece s);
142
143string ConcatDir(StringPiece b, StringPiece n);
144
145string EchoEscape(const string &str);
146
147void EscapeShell(string* s);
148
149#endif  // STRUTIL_H_
150