1
2 #include "string_utils.h"
3 #include <iostream>
4
5 namespace android {
6 namespace stream_proto {
7
8 using namespace std;
9
10 string
to_camel_case(const string & str)11 to_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
39 string
make_constant_name(const string & str)40 make_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
63 string
file_base_name(const string & str)64 file_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
79 string
replace_string(const string & str,const char replace,const char with)80 replace_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
92 vector<string>
split(const string & str,const char delimiter)93 split(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
111 string
stripPrefix(const string & str,const string & prefix)112 stripPrefix(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
122 } // namespace stream_proto
123 } // namespace android
124
125
126