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