dbus-c++: dbusxx-xml2cpp -- legalize identifiers for proxy.

This makes dbusxx-xml2cpp generate correct proxy C++ for
org.freedesktop.ModemManager.Modem.xml (argument "new") and for
org.freedesktop.ModemManager.Modem.Cdma.xml (arguments "cdma-1x-state" and
"evdo-state").

BUG=chromium-os:18498
TEST=build_packages --nousepkg

Change-Id: I10928ba9657cc7696a8a4444ece2ca5bacc503d8
Reviewed-on: http://gerrit.chromium.org/gerrit/5096
Tested-by: Darin Petkov <[email protected]>
Reviewed-by: Eric Shienbrood <[email protected]>
diff --git a/tools/generate_adaptor.cpp b/tools/generate_adaptor.cpp
index ebae98f..dbfa5bf 100644
--- a/tools/generate_adaptor.cpp
+++ b/tools/generate_adaptor.cpp
@@ -35,24 +35,6 @@
 extern const char *header;
 extern const char *dbus_includes;
 
-/*
- * Convert '-' characters found in the XML
- * introspection into '_' characters, so
- * that the result will be a legal C++
- * identifier.
- */
-static string legalize(string input)
-{
-	size_t pos = 0;
-  
-	while (pos != string::npos) {
-		pos = input.find('-', pos);
-		if (pos != string::npos)
-			input[pos] = '_';
-	}
-	return input;
-}
-
 /*! Generate adaptor code for object methods
   */
 void generate_methods(const Xml::Nodes &methods, ostringstream &body) {
diff --git a/tools/generate_proxy.cpp b/tools/generate_proxy.cpp
index cfece45..b7df947 100644
--- a/tools/generate_proxy.cpp
+++ b/tools/generate_proxy.cpp
@@ -143,7 +143,7 @@
 			if (property_access == "read" || property_access == "readwrite")
 			{
 				body << tab << tab << "const " << signature_to_type (property.get("type"))
-				<< " " << prop_name << "() {" << endl;
+				<< " " << legalize(prop_name) << "() {" << endl;
 				body << tab << tab << tab << "::DBus::CallMessage call ;\n ";
 				body << tab << tab << tab
 				<< "call.member(\"Get\"); call.interface(\"org.freedesktop.DBus.Properties\");"
@@ -170,7 +170,7 @@
 
 			if (property_access == "write" || property_access == "readwrite")
 			{
-				body << tab << tab << "void " << prop_name << "( const "<< signature_to_type (property.get("type")) << " & input" << ") {" << endl;
+				body << tab << tab << "void " << legalize(prop_name) << "( const "<< signature_to_type (property.get("type")) << " & input" << ") {" << endl;
 				body << tab << tab << tab << "::DBus::CallMessage call ;\n ";
 				body << tab << tab << tab <<"call.member(\"Set\");  call.interface( \"org.freedesktop.DBus.Properties\");"<< endl;
 				body << tab << tab << tab <<"::DBus::MessageIter wi = call.writer(); " << endl;
@@ -222,7 +222,7 @@
 
 				string arg_name = arg.get("name");
 				if (arg_name.length())
-					body << arg_name;
+					body << legalize(arg_name);
 				else
 					body << "argin" << i;
 
@@ -240,7 +240,7 @@
 
 					string arg_name = arg.get("name");
 					if (arg_name.length())
-						body << " " << arg_name;
+						body << " " << legalize(arg_name);
 					else
 						body << " argout" << i;
 
@@ -265,7 +265,7 @@
 				Xml::Node &arg = **ai;
 				string arg_name = arg.get("name");
 				if (arg_name.length())
-					body << tab << tab << "wi << " << arg_name << ";" << endl;
+					body << tab << tab << "wi << " << legalize(arg_name) << ";" << endl;
 				else
 					body << tab << tab << "wi << argin" << j << ";" << endl;
 			}
@@ -295,7 +295,7 @@
 
 					string arg_name = arg.get("name");
 					if (arg_name.length())
-						body << tab << tab << "ri >> " << arg.get("name") << ";" << endl;
+						body << tab << tab << "ri >> " << legalize(arg.get("name")) << ";" << endl;
 					else
 						body << tab << tab << "ri >> argout" << i << ";" << endl;
 				}
@@ -329,7 +329,7 @@
 
 				string arg_name = arg.get("name");
 				if (arg_name.length())
-					body << arg_name;
+					body << legalize(arg_name);
 				else
 					body << "argin" << i;
 
@@ -369,7 +369,7 @@
 
 				string arg_name = arg.get("name");
 				if (arg_name.length())
-					body << arg_name << ";" << " ri >> " << arg_name << ";" << endl;
+					body << legalize(arg_name) << ";" << " ri >> " << legalize(arg_name) << ";" << endl;
 				else
 					body << "arg" << i << ";" << " ri >> " << "arg" << i << ";" << endl;
 			}
@@ -384,7 +384,7 @@
 
 				string arg_name = arg.get("name");
 				if (arg_name.length())
-					body << arg_name;
+					body << legalize(arg_name);
 				else
 					body << "arg" << j;
 
diff --git a/tools/generator_utils.cpp b/tools/generator_utils.cpp
index e08ad27..2e44a70 100644
--- a/tools/generator_utils.cpp
+++ b/tools/generator_utils.cpp
@@ -50,6 +50,18 @@
 	}
 }
 
+std::string legalize(const std::string &str)
+{
+	string legal = str;
+	underscorize(legal);
+	// TODO: Check for other C++ keywords, as needed.
+	if (legal == "new")
+	{
+		legal = "_" + legal;
+	}
+	return legal;
+}
+
 string stub_name(string name)
 {
 	underscorize(name);
diff --git a/tools/generator_utils.h b/tools/generator_utils.h
index b8cc7e9..0875faf 100644
--- a/tools/generator_utils.h
+++ b/tools/generator_utils.h
@@ -33,5 +33,6 @@
 std::string signature_to_type(const std::string &signature);
 void _parse_signature(const std::string &signature, std::string &type, unsigned int &i);
 void underscorize(std::string &str);
+std::string legalize(const std::string &str);
 
 #endif//__DBUSXX_TOOLS_GENERATOR_UTILS_H