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