Non-alpha-numeric characters are filtered out of include guards
authorWouter van Oortmerssen <wvo@google.com>
Fri, 5 Sep 2014 18:19:51 +0000 (11:19 -0700)
committerWouter van Oortmerssen <wvo@google.com>
Fri, 5 Sep 2014 18:27:03 +0000 (11:27 -0700)
Since part of it is based on the filename, which may contain
characters that are not legal identifiers.

Change-Id: I62b8fe228a434a2040fd4ce47d220fc4d3398b41
Tested: on Linux.

src/idl_gen_cpp.cpp
tests/monster_test_generated.h

index ba07194..4aa731e 100644 (file)
@@ -459,7 +459,7 @@ void CloseNestedNameSpaces(Namespace *ns, std::string *code_ptr) {
 // Iterate through all definitions we haven't generate code for (enums, structs,
 // and tables) and output them to a single file.
 std::string GenerateCPP(const Parser &parser,
-                        const std::string &include_guard_ident,
+                        const std::string &file_name,
                         const GeneratorOptions &opts) {
   using namespace cpp;
 
@@ -522,8 +522,16 @@ std::string GenerateCPP(const Parser &parser,
            " do not modify\n\n";
 
     // Generate include guard.
+    std::string include_guard_ident = file_name;
+    // Remove any non-alpha-numeric characters that may appear in a filename.
+    include_guard_ident.erase(
+      std::remove_if(include_guard_ident.begin(),
+                     include_guard_ident.end(),
+                     [](char c) { return !isalnum(c); }),
+      include_guard_ident.end());
     std::string include_guard = "FLATBUFFERS_GENERATED_" + include_guard_ident;
     include_guard += "_";
+    // For further uniqueness, also add the namespace.
     auto name_space = parser.namespaces_.back();
     for (auto it = name_space->components.begin();
              it != name_space->components.end(); ++it) {
index a3e138b..5063072 100755 (executable)
@@ -1,7 +1,7 @@
 // automatically generated by the FlatBuffers compiler, do not modify
 
-#ifndef FLATBUFFERS_GENERATED_MONSTER_TEST_MYGAME_EXAMPLE_H_
-#define FLATBUFFERS_GENERATED_MONSTER_TEST_MYGAME_EXAMPLE_H_
+#ifndef FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_
+#define FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_
 
 #include "flatbuffers/flatbuffers.h"
 
@@ -207,4 +207,4 @@ inline bool MonsterBufferHasIdentifier(const void *buf) { return flatbuffers::Bu
 }  // namespace Example
 }  // namespace MyGame
 
-#endif  // FLATBUFFERS_GENERATED_MONSTER_TEST_MYGAME_EXAMPLE_H_
+#endif  // FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_