blob: b911d66b1416bc6c02ff8cecb2170896fc8ad5da [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#ifndef STRUTIL_H_
2#define STRUTIL_H_
3
4#include <string>
5#include <vector>
6
7#include "string_piece.h"
8
9using namespace std;
10
11class WordScanner {
12 public:
13 struct Iterator {
14 Iterator& operator++();
15 StringPiece operator*() const;
16 bool operator!=(const Iterator& r) const {
17 return in != r.in || s != r.s || i != r.i;
18 }
19
20 const StringPiece* in;
21 int s;
22 int i;
23 };
24
25 explicit WordScanner(StringPiece in);
26
27 Iterator begin() const;
28 Iterator end() const;
29
Shinichiro Hamajid87e59e2015-06-17 18:18:34 +090030 void Split(vector<StringPiece>* o);
31
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090032 private:
33 StringPiece in_;
34};
35
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090036class WordWriter {
37 public:
38 explicit WordWriter(string* o);
Shinichiro Hamaji37591ce2015-06-16 19:36:05 +090039 void MaybeAddWhitespace();
Shinichiro Hamaji2e6cbfc2015-06-16 18:46:50 +090040 void Write(StringPiece s);
41
42 private:
43 string* out_;
44 bool needs_space_;
45};
46
Shinichiro Hamaji8f68bd32015-06-18 11:01:51 +090047// Temporary modifies s[s.size()] to '\0'.
48class ScopedTerminator {
49 public:
50 explicit ScopedTerminator(StringPiece s);
51 ~ScopedTerminator();
52
53 private:
54 StringPiece s_;
55 char c_;
56};
57
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090058void InitSymtab();
59void QuitSymtab();
60StringPiece Intern(StringPiece s);
61
62template <class String>
63inline string JoinStrings(vector<String> v, const char* sep) {
64 string r;
65 for (StringPiece s : v) {
66 if (!r.empty()) {
67 r += sep;
68 }
69 r.append(s.begin(), s.end());
70 }
71 return r;
72}
73
Shinichiro Hamaji02fc55b2015-06-16 17:19:07 +090074void AppendString(StringPiece str, string* out);
75
76bool HasPrefix(StringPiece str, StringPiece prefix);
77
78bool HasSuffix(StringPiece str, StringPiece suffix);
79
80StringPiece TrimSuffix(StringPiece str, StringPiece suffix);
81
82void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst,
83 string* out);
84
85void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst,
86 string* out);
87
Shinichiro Hamaji00cc6582015-06-17 18:12:46 +090088bool MatchPattern(StringPiece str, StringPiece pat);
89
Shinichiro Hamaji810fd032015-06-17 04:38:03 +090090string NoLineBreak(const string& s);
91
Shinichiro Hamaji32750622015-06-17 14:57:33 +090092StringPiece TrimLeftSpace(StringPiece s);
93StringPiece TrimRightSpace(StringPiece s);
94StringPiece TrimSpace(StringPiece s);
95
Shinichiro Hamaji67f9a702015-06-18 06:00:57 +090096StringPiece Dirname(StringPiece s);
97StringPiece Basename(StringPiece s);
98StringPiece GetExt(StringPiece s);
99StringPiece StripExt(StringPiece s);
Shinichiro Hamaji8a963582015-06-18 07:05:58 +0900100void AbsPath(StringPiece s, string* o);
Shinichiro Hamaji67f9a702015-06-18 06:00:57 +0900101
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900102#endif // STRUTIL_H_