|
|
|
@ -434,20 +434,52 @@ void FileGenerator::GenerateBuildDescriptors(io::Printer* printer) { |
|
|
|
|
string file_data; |
|
|
|
|
file_proto.SerializeToString(&file_data); |
|
|
|
|
|
|
|
|
|
printer->Print( |
|
|
|
|
"::google::protobuf::DescriptorPool::InternalAddGeneratedFile("); |
|
|
|
|
|
|
|
|
|
// Only write 40 bytes per line.
|
|
|
|
|
static const int kBytesPerLine = 40; |
|
|
|
|
for (int i = 0; i < file_data.size(); i += kBytesPerLine) { |
|
|
|
|
printer->Print("\n \"$data$\"", |
|
|
|
|
"data", |
|
|
|
|
EscapeTrigraphs( |
|
|
|
|
CEscape(file_data.substr(i, kBytesPerLine)))); |
|
|
|
|
// Workaround for MSVC: "Error C1091: compiler limit: string exceeds 65535
|
|
|
|
|
// bytes in length". Declare a static array of characters rather than use a
|
|
|
|
|
// string literal.
|
|
|
|
|
if (file_data.size() > 65535) { |
|
|
|
|
printer->Print( |
|
|
|
|
"static const char descriptor[] = {\n"); |
|
|
|
|
printer->Indent(); |
|
|
|
|
|
|
|
|
|
// Only write 25 bytes per line.
|
|
|
|
|
static const int kBytesPerLine = 25; |
|
|
|
|
for (int i = 0; i < file_data.size();) { |
|
|
|
|
for (int j = 0; j < kBytesPerLine && i < file_data.size(); ++i, ++j) { |
|
|
|
|
printer->Print( |
|
|
|
|
"$char$, ", |
|
|
|
|
"char", SimpleItoa(file_data[i])); |
|
|
|
|
} |
|
|
|
|
printer->Print( |
|
|
|
|
"\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
printer->Outdent(); |
|
|
|
|
printer->Print( |
|
|
|
|
"};\n"); |
|
|
|
|
|
|
|
|
|
printer->Print( |
|
|
|
|
"::google::protobuf::DescriptorPool::InternalAddGeneratedFile(descriptor, $size$);\n", |
|
|
|
|
"size", SimpleItoa(file_data.size())); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
printer->Print( |
|
|
|
|
"::google::protobuf::DescriptorPool::InternalAddGeneratedFile("); |
|
|
|
|
|
|
|
|
|
// Only write 40 bytes per line.
|
|
|
|
|
static const int kBytesPerLine = 40; |
|
|
|
|
for (int i = 0; i < file_data.size(); i += kBytesPerLine) { |
|
|
|
|
printer->Print("\n \"$data$\"", |
|
|
|
|
"data", |
|
|
|
|
EscapeTrigraphs( |
|
|
|
|
CEscape(file_data.substr(i, kBytesPerLine)))); |
|
|
|
|
} |
|
|
|
|
printer->Print( |
|
|
|
|
", $size$);\n", |
|
|
|
|
"size", SimpleItoa(file_data.size())); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
printer->Print( |
|
|
|
|
", $size$);\n", |
|
|
|
|
"size", SimpleItoa(file_data.size())); |
|
|
|
|
|
|
|
|
|
// Call MessageFactory::InternalRegisterGeneratedFile().
|
|
|
|
|
printer->Print( |
|
|
|
|