summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorNuno Santos <nsantos@apache.org>2008-05-08 16:00:00 +0000
committerNuno Santos <nsantos@apache.org>2008-05-08 16:00:00 +0000
commit18f885ca547803c92e22c9bf7cf426aab0d27402 (patch)
tree33492ca3b8d94defeda38f2ee897508a54fddbb7 /cpp
parent8d1a8ac4bef1230131aaec54883d50aedd8aa314 (diff)
downloadqpid-python-18f885ca547803c92e22c9bf7cf426aab0d27402.tar.gz
QPID-1026: managementgen C++ symbol validation - applied patch supplied by Matt Farrellee
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@654566 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rwxr-xr-xcpp/managementgen/generate.py4
-rwxr-xr-xcpp/managementgen/schema.py66
2 files changed, 60 insertions, 10 deletions
diff --git a/cpp/managementgen/generate.py b/cpp/managementgen/generate.py
index 5e3aa51b57..da78d6c7e9 100755
--- a/cpp/managementgen/generate.py
+++ b/cpp/managementgen/generate.py
@@ -192,7 +192,7 @@ class Generator:
if dot == -1:
raise ValueError ("Invalid template file name %s" % templateFile)
extension = templateFile[dot:len (templateFile)]
- path = self.dest + "Package" + schema.getPackageName().capitalize() + extension
+ path = self.dest + "Package" + schema.getPackageNameCap() + extension
return path
def targetClassFile (self, _class, templateFile):
@@ -200,7 +200,7 @@ class Generator:
if dot == -1:
raise ValueError ("Invalid template file name %s" % templateFile)
extension = templateFile[dot:len (templateFile)]
- path = self.dest + _class.getName ().capitalize () + extension
+ path = self.dest + _class.getNameCap () + extension
return path
def targetMethodFile (self, method, templateFile):
diff --git a/cpp/managementgen/schema.py b/cpp/managementgen/schema.py
index 1b4ca75b44..68e9bfd4e2 100755
--- a/cpp/managementgen/schema.py
+++ b/cpp/managementgen/schema.py
@@ -214,7 +214,7 @@ class SchemaConfig:
key = attrs.item(idx).nodeName
val = attrs.item(idx).nodeValue
if key == 'name':
- self.name = val
+ self.name = makeValidCppSymbol(val)
elif key == 'type':
self.type = Type (val, typespec)
@@ -309,7 +309,7 @@ class SchemaInst:
key = attrs.item(idx).nodeName
val = attrs.item(idx).nodeValue
if key == 'name':
- self.name = val
+ self.name = makeValidCppSymbol(val)
elif key == 'type':
self.type = Type (val, typespec)
@@ -422,7 +422,7 @@ class SchemaArg:
key = attrs.item(idx).nodeName
val = attrs.item(idx).nodeValue
if key == 'name':
- self.name = val
+ self.name = makeValidCppSymbol(val)
elif key == 'type':
self.type = Type (val, typespec)
@@ -496,7 +496,7 @@ class SchemaMethod:
key = attrs.item(idx).nodeName
val = attrs.item(idx).nodeValue
if key == 'name':
- self.name = val
+ self.name = makeValidCppSymbol(val)
elif key == 'desc':
self.desc = val
@@ -602,7 +602,7 @@ class SchemaClass:
self.hash (node)
attrs = node.attributes
- self.name = attrs['name'].nodeValue
+ self.name = makeValidCppSymbol(attrs['name'].nodeValue)
children = node.childNodes
for child in children:
@@ -660,12 +660,18 @@ class SchemaClass:
def getName (self):
return self.name
+ def getNameCap (self):
+ return capitalize(self.name)
+
def getMethods (self):
return self.methods
def getEvents (self):
return self.events
+ def getPackageNameCap (self):
+ return capitalize(self.packageName)
+
#===================================================================================
# Code Generation Functions. The names of these functions (minus the leading "gen")
# match the substitution keywords in the template files.
@@ -809,7 +815,7 @@ class SchemaClass:
stream.write (self.name.lower ())
def genNamePackageCap (self, stream, variables):
- stream.write (self.packageName.capitalize ())
+ stream.write (self.getPackageNameCap ())
def genNamePackageLower (self, stream, variables):
stream.write (self.packageName.lower ())
@@ -859,7 +865,7 @@ class PackageSchema:
if document.tagName != 'schema':
raise ValueError ("Expected 'schema' node")
attrs = document.attributes
- self.packageName = attrs['package'].nodeValue
+ self.packageName = makeValidCppSymbol(attrs['package'].nodeValue)
children = document.childNodes
for child in children:
@@ -880,6 +886,9 @@ class PackageSchema:
def getPackageName (self):
return self.packageName
+ def getPackageNameCap (self):
+ return capitalize(self.packageName)
+
def getClasses (self):
return self.classes
@@ -887,7 +896,7 @@ class PackageSchema:
stream.write (self.packageName.upper ())
def genPackageNameCap (self, stream, variables):
- stream.write (self.packageName.capitalize ())
+ stream.write (self.getPackageNameCap ())
def genClassIncludes (self, stream, variables):
for _class in self.classes:
@@ -907,3 +916,44 @@ class PackageSchema:
_class.genNameCap (stream, variables)
stream.write ("::writeSchema);\n")
+
+#=====================================================================================
+# Utility Functions
+#=====================================================================================
+
+# Create a valid C++ symbol from the input string so that it can be
+# used in generated C++ source. For instance, change "qpid.mgmt" to
+# "qpidMgmt".
+#
+# Input: Raw string (str) to process
+# Output: String (str) suitable for use as a C++ symbol
+#
+# Limitations: Currently, only strips periods ('.') from strings,
+# eventually should strip :'s and ,'s and ''s, oh my!
+def makeValidCppSymbol(input):
+ output = str()
+ capitalize = False
+
+ for char in input:
+ skip = False
+
+ if char == ".":
+ capitalize = True
+ skip = True
+
+ if not skip:
+ output += capitalize and char.upper() or char
+
+ capitalize = False
+
+ return output
+
+# Capitalize a string by /only/ forcing the first character to be
+# uppercase. The rest of the string is left alone. This is different
+# from str.capitalize(), which forces the first character to uppercase
+# and the rest to lowercase.
+#
+# Input: A string (str) to capitalize
+# Output: A string (str) with the first character as uppercase
+def capitalize(input):
+ return input[0].upper() + input[1:]