THRIFT-5067 Invalid generated Cpp code from valid Thrift IDL with dots in file names for nested namespaces
Client: cpp
Patch: zeshuai007 <51382517@qq.com>

This closes #2060
diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
index 896c43f..372014d 100644
--- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
@@ -299,6 +299,13 @@
   std::string get_include_prefix(const t_program& program) const;
 
   /**
+   * Returns the legal program name to use for a file generated by program, if the
+   * program name contains dots then replace it with underscores, otherwise return the 
+   * original program name.
+   */
+  std::string get_legal_program_name(std::string program_name);
+
+  /**
    * True if we should generate pure enums for Thrift enums, instead of wrapper classes.
    */
   bool gen_pure_enums_;
@@ -386,6 +393,8 @@
   // Make output directory
   MKDIR(get_out_dir().c_str());
 
+  program_name_ = get_legal_program_name(program_name_);
+
   // Make output file
   string f_types_name = get_out_dir() + program_name_ + "_types.h";
   f_types_.open(f_types_name);
@@ -4550,6 +4559,23 @@
   return "";
 }
 
+string t_cpp_generator::get_legal_program_name(std::string program_name)
+{
+  std::size_t found = 0;
+
+  while(true) {
+    found = program_name.find('.');
+
+    if(found != string::npos) {
+      program_name = program_name.replace(found, 1, "_");
+    } else {
+      break;
+    }
+  }
+
+  return program_name;
+}
+
 THRIFT_REGISTER_GENERATOR(
     cpp,
     "C++",