1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
// 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 <limits.h>
// GNU Hurd doesn't have PATH_MAX
#if defined(__GNU__) && !defined(PATH_MAX)
#define PATH_MAX 4096
#endif
#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_
|