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