11d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Copyright 2015 Google Inc. All rights reserved 21d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 31d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Licensed under the Apache License, Version 2.0 (the "License"); 41d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// you may not use this file except in compliance with the License. 51d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// You may obtain a copy of the License at 61d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 71d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// http://www.apache.org/licenses/LICENSE-2.0 81d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 91d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Unless required by applicable law or agreed to in writing, software 101d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// distributed under the License is distributed on an "AS IS" BASIS, 111d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// See the License for the specific language governing permissions and 131d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// limitations under the License. 141d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji 15776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#ifndef STRUTIL_H_ 16776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#define STRUTIL_H_ 17776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 18776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <string> 19776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <vector> 20776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 21776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include "string_piece.h" 22776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 23776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiusing namespace std; 24776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 25776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass WordScanner { 26776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji public: 27776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji struct Iterator { 28776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji Iterator& operator++(); 29776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji StringPiece operator*() const; 30776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji bool operator!=(const Iterator& r) const { 31776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji return in != r.in || s != r.s || i != r.i; 32776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji } 33776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 34776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji const StringPiece* in; 35776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji int s; 36776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji int i; 37776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji }; 38776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 39776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji explicit WordScanner(StringPiece in); 40776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 41776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji Iterator begin() const; 42776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji Iterator end() const; 43776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 44d87e59e27d65e7c3c00425f36bbaf7c91e81c6e7Shinichiro Hamaji void Split(vector<StringPiece>* o); 45d87e59e27d65e7c3c00425f36bbaf7c91e81c6e7Shinichiro Hamaji 46776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji private: 47776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji StringPiece in_; 48776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji}; 49776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 502e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamajiclass WordWriter { 512e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji public: 522e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji explicit WordWriter(string* o); 5337591ce8fffb4ebaf96c83223e93c3c6b9b04651Shinichiro Hamaji void MaybeAddWhitespace(); 542e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji void Write(StringPiece s); 552e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji 562e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji private: 572e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji string* out_; 582e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji bool needs_space_; 592e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji}; 602e6cbfc3e72abc242b87f338c540afb9708a1df5Shinichiro Hamaji 618f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji// Temporary modifies s[s.size()] to '\0'. 628f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamajiclass ScopedTerminator { 638f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji public: 648f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji explicit ScopedTerminator(StringPiece s); 658f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji ~ScopedTerminator(); 668f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji 678f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji private: 688f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji StringPiece s_; 698f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji char c_; 708f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji}; 718f68bd3becce2fa8f442468691c2555d5a2f37e0Shinichiro Hamaji 72776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajitemplate <class String> 73776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiinline string JoinStrings(vector<String> v, const char* sep) { 74776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji string r; 75776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji for (StringPiece s : v) { 76776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji if (!r.empty()) { 77776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji r += sep; 78776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji } 79776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji r.append(s.begin(), s.end()); 80776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji } 81776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji return r; 82776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji} 83776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 8402fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamajivoid AppendString(StringPiece str, string* out); 8502fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamaji 8602fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamajibool HasPrefix(StringPiece str, StringPiece prefix); 8702fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamaji 8802fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamajibool HasSuffix(StringPiece str, StringPiece suffix); 8902fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamaji 90c9b0acaf0a11eee6b0152c51d9633758ad8c662cShinichiro Hamajibool HasWord(StringPiece str, StringPiece w); 91c9b0acaf0a11eee6b0152c51d9633758ad8c662cShinichiro Hamaji 92e41c7556c22bda359c2b97cd98d59082110add95Dan WillemsenStringPiece TrimPrefix(StringPiece str, StringPiece suffix); 93e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen 9402fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro HamajiStringPiece TrimSuffix(StringPiece str, StringPiece suffix); 9502fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamaji 96a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamajiclass Pattern { 97a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji public: 98a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji explicit Pattern(StringPiece pat); 99a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji 100a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji bool Match(StringPiece str) const; 101a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji 102a7984ad9b84f94b50454ad7acd20d5dcacdd6b12Shinichiro Hamaji StringPiece Stem(StringPiece str) const; 103a7984ad9b84f94b50454ad7acd20d5dcacdd6b12Shinichiro Hamaji 104a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji void AppendSubst(StringPiece str, StringPiece subst, string* out) const; 10502fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamaji 106a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji void AppendSubstRef(StringPiece str, StringPiece subst, string* out) const; 10702fc55bc02e541a5ce4b648a82d78f2aacec89d4Shinichiro Hamaji 108a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji private: 109a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji bool MatchImpl(StringPiece str) const; 110a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji 111a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji StringPiece pat_; 112a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji size_t percent_index_; 113a6a17a4a4ae66ecbdc66ee977131360741bdc5b2Shinichiro Hamaji}; 11400cc658846e0a980a1a6cfa25c3fda3662b4b912Shinichiro Hamaji 115810fd03ef36afedeef832c5e78171b9e26a97e00Shinichiro Hamajistring NoLineBreak(const string& s); 116810fd03ef36afedeef832c5e78171b9e26a97e00Shinichiro Hamaji 11732750621508da5e68f53bf14f944ad524627eb50Shinichiro HamajiStringPiece TrimLeftSpace(StringPiece s); 11832750621508da5e68f53bf14f944ad524627eb50Shinichiro HamajiStringPiece TrimRightSpace(StringPiece s); 11932750621508da5e68f53bf14f944ad524627eb50Shinichiro HamajiStringPiece TrimSpace(StringPiece s); 12032750621508da5e68f53bf14f944ad524627eb50Shinichiro Hamaji 12167f9a70b05f54dfa0a4d13c5d2ca16557b8917adShinichiro HamajiStringPiece Dirname(StringPiece s); 12267f9a70b05f54dfa0a4d13c5d2ca16557b8917adShinichiro HamajiStringPiece Basename(StringPiece s); 12367f9a70b05f54dfa0a4d13c5d2ca16557b8917adShinichiro HamajiStringPiece GetExt(StringPiece s); 12467f9a70b05f54dfa0a4d13c5d2ca16557b8917adShinichiro HamajiStringPiece StripExt(StringPiece s); 125b3591eda330af9688f9fe4c1b1f59ccbcd9696c5Shinichiro Hamajivoid NormalizePath(string* o); 1268a96358d16ab0c435820d07472e301e9d3b2c03aShinichiro Hamajivoid AbsPath(StringPiece s, string* o); 12767f9a70b05f54dfa0a4d13c5d2ca16557b8917adShinichiro Hamaji 128eafd0524d02f24a8b677b9f4debd124f4f9e05a9Shinichiro Hamajisize_t FindOutsideParen(StringPiece s, char c); 12976ff98375f92f73aab6ad0d51dc5fe9d9e6528d1Shinichiro Hamajisize_t FindTwoOutsideParen(StringPiece s, char c1, char c2); 130415a9b1b3aa75238c9893ea5f117c0877ecc8329Shinichiro Hamajisize_t FindThreeOutsideParen(StringPiece s, char c1, char c2, char c3); 131eafd0524d02f24a8b677b9f4debd124f4f9e05a9Shinichiro Hamaji 13214bb279334c9db568f6cb8b8854f4309b3bfbc5eShinichiro Hamajisize_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt); 13314bb279334c9db568f6cb8b8854f4309b3bfbc5eShinichiro Hamaji 134d9533329dc5e6a969882a89349fa8c69927774e0Shinichiro Hamaji// Strip leading sequences of './' from file names, so that ./file 135d9533329dc5e6a969882a89349fa8c69927774e0Shinichiro Hamaji// and file are considered to be the same file. 136d9533329dc5e6a969882a89349fa8c69927774e0Shinichiro Hamaji// From http://www.gnu.org/software/make/manual/make.html#Features 137d9533329dc5e6a969882a89349fa8c69927774e0Shinichiro HamajiStringPiece TrimLeadingCurdir(StringPiece s); 138d9533329dc5e6a969882a89349fa8c69927774e0Shinichiro Hamaji 139c9b0acaf0a11eee6b0152c51d9633758ad8c662cShinichiro Hamajivoid FormatForCommandSubstitution(string* s); 140c9b0acaf0a11eee6b0152c51d9633758ad8c662cShinichiro Hamaji 141c9b0acaf0a11eee6b0152c51d9633758ad8c662cShinichiro Hamajistring SortWordsInString(StringPiece s); 142c9b0acaf0a11eee6b0152c51d9633758ad8c662cShinichiro Hamaji 1435a71a8b0947d8fa1acc87217cd9201530f92e89cShinichiro Hamajistring ConcatDir(StringPiece b, StringPiece n); 1445a71a8b0947d8fa1acc87217cd9201530f92e89cShinichiro Hamaji 145cb2ff8558ced3ddc021823a3c86bc7ce02dcbdc3Dan Willemsenstring EchoEscape(const string &str); 146e6f6858860e28b4336ae5d64d42b5080a6fbe4c1Dan Willemsen 147348a960f31d42c63ec6fff68a27c5b161b59a89fShinichiro Hamajivoid EscapeShell(string* s); 148348a960f31d42c63ec6fff68a27c5b161b59a89fShinichiro Hamaji 149776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#endif // STRUTIL_H_ 150