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 
23 using namespace std;
24 
25 class 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 
50 class 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'.
62 class ScopedTerminator {
63  public:
64   explicit ScopedTerminator(StringPiece s);
65   ~ScopedTerminator();
66 
67  private:
68   StringPiece s_;
69   char c_;
70 };
71 
72 template <class String>
JoinStrings(vector<String> v,const char * sep)73 inline 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 
84 void AppendString(StringPiece str, string* out);
85 
86 bool HasPrefix(StringPiece str, StringPiece prefix);
87 
88 bool HasSuffix(StringPiece str, StringPiece suffix);
89 
90 bool HasWord(StringPiece str, StringPiece w);
91 
92 StringPiece TrimSuffix(StringPiece str, StringPiece suffix);
93 
94 class Pattern {
95  public:
96   explicit Pattern(StringPiece pat);
97 
98   bool Match(StringPiece str) const;
99 
100   StringPiece Stem(StringPiece str) const;
101 
102   void AppendSubst(StringPiece str, StringPiece subst, string* out) const;
103 
104   void AppendSubstRef(StringPiece str, StringPiece subst, string* out) const;
105 
106  private:
107   bool MatchImpl(StringPiece str) const;
108 
109   StringPiece pat_;
110   size_t percent_index_;
111 };
112 
113 string NoLineBreak(const string& s);
114 
115 StringPiece TrimLeftSpace(StringPiece s);
116 StringPiece TrimRightSpace(StringPiece s);
117 StringPiece TrimSpace(StringPiece s);
118 
119 StringPiece Dirname(StringPiece s);
120 StringPiece Basename(StringPiece s);
121 StringPiece GetExt(StringPiece s);
122 StringPiece StripExt(StringPiece s);
123 void NormalizePath(string* o);
124 void AbsPath(StringPiece s, string* o);
125 
126 size_t FindOutsideParen(StringPiece s, char c);
127 size_t FindTwoOutsideParen(StringPiece s, char c1, char c2);
128 size_t FindThreeOutsideParen(StringPiece s, char c1, char c2, char c3);
129 
130 size_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt);
131 
132 // Strip leading sequences of './' from file names, so that ./file
133 // and file are considered to be the same file.
134 // From http://www.gnu.org/software/make/manual/make.html#Features
135 StringPiece TrimLeadingCurdir(StringPiece s);
136 
137 void FormatForCommandSubstitution(string* s);
138 
139 string SortWordsInString(StringPiece s);
140 
141 string ConcatDir(StringPiece b, StringPiece n);
142 
143 string EchoEscape(const string str);
144 
145 void EscapeShell(string* s);
146 
147 #endif  // STRUTIL_H_
148