It is very similiar to protoc-gen-javastream, which generates field Ids used
by ProtoOutputStream.cpp to dump protobuf data.
Bug: 65641021
Test: compile the streaming_proto:
$ mmm -j frameworks/base/tools/streaming_proto/
and run:
$ PATH=$PATH:out/host/linux-x86/bin/protoc-gen-cppstream aprotoc
--cppstream_out=tmp/
frameworks/base/core/proto/android/service/procstats.proto
frameworks/base/core/proto/android/util/common.proto
Change-Id: I68becc80b5166455455c5df28cd698601b4a1c1d
115 lines
2.5 KiB
C++
115 lines
2.5 KiB
C++
|
|
#include "string_utils.h"
|
|
#include <iostream>
|
|
|
|
namespace android {
|
|
namespace stream_proto {
|
|
|
|
using namespace std;
|
|
|
|
string
|
|
to_camel_case(const string& str)
|
|
{
|
|
string result;
|
|
const int N = str.size();
|
|
result.reserve(N);
|
|
bool capitalize_next = true;
|
|
for (int i=0; i<N; i++) {
|
|
char c = str[i];
|
|
if (c == '_') {
|
|
capitalize_next = true;
|
|
} else {
|
|
if (capitalize_next && c >= 'a' && c <= 'z') {
|
|
c = 'A' + c - 'a';
|
|
capitalize_next = false;
|
|
} else if (c >= 'A' && c <= 'Z') {
|
|
capitalize_next = false;
|
|
} else if (c >= '0' && c <= '9') {
|
|
capitalize_next = true;
|
|
} else {
|
|
// All other characters (e.g. non-latin) count as capital.
|
|
capitalize_next = false;
|
|
}
|
|
result += c;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
string
|
|
make_constant_name(const string& str)
|
|
{
|
|
string result;
|
|
const int N = str.size();
|
|
bool underscore_next = false;
|
|
for (int i=0; i<N; i++) {
|
|
char c = str[i];
|
|
if (c >= 'A' && c <= 'Z') {
|
|
if (underscore_next) {
|
|
result += '_';
|
|
underscore_next = false;
|
|
}
|
|
} else if (c >= 'a' && c <= 'z') {
|
|
c = 'A' + c - 'a';
|
|
underscore_next = true;
|
|
} else if (c == '_') {
|
|
underscore_next = false;
|
|
}
|
|
result += c;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
string
|
|
file_base_name(const string& str)
|
|
{
|
|
size_t start = str.rfind('/');
|
|
if (start == string::npos) {
|
|
start = 0;
|
|
} else {
|
|
start++;
|
|
}
|
|
size_t end = str.find('.', start);
|
|
if (end == string::npos) {
|
|
end = str.size();
|
|
}
|
|
return str.substr(start, end-start);
|
|
}
|
|
|
|
string
|
|
replace_string(const string& str, const char replace, const char with)
|
|
{
|
|
string result(str);
|
|
const int N = result.size();
|
|
for (int i=0; i<N; i++) {
|
|
if (result[i] == replace) {
|
|
result[i] = with;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
vector<string>
|
|
split(const string& str, const char delimiter)
|
|
{
|
|
vector<string> result;
|
|
size_t base = 0, found = 0;
|
|
while (true) {
|
|
found = str.find_first_of(delimiter, base);
|
|
if (found != base) {
|
|
string part = str.substr(base, found - base);
|
|
if (!part.empty()) {
|
|
result.push_back(part);
|
|
}
|
|
}
|
|
if (found == str.npos) break;
|
|
base = found + 1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
} // namespace stream_proto
|
|
} // namespace android
|
|
|
|
|