blob: 607d820033ffe672f864d6af9eefafbd6f18b830 [file] [log] [blame]
Joe Onorato6c9547d2016-09-07 18:43:49 -07001
2#include "string_utils.h"
3#include <iostream>
4
5namespace android {
Yi Jin0473f88b2017-10-09 11:21:40 -07006namespace stream_proto {
Joe Onorato6c9547d2016-09-07 18:43:49 -07007
8using namespace std;
9
10string
11to_camel_case(const string& str)
12{
13 string result;
14 const int N = str.size();
15 result.reserve(N);
16 bool capitalize_next = true;
17 for (int i=0; i<N; i++) {
18 char c = str[i];
19 if (c == '_') {
20 capitalize_next = true;
21 } else {
22 if (capitalize_next && c >= 'a' && c <= 'z') {
23 c = 'A' + c - 'a';
24 capitalize_next = false;
25 } else if (c >= 'A' && c <= 'Z') {
26 capitalize_next = false;
27 } else if (c >= '0' && c <= '9') {
28 capitalize_next = true;
29 } else {
30 // All other characters (e.g. non-latin) count as capital.
31 capitalize_next = false;
32 }
33 result += c;
34 }
35 }
36 return result;
37}
38
39string
40make_constant_name(const string& str)
41{
42 string result;
43 const int N = str.size();
44 bool underscore_next = false;
45 for (int i=0; i<N; i++) {
46 char c = str[i];
47 if (c >= 'A' && c <= 'Z') {
48 if (underscore_next) {
49 result += '_';
50 underscore_next = false;
51 }
52 } else if (c >= 'a' && c <= 'z') {
53 c = 'A' + c - 'a';
54 underscore_next = true;
55 } else if (c == '_') {
56 underscore_next = false;
57 }
58 result += c;
59 }
60 return result;
61}
62
63string
64file_base_name(const string& str)
65{
66 size_t start = str.rfind('/');
67 if (start == string::npos) {
68 start = 0;
69 } else {
70 start++;
71 }
72 size_t end = str.find('.', start);
73 if (end == string::npos) {
74 end = str.size();
75 }
76 return str.substr(start, end-start);
77}
78
79string
80replace_string(const string& str, const char replace, const char with)
81{
82 string result(str);
83 const int N = result.size();
84 for (int i=0; i<N; i++) {
85 if (result[i] == replace) {
86 result[i] = with;
87 }
88 }
89 return result;
90}
91
Yi Jin0473f88b2017-10-09 11:21:40 -070092vector<string>
93split(const string& str, const char delimiter)
94{
95 vector<string> result;
96 size_t base = 0, found = 0;
97 while (true) {
98 found = str.find_first_of(delimiter, base);
99 if (found != base) {
100 string part = str.substr(base, found - base);
101 if (!part.empty()) {
102 result.push_back(part);
103 }
104 }
105 if (found == str.npos) break;
106 base = found + 1;
107 }
108 return result;
109}
110
Yi Jine2f7f792017-11-01 17:08:27 -0700111string
112stripPrefix(const string& str, const string& prefix)
113{
114 if (str.size() <= prefix.size()) return str;
115 size_t i = 0, len = prefix.size();
116 for (; i<len; i++) {
117 if (str[i] != prefix[i]) return str;
118 }
119 return str.substr(i);
120}
121
Yi Jin0473f88b2017-10-09 11:21:40 -0700122} // namespace stream_proto
Joe Onorato6c9547d2016-09-07 18:43:49 -0700123} // namespace android
124
125