blob: 12e46a533629e7a722f6d319629c66b16e7ca2b2 [file] [log] [blame]
Shinichiro Hamaji1d545aa2015-06-23 15:29:13 +09001// 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
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090015#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
Shinichiro Hamajid87e59e2015-06-17 18:18:34 +090044 void Split(vector<StringPiece>* o);
45
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090046 private:
47 StringPiece in_;
48};
49
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090050class WordWriter {
51 public:
52 explicit WordWriter(string* o);
Shinichiro Hamaji37591ce2015-06-16 19:36:05 +090053 void MaybeAddWhitespace();
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090054 void Write(StringPiece s);
55
56 private:
57 string* out_;
58 bool needs_space_;
59};
60
Shinichiro Hamaji8f68bd32015-06-18 11:01:51 +090061// 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
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090072template <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
Shinichiro Hamaji02fc55b2015-06-16 17:19:07 +090084void AppendString(StringPiece str, string* out);
85
86bool HasPrefix(StringPiece str, StringPiece prefix);
87
88bool HasSuffix(StringPiece str, StringPiece suffix);
89
Shinichiro Hamajic9b0aca2015-07-31 16:47:56 +090090bool HasWord(StringPiece str, StringPiece w);
91
Shinichiro Hamaji02fc55b2015-06-16 17:19:07 +090092StringPiece TrimSuffix(StringPiece str, StringPiece suffix);
93
Shinichiro Hamajia6a17a42015-06-18 20:11:19 +090094class Pattern {
95 public:
96 explicit Pattern(StringPiece pat);
Shinichiro Hamaji02fc55b2015-06-16 17:19:07 +090097
Shinichiro Hamajia6a17a42015-06-18 20:11:19 +090098 bool Match(StringPiece str) const;
Shinichiro Hamaji02fc55b2015-06-16 17:19:07 +090099
Shinichiro Hamajia7984ad2015-09-11 16:33:16 +0900100 StringPiece Stem(StringPiece str) const;
101
Shinichiro Hamajia6a17a42015-06-18 20:11:19 +0900102 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};
Shinichiro Hamaji00cc6582015-06-17 18:12:46 +0900112
Shinichiro Hamaji810fd032015-06-17 04:38:03 +0900113string NoLineBreak(const string& s);
114
Shinichiro Hamaji32750622015-06-17 14:57:33 +0900115StringPiece TrimLeftSpace(StringPiece s);
116StringPiece TrimRightSpace(StringPiece s);
117StringPiece TrimSpace(StringPiece s);
118
Shinichiro Hamaji67f9a702015-06-18 06:00:57 +0900119StringPiece Dirname(StringPiece s);
120StringPiece Basename(StringPiece s);
121StringPiece GetExt(StringPiece s);
122StringPiece StripExt(StringPiece s);
Shinichiro Hamajib3591ed2015-08-10 20:06:50 +0900123void NormalizePath(string* o);
Shinichiro Hamaji8a963582015-06-18 07:05:58 +0900124void AbsPath(StringPiece s, string* o);
Shinichiro Hamaji67f9a702015-06-18 06:00:57 +0900125
Shinichiro Hamajieafd0522015-06-18 16:46:02 +0900126size_t FindOutsideParen(StringPiece s, char c);
Shinichiro Hamaji76ff9832015-06-18 17:11:22 +0900127size_t FindTwoOutsideParen(StringPiece s, char c1, char c2);
Shinichiro Hamaji415a9b12015-07-05 14:33:02 +0900128size_t FindThreeOutsideParen(StringPiece s, char c1, char c2, char c3);
Shinichiro Hamajieafd0522015-06-18 16:46:02 +0900129
Shinichiro Hamaji14bb2792015-06-25 18:24:11 +0900130size_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt);
131
Shinichiro Hamajid9533322015-06-27 05:48:38 +0900132// 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
135StringPiece TrimLeadingCurdir(StringPiece s);
136
Shinichiro Hamajic9b0aca2015-07-31 16:47:56 +0900137void FormatForCommandSubstitution(string* s);
138
139string SortWordsInString(StringPiece s);
140
Shinichiro Hamaji5a71a8b2015-08-06 19:23:18 +0900141string ConcatDir(StringPiece b, StringPiece n);
142
Dan Willemsene6f68582015-08-21 11:13:28 -0700143string EchoEscape(const string str);
144
Shinichiro Hamaji505d0d22016-02-29 20:07:39 +0900145void EscapeShell(string* s);
146
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900147#endif // STRUTIL_H_