+namespace
+{
+
+// Make the given string a valid C identifier.
+//
+// All invalid characters are simply replaced by underscores and underscore is
+// also prepended in the beginning if the initial character is not alphabetic.
+void
+MakeValidCIdent(wxString* str)
+{
+ const wxChar chUnderscore = wxT('_');
+
+ for ( wxString::iterator it = str->begin(); it != str->end(); ++it )
+ {
+ const wxChar ch = *it;
+ if ( wxIsdigit(ch) )
+ {
+ if ( it == str->begin() )
+ {
+ // Identifiers can't start with a digit.
+ str->insert(0, chUnderscore); // prepend underscore
+ it = str->begin(); // restart as string changed
+ continue;
+ }
+ }
+ else if ( !wxIsalpha(ch) && ch != chUnderscore )
+ {
+ // Not a valid character in C identifiers.
+ *it = chUnderscore;
+ }
+ }
+
+ // Double underscores are not allowed in normal C identifiers and are
+ // useless anyhow.
+ str->Replace(wxT("__"), wxT("_"));
+}
+
+} // anonymous namespace
+