@ -54,6 +54,39 @@ namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
namespace {
// The list of names that are defined as macros on some platforms. We need to
// #undef them for the generated code to compile.
const char * kMacroNames [ ] = { " major " , " minor " } ;
bool IsMacroName ( const string & name ) {
// Just do a linear search as the number of elements is very small.
for ( int i = 0 ; i < GOOGLE_ARRAYSIZE ( kMacroNames ) ; + + i ) {
if ( name = = kMacroNames [ i ] ) return true ;
}
return false ;
}
void CollectMacroNames ( const Descriptor * message , vector < string > * names ) {
for ( int i = 0 ; i < message - > field_count ( ) ; + + i ) {
const FieldDescriptor * field = message - > field ( i ) ;
if ( IsMacroName ( field - > name ( ) ) ) {
names - > push_back ( field - > name ( ) ) ;
}
}
for ( int i = 0 ; i < message - > nested_type_count ( ) ; + + i ) {
CollectMacroNames ( message - > nested_type ( i ) , names ) ;
}
}
void CollectMacroNames ( const FileDescriptor * file , vector < string > * names ) {
for ( int i = 0 ; i < file - > message_type_count ( ) ; + + i ) {
CollectMacroNames ( file - > message_type ( i ) , names ) ;
}
}
} // namespace
// ===================================================================
@ -103,10 +136,23 @@ FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options)
FileGenerator : : ~ FileGenerator ( ) { }
void FileGenerator : : GenerateMacroUndefs ( io : : Printer * printer ) {
vector < string > names_to_undef ;
CollectMacroNames ( file_ , & names_to_undef ) ;
for ( int i = 0 ; i < names_to_undef . size ( ) ; + + i ) {
printer - > Print (
" #ifdef $name$ \n "
" #undef $name$ \n "
" #endif \n " ,
" name " , names_to_undef [ i ] ) ;
}
}
void FileGenerator : : GenerateHeader ( io : : Printer * printer ) {
printer - > Print (
" // @@protoc_insertion_point(includes) \n " ) ;
GenerateMacroUndefs ( printer ) ;
GenerateForwardDeclarations ( printer ) ;