[libvirt] [PATCH] esx: Cleanup VI generator code

--- src/esx/esx_vi_generator.py | 177 +++++++++++++++++-------------------------- 1 files changed, 71 insertions(+), 106 deletions(-) diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py index 3d068f3..622a34a 100755 --- a/src/esx/esx_vi_generator.py +++ b/src/esx/esx_vi_generator.py @@ -41,6 +41,11 @@ valid_occurrences = [OCCURRENCE__REQUIRED_ITEM, +def aligned(left, right): + while len(left) < 59: + left += " " + + return left + right @@ -64,9 +69,6 @@ class Parameter: def is_enum(self): - global predefined_enums - global enums_by_name - return self.type in predefined_enums or self.type in enums_by_name @@ -88,10 +90,7 @@ class Parameter: else: string += ", " - while len(string) < 59: - string += " " - - return string + self.get_occurrence_comment() + "\n" + return aligned(string, self.get_occurrence_comment() + "\n") def generate_return(self, offset = 0, end_of_line = ";"): @@ -102,10 +101,7 @@ class Parameter: string += " " * offset string += "%s%s)%s" % (self.get_type_string(True), self.name, end_of_line) - while len(string) < 59: - string += " " - - return string + self.get_occurrence_comment() + "\n" + return aligned(string, self.get_occurrence_comment() + "\n") def generate_require_code(self): @@ -274,9 +270,6 @@ class Property: def is_enum(self): - global predefined_enums - global enums_by_name - return self.type in predefined_enums or self.type in enums_by_name @@ -286,10 +279,7 @@ class Property: else: string = " %s%s; " % (self.get_type_string(), self.name) - while len(string) < 59: - string += " " - - return string + self.get_occurrence_comment() + "\n" + return aligned(string, self.get_occurrence_comment() + "\n") def generate_free_code(self): @@ -380,7 +370,37 @@ class Property: -class Object: +class Base: + def __init__(self, kind, name): + self.kind = kind + self.name = name + + + def generate_typedef(self): + return "typedef %s _esxVI_%s esxVI_%s;\n" % (self.kind, self.name, self.name) + + + def generate_typeenum(self): + return " esxVI_Type_%s,\n" % self.name + + + def generate_typetostring(self): + string = " case esxVI_Type_%s:\n" % self.name + string += " return \"%s\";\n\n" % self.name + + return string + + + def generate_typefromstring(self): + string = " else if (STREQ(type, \"%s\")) {\n" % self.name + string += " return esxVI_Type_%s;\n" % self.name + string += " }\n" + + return string + + + +class Object(Base): FEATURE__DYNAMIC_CAST = (1 << 1) FEATURE__LIST = (1 << 2) FEATURE__DEEP_COPY = (1 << 3) @@ -390,34 +410,24 @@ class Object: def __init__(self, name, extends, properties, features = 0, extended_by = None): - self.name = name + Base.__init__(self, "struct", name) self.extends = extends self.features = features | Object.FEATURE__SERIALIZE | Object.FEATURE__DESERIALIZE self.properties = properties self.extended_by = extended_by if self.extended_by is not None: - self.extended_by.sort(); + self.extended_by.sort() - def generate_struct_members(self, add_banner = False, struct_gap = False): - global objects_by_name + def generate_struct_members(self, add_banner=False, struct_gap=False): members = "" - if self.extends is None: - struct_gap = True - string = " esxVI_Type _type; " - - while len(string) < 59: - string += " " - - members += string + "/* required */\n" - - if struct_gap and self.extends is None: + if struct_gap: members += "\n" if self.extends is not None: - members += objects_by_name[self.extends].generate_struct_members(add_banner = True, struct_gap = False) + "\n" + members += objects_by_name[self.extends].generate_struct_members(add_banner=True, struct_gap=False) + "\n" if self.extends is not None or add_banner: members += " /* %s */\n" % self.name @@ -431,12 +441,11 @@ class Object: return members - def generate_free_code(self, add_banner = False): - global objects_by_name + def generate_free_code(self, add_banner=False): source = "" if self.extends is not None: - source += objects_by_name[self.extends].generate_free_code(add_banner = True) + "\n" + source += objects_by_name[self.extends].generate_free_code(add_banner=True) + "\n" if self.extends is not None or add_banner: source += " /* %s */\n" % self.name @@ -457,12 +466,11 @@ class Object: return source - def generate_validate_code(self, add_banner = False): - global objects_by_name + def generate_validate_code(self, add_banner=False): source = "" if self.extends is not None: - source += objects_by_name[self.extends].generate_validate_code(add_banner = True) + "\n" + source += objects_by_name[self.extends].generate_validate_code(add_banner=True) + "\n" if self.extends is not None or add_banner: source += " /* %s */\n" % self.name @@ -484,7 +492,6 @@ class Object: def generate_dynamic_cast_code(self, is_first = True): - global objects_by_name source = "" if self.extended_by is not None: @@ -503,7 +510,6 @@ class Object: def generate_deep_copy_code(self, add_banner = False): - global objects_by_name source = "" if self.extends is not None: @@ -529,7 +535,6 @@ class Object: def generate_serialize_code(self, add_banner = False): - global objects_by_name source = "" if self.extends is not None: @@ -548,11 +553,10 @@ class Object: def generate_deserialize_code(self, add_banner = False): - global objects_by_name source = "" if self.extends is not None: - source += objects_by_name[self.extends].generate_deserialize_code(add_banner = True) + "\n" + source += objects_by_name[self.extends].generate_deserialize_code(add_banner=True) + "\n" if self.extends is not None or add_banner: source += " /* %s */\n" % self.name @@ -566,29 +570,6 @@ class Object: return source - def generate_typedef(self): - return "typedef struct _esxVI_%s esxVI_%s;\n" % (self.name, self.name) - - - def generate_typeenum(self): - return " esxVI_Type_%s,\n" % self.name - - - def generate_typetostring(self): - string = " case esxVI_Type_%s:\n" % self.name - string += " return \"%s\";\n\n" % self.name - - return string - - - def generate_typefromstring(self): - string = " else if (STREQ(type, \"%s\")) {\n" % self.name - string += " return esxVI_Type_%s;\n" % self.name - string += " }\n" - - return string - - def generate_header(self): header = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" header += " * VI Type: %s\n" % self.name @@ -612,17 +593,12 @@ class Object: header += "struct _esxVI_%s {\n" % self.name if self.features & Object.FEATURE__LIST: - string = " esxVI_%s *_next; " % self.name + header += aligned(" esxVI_%s *_next; " % self.name, "/* optional */\n") else: - string = " esxVI_%s *_unused; " % self.name - - while len(string) < 59: - string += " " - - header += string + "/* optional */\n" - - header += self.generate_struct_members(struct_gap = True) + header += aligned(" esxVI_%s *_unused; " % self.name, "/* optional */\n") + header += aligned(" esxVI_Type _type; ", "/* required */\n") + header += self.generate_struct_members(struct_gap=True) header += "};\n\n" # functions @@ -888,39 +864,28 @@ class Object: -class Enum: - FEATURE__ANY_TYPE = (1 << 1) - FEATURE__SERIALIZE = (1 << 2) - FEATURE__DESERIALIZE = (1 << 3) - def __init__(self, name, values, features = 0): - self.name = name - self.values = values - self.features = features | Enum.FEATURE__SERIALIZE | Enum.FEATURE__DESERIALIZE - def generate_typedef(self): - return "typedef enum _esxVI_%s esxVI_%s;\n" % (self.name, self.name) - def generate_typeenum(self): - return " esxVI_Type_%s,\n" % self.name - def generate_typetostring(self): - string = " case esxVI_Type_%s:\n" % self.name - string += " return \"%s\";\n\n" % self.name - return string - def generate_typefromstring(self): - string = " else if (STREQ(type, \"%s\")) {\n" % self.name - string += " return esxVI_Type_%s;\n" % self.name - string += " }\n" - return string +class Enum(Base): + FEATURE__ANY_TYPE = (1 << 1) + FEATURE__SERIALIZE = (1 << 2) + FEATURE__DESERIALIZE = (1 << 3) + + + def __init__(self, name, values, features=0): + Base.__init__(self, "enum", name) + self.values = values + self.features = features | Enum.FEATURE__SERIALIZE | Enum.FEATURE__DESERIALIZE def generate_header(self): @@ -1027,8 +992,8 @@ def parse_object(block): if items[2] not in valid_occurrences: report_error("line %d: invalid occurrence" % line[0]) - properties.append(Property(type = items[0], name = items[1], - occurrence = items[2])) + properties.append(Property(type=items[0], name=items[1], + occurrence=items[2])) return Object(name = name, extends = extends, properties = properties) @@ -1051,7 +1016,7 @@ def parse_enum(block): # expected format: <value> values.append(line[1]) - return Enum(name = name, values = values) + return Enum(name=name, values=values) @@ -1071,8 +1036,8 @@ def parse_method(block): if header_items[2] != "returns": report_error("line %d: invalid block header" % (number)) else: - returns = Parameter(type = header_items[3], name = "output", - occurrence = header_items[4]) + returns = Parameter(type=header_items[3], name="output", + occurrence=header_items[4]) parameters = [] @@ -1086,10 +1051,10 @@ def parse_method(block): if items[2] not in valid_occurrences: report_error("line %d: invalid occurrence" % line[0]) - parameters.append(Parameter(type = items[0], name = items[1], - occurrence = items[2])) + parameters.append(Parameter(type=items[0], name=items[1], + occurrence=items[2])) - return Method(name = name, parameters = parameters, returns = returns) + return Method(name=name, parameters=parameters, returns=returns) -- 1.7.0.4

On Sun, Apr 10, 2011 at 01:26:47PM +0200, Matthias Bolte wrote:
--- src/esx/esx_vi_generator.py | 177 +++++++++++++++++-------------------------- 1 files changed, 71 insertions(+), 106 deletions(-)
diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py index 3d068f3..622a34a 100755 --- a/src/esx/esx_vi_generator.py +++ b/src/esx/esx_vi_generator.py @@ -41,6 +41,11 @@ valid_occurrences = [OCCURRENCE__REQUIRED_ITEM,
+def aligned(left, right): + while len(left) < 59: + left += " " + + return left + right
crude but that works :-) for the generator it's fine, overall I'm not sure many understand that code beside you, ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

2011/4/12 Daniel Veillard <veillard@redhat.com>:
On Sun, Apr 10, 2011 at 01:26:47PM +0200, Matthias Bolte wrote:
--- src/esx/esx_vi_generator.py | 177 +++++++++++++++++-------------------------- 1 files changed, 71 insertions(+), 106 deletions(-)
diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py index 3d068f3..622a34a 100755 --- a/src/esx/esx_vi_generator.py +++ b/src/esx/esx_vi_generator.py @@ -41,6 +41,11 @@ valid_occurrences = [OCCURRENCE__REQUIRED_ITEM,
+def aligned(left, right): + while len(left) < 59: + left += " " + + return left + right
crude but that works :-) for the generator it's fine,
overall I'm not sure many understand that code beside you,
Well, probably. Actually I thing the code of the generator isn't that complex, but it missing documentation how it's working in general, that's true. It's somewhere on my todo list to improve the overall documentation of the ESX driver codebase.
ACK
Daniel
Thanks, pushed. Matthias
participants (2)
-
Daniel Veillard
-
Matthias Bolte