diff options
Diffstat (limited to 'src/strutil.h')
| -rw-r--r-- | src/strutil.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/strutil.h b/src/strutil.h new file mode 100644 index 0000000..cc4d519 --- /dev/null +++ b/src/strutil.h @@ -0,0 +1,149 @@ +// Copyright 2015 Google Inc. All rights reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef STRUTIL_H_ +#define STRUTIL_H_ + +#include <string> +#include <vector> + +#include "string_piece.h" + +using namespace std; + +class WordScanner { + public: + struct Iterator { + Iterator& operator++(); + StringPiece operator*() const; + bool operator!=(const Iterator& r) const { + return in != r.in || s != r.s || i != r.i; + } + + const StringPiece* in; + int s; + int i; + }; + + explicit WordScanner(StringPiece in); + + Iterator begin() const; + Iterator end() const; + + void Split(vector<StringPiece>* o); + + private: + StringPiece in_; +}; + +class WordWriter { + public: + explicit WordWriter(string* o); + void MaybeAddWhitespace(); + void Write(StringPiece s); + + private: + string* out_; + bool needs_space_; +}; + +// Temporary modifies s[s.size()] to '\0'. +class ScopedTerminator { + public: + explicit ScopedTerminator(StringPiece s); + ~ScopedTerminator(); + + private: + StringPiece s_; + char c_; +}; + +template <class String> +inline string JoinStrings(vector<String> v, const char* sep) { + string r; + for (StringPiece s : v) { + if (!r.empty()) { + r += sep; + } + r.append(s.begin(), s.end()); + } + return r; +} + +void AppendString(StringPiece str, string* out); + +bool HasPrefix(StringPiece str, StringPiece prefix); + +bool HasSuffix(StringPiece str, StringPiece suffix); + +bool HasWord(StringPiece str, StringPiece w); + +StringPiece TrimPrefix(StringPiece str, StringPiece suffix); + +StringPiece TrimSuffix(StringPiece str, StringPiece suffix); + +class Pattern { + public: + explicit Pattern(StringPiece pat); + + bool Match(StringPiece str) const; + + StringPiece Stem(StringPiece str) const; + + void AppendSubst(StringPiece str, StringPiece subst, string* out) const; + + void AppendSubstRef(StringPiece str, StringPiece subst, string* out) const; + + private: + bool MatchImpl(StringPiece str) const; + + StringPiece pat_; + size_t percent_index_; +}; + +string NoLineBreak(const string& s); + +StringPiece TrimLeftSpace(StringPiece s); +StringPiece TrimRightSpace(StringPiece s); +StringPiece TrimSpace(StringPiece s); + +StringPiece Dirname(StringPiece s); +StringPiece Basename(StringPiece s); +StringPiece GetExt(StringPiece s); +StringPiece StripExt(StringPiece s); +void NormalizePath(string* o); +void AbsPath(StringPiece s, string* o); + +size_t FindOutsideParen(StringPiece s, char c); +size_t FindTwoOutsideParen(StringPiece s, char c1, char c2); +size_t FindThreeOutsideParen(StringPiece s, char c1, char c2, char c3); + +size_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt); + +// Strip leading sequences of './' from file names, so that ./file +// and file are considered to be the same file. +// From http://www.gnu.org/software/make/manual/make.html#Features +StringPiece TrimLeadingCurdir(StringPiece s); + +void FormatForCommandSubstitution(string* s); + +string SortWordsInString(StringPiece s); + +string ConcatDir(StringPiece b, StringPiece n); + +string EchoEscape(const string& str); + +void EscapeShell(string* s); + +#endif // STRUTIL_H_ |
