From 16b95113bd94a4a722dad1edc55bde645d40dae0 Mon Sep 17 00:00:00 2001
From: Benjamin Pollack <benjamin@bitquabit.com>
Date: Mon, 20 Mar 2017 15:16:08 -0400
Subject: [PATCH] Fix the more egregious PEP-8 violations

---
 scripts/ud_itab.py   | 118 +++++++++++++++++++++----------------------
 scripts/ud_opcode.py |  73 +++++++++++---------------
 2 files changed, 86 insertions(+), 105 deletions(-)

diff --git a/scripts/ud_itab.py b/scripts/ud_itab.py
index 31d859e..63de355 100644
--- a/scripts/ud_itab.py
+++ b/scripts/ud_itab.py
@@ -195,8 +195,8 @@ class UdItabGenerator:
         "cast"     : "P_cast",
     }
 
-    MnemonicAliases = ( "invalid", "3dnow", "none", "db", "pause" )
-    
+    MnemonicAliases = ("invalid", "3dnow", "none", "db", "pause")
+
     def __init__(self, tables):
         self.tables = tables
         self._insnIndexMap, i = {}, 0
@@ -221,15 +221,15 @@ def getTableName(self, table):
     def genOpcodeTable(self, table, isGlobal=False):
         """Emit Opcode Table in C.
         """
-        self.ItabC.write( "\n" );
+        self.ItabC.write("\n")
         if not isGlobal:
             self.ItabC.write('static ')
-        self.ItabC.write( "const uint16_t %s[] = {\n" % self.getTableName(table))
+        self.ItabC.write("const uint16_t %s[] = {\n" % self.getTableName(table))
         for i in range(table.size()):
-            if i > 0 and i % 4 == 0: 
-                self.ItabC.write( "\n" )
+            if i > 0 and i % 4 == 0:
+                self.ItabC.write("\n")
             if i % 4 == 0:
-                self.ItabC.write( "  /* %2x */" % i)
+                self.ItabC.write("  /* %2x */" % i)
             e = table.entryAt(i)
             if e is None:
                 self.ItabC.write("%12s," % "INVALID")
@@ -237,35 +237,32 @@ def genOpcodeTable(self, table, isGlobal=False):
                 self.ItabC.write("%12s," % ("GROUP(%d)" % self.getTableIndex(e)))
             elif isinstance(e, UdInsnDef):
                 self.ItabC.write("%12s," % self.getInsnIndex(e))
-        self.ItabC.write( "\n" )
-        self.ItabC.write( "};\n" )
-
+        self.ItabC.write("\n")
+        self.ItabC.write("};\n")
 
     def genOpcodeTables(self):
         tables = self.tables.getTableList()
         for table in tables:
             self.genOpcodeTable(table, table is self.tables.root)
 
-
     def genOpcodeTablesLookupIndex(self):
-        self.ItabC.write( "\n\n"  );
-        self.ItabC.write( "struct ud_lookup_table_list_entry ud_lookup_table_list[] = {\n" )
+        self.ItabC.write("\n\n")
+        self.ItabC.write("struct ud_lookup_table_list_entry ud_lookup_table_list[] = {\n")
         for table in self.tables.getTableList():
             f0 = self.getTableName(table) + ","
             f1 = table.label() + ","
             f2 = "\"%s\"" % table.meta()
-            self.ItabC.write("    /* %03d */ { %s %s %s },\n" % 
+            self.ItabC.write("    /* %03d */ { %s %s %s },\n" %
                              (self.getTableIndex(table), f0, f1, f2))
-        self.ItabC.write( "};" )
+        self.ItabC.write("};")
 
-
-    def genInsnTable( self ):
-        self.ItabC.write( "struct ud_itab_entry ud_itab[] = {\n" );
+    def genInsnTable(self):
+        self.ItabC.write("struct ud_itab_entry ud_itab[] = {\n")
         for insn in self.tables.getInsnList():
-            opr_c = [ "O_NONE", "O_NONE", "O_NONE", "O_NONE" ]
+            opr_c = ["O_NONE", "O_NONE", "O_NONE", "O_NONE"]
             pfx_c = []
-            opr   = insn.operands
-            for i in range(len(opr)): 
+            opr = insn.operands
+            for i in range(len(opr)):
                 if not (opr[i] in self.OperandDict.keys()):
                     print("error: invalid operand declaration: %s\n" % opr[i])
                 opr_c[i] = "O_" + opr[i]
@@ -273,18 +270,17 @@ def genInsnTable( self ):
                                    opr_c[2] + ",", opr_c[3])
 
             for p in insn.prefixes:
-                if not ( p in self.PrefixDict.keys() ):
+                if not (p in self.PrefixDict.keys()):
                     print("error: invalid prefix specification: %s \n" % pfx)
-                pfx_c.append( self.PrefixDict[p] )
+                pfx_c.append(self.PrefixDict[p])
             if len(insn.prefixes) == 0:
-                pfx_c.append( "P_none" )
-            pfx = "|".join( pfx_c )
+                pfx_c.append("P_none")
+            pfx = "|".join(pfx_c)
 
-            self.ItabC.write( "  /* %04d */ { UD_I%s %s, %s },\n" \
-                        % ( self.getInsnIndex(insn), insn.mnemonic + ',', opr, pfx ) )
-        self.ItabC.write( "};\n" )
+            self.ItabC.write("  /* %04d */ { UD_I%s %s, %s },\n" \
+                             % (self.getInsnIndex(insn), insn.mnemonic + ',', opr, pfx))
+        self.ItabC.write("};\n")
 
-   
     def getMnemonicsList(self):
         mnemonics = self.tables.getMnemonicsList()
         mnemonics.extend(self.MnemonicAliases)
@@ -292,88 +288,88 @@ def getMnemonicsList(self):
 
     def genMnemonicsList(self):
         mnemonics = self.getMnemonicsList()
-        self.ItabC.write( "\n\n"  );
-        self.ItabC.write( "const char* ud_mnemonics_str[] = {\n    " )
-        self.ItabC.write( ",\n    ".join( [ "\"%s\"" % m for m in mnemonics ] ) )
-        self.ItabC.write( "\n};\n" )
- 
+        self.ItabC.write("\n\n")
+        self.ItabC.write("const char* ud_mnemonics_str[] = {\n    ")
+        self.ItabC.write(",\n    ".join(["\"%s\"" % m for m in mnemonics]))
+        self.ItabC.write("\n};\n")
 
-    def genItabH( self, filePath ):
-        self.ItabH = open( filePath, "w" )
+    def genItabH(self, filePath):
+        self.ItabH = open(filePath, "w")
 
         # Generate Table Type Enumeration
-        self.ItabH.write( "#ifndef UD_ITAB_H\n" )
-        self.ItabH.write( "#define UD_ITAB_H\n\n" )
+        self.ItabH.write("#ifndef UD_ITAB_H\n")
+        self.ItabH.write("#define UD_ITAB_H\n\n")
 
         self.ItabH.write("/* itab.h -- generated by udis86:scripts/ud_itab.py, do no edit */\n\n")
 
         # table type enumeration
-        self.ItabH.write( "/* ud_table_type -- lookup table types (see decode.c) */\n" )
-        self.ItabH.write( "enum ud_table_type {\n    " )
+        self.ItabH.write("/* ud_table_type -- lookup table types (see decode.c) */\n")
+        self.ItabH.write("enum ud_table_type {\n    ")
         enum = UdOpcodeTable.getLabels()
-        self.ItabH.write( ",\n    ".join( enum ) )
-        self.ItabH.write( "\n};\n\n" );
+        self.ItabH.write(",\n    ".join(enum))
+        self.ItabH.write("\n};\n\n")
 
         # mnemonic enumeration
-        self.ItabH.write( "/* ud_mnemonic -- mnemonic constants */\n" )
-        enum  = "enum ud_mnemonic_code {\n    "
-        enum += ",\n    ".join( [ "UD_I%s" % m for m in self.getMnemonicsList() ] )
+        self.ItabH.write("/* ud_mnemonic -- mnemonic constants */\n")
+        enum = "enum ud_mnemonic_code {\n    "
+        enum += ",\n    ".join(["UD_I%s" % m for m in self.getMnemonicsList()])
         enum += ",\n    UD_MAX_MNEMONIC_CODE"
         enum += "\n};\n"
-        self.ItabH.write( enum )
-        self.ItabH.write( "\n" )
+        self.ItabH.write(enum)
+        self.ItabH.write("\n")
 
-        self.ItabH.write( "extern const char * ud_mnemonics_str[];\n" )
+        self.ItabH.write("extern const char * ud_mnemonics_str[];\n")
 
-        self.ItabH.write( "\n#endif /* UD_ITAB_H */\n" )
-    
-        self.ItabH.close()
+        self.ItabH.write("\n#endif /* UD_ITAB_H */\n")
 
+        self.ItabH.close()
 
     def genItabC(self, filePath):
         self.ItabC = open(filePath, "w")
         self.ItabC.write("/* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit")
-        self.ItabC.write(" */\n");
-        self.ItabC.write("#include \"decode.h\"\n\n");
+        self.ItabC.write(" */\n")
+        self.ItabC.write("#include \"decode.h\"\n\n")
 
         self.ItabC.write("#define GROUP(n) (0x8000 | (n))\n")
         self.ItabC.write("#define INVALID  %d\n\n" % self.getInsnIndex(self.tables.invalidInsn))
 
-        self.genOpcodeTables() 
+        self.genOpcodeTables()
         self.genOpcodeTablesLookupIndex()
 
         #
         # Macros defining short-names for operands
         #
-        self.ItabC.write("\n\n/* itab entry operand definitions (for readability) */\n");
+        self.ItabC.write("\n\n/* itab entry operand definitions (for readability) */\n")
         operands = self.OperandDict.keys()
         operands = sorted(operands)
         for o in operands:
             self.ItabC.write("#define O_%-7s { %-12s %-8s }\n" %
-                    (o, self.OperandDict[o][0] + ",", self.OperandDict[o][1]));
-        self.ItabC.write("\n");
+                             (o, self.OperandDict[o][0] + ",", self.OperandDict[o][1]))
+        self.ItabC.write("\n")
 
         self.genInsnTable()
         self.genMnemonicsList()
 
         self.ItabC.close()
 
-    def genItab( self, location ):
+    def genItab(self, location):
         self.genItabC(os.path.join(location, "itab.c"))
         self.genItabH(os.path.join(location, "itab.h"))
 
+
 def usage():
     print("usage: ud_itab.py <optable.xml> <output-path>")
 
-def main():
 
+def main():
     if len(sys.argv) != 3:
         usage()
         sys.exit(1)
-    
+
     tables = UdOpcodeTables(xml=sys.argv[1])
-    itab   = UdItabGenerator(tables)
+    itab = UdItabGenerator(tables)
     itab.genItab(sys.argv[2])
 
+
 if __name__ == '__main__':
     main()
diff --git a/scripts/ud_opcode.py b/scripts/ud_opcode.py
index fe1833d..4495883 100644
--- a/scripts/ud_opcode.py
+++ b/scripts/ud_opcode.py
@@ -52,7 +52,6 @@ def lookupPrefix(self, pfx):
         """Lookup prefix (if any, None otherwise), by name"""
         return True if pfx in self.prefixes else None
 
-
     @property
     def vendor(self):
         return self._opcexts.get('/vendor', None)
@@ -87,9 +86,9 @@ class IndexError(Exception):
 
     @classmethod
     def vendor2idx(cls, v):
-        return (0 if v == 'amd' 
-                  else (1 if v == 'intel'
-                          else 2))
+        return (0 if v == 'amd'
+                else (1 if v == 'intel'
+                      else 2))
 
     @classmethod
     def vex2idx(cls, v):
@@ -166,13 +165,11 @@ def vex2idx(cls, v):
         '/vexl'     : { 'label' : 'UD_TAB__OPC_VEX_L',   'size' : 2 },
     }
 
-
     def __init__(self, typ):
         assert typ in self._TableInfo
-        self._typ     = typ
+        self._typ = typ
         self._entries = {}
 
-
     def size(self):
         return self._TableInfo[self._typ]['size']
 
@@ -191,11 +188,9 @@ def typ(self):
     def meta(self):
         return self._typ
 
-
     def __str__(self):
         return "table-%s" % self._typ
 
-
     def add(self, opc, obj):
         typ = UdOpcodeTable.getOpcodeTyp(opc)
         idx = UdOpcodeTable.getOpcodeIdx(opc)
@@ -203,7 +198,6 @@ def add(self, opc, obj):
             raise CollisionError()
         self._entries[idx] = obj
 
-
     def lookup(self, opc):
         typ = UdOpcodeTable.getOpcodeTyp(opc)
         idx = UdOpcodeTable.getOpcodeIdx(opc)
@@ -211,7 +205,6 @@ def lookup(self, opc):
             raise UdOpcodeTable.CollisionError("%s <-> %s" % (self._typ, typ))
         return self._entries.get(idx, None)
 
-    
     def entryAt(self, index):
         """Returns the entry at a given index of the table,
            None if there is none. Raises an exception if the
@@ -234,7 +227,6 @@ def getOpcodeTyp(cls, opc):
         else:
             return 'opctbl'
 
-
     @classmethod
     def getOpcodeIdx(cls, opc):
         if opc.startswith('/'):
@@ -244,7 +236,6 @@ def getOpcodeIdx(cls, opc):
             # plain opctbl opcode
             return int(opc, 16)
 
-
     @classmethod
     def getLabels(cls):
         """Returns a list of all labels"""
@@ -282,7 +273,7 @@ def walk(self, tbl, opcodes):
            to walk, the object at the leaf otherwise.
         """
         opc = opcodes[0]
-        e   = tbl.lookup(opc)
+        e = tbl.lookup(opc)
         if e is None:
             return None
         elif isinstance(e, UdOpcodeTable) and len(opcodes[1:]):
@@ -295,7 +286,7 @@ def map(self, tbl, opcodes, obj):
            needed.
         """
         opc = opcodes[0]
-        e   =  tbl.lookup(opc)
+        e = tbl.lookup(opc)
         if e is None:
             tbl.add(opc, self.mkTrie(opcodes[1:], obj))
         else:
@@ -304,16 +295,16 @@ def map(self, tbl, opcodes, obj):
             self.map(e, opcodes[1:], obj)
 
     def __init__(self, xml):
-        self._tables    = []
-        self._insns     = []
+        self._tables = []
+        self._insns = []
         self._mnemonics = {}
 
         # The root table is always a 256 entry opctbl, indexed
         # by a plain opcode byte
-        self.root       = self.newTable('opctbl')
+        self.root = self.newTable('opctbl')
 
         if os.getenv("UD_OPCODE_DEBUG"):
-            self._logFh     = open("opcodeTables.log", "w")
+            self._logFh = open("opcodeTables.log", "w")
 
         # add an invalid instruction entry without any mapping
         # in the opcode tables.
@@ -333,7 +324,6 @@ def log(self, s):
         if os.getenv("UD_OPCODE_DEBUG"):
             self._logFh.write(s + "\n")
 
-
     def mergeSSENONE(self):
         """Merge sse tables with only one entry for /sse=none
         """
@@ -345,6 +335,7 @@ def mergeSSENONE(self):
                         if sse:
                             table.setEntryAt(k, sse)
         uniqTables = {}
+
         def genTableList(tbl):
             if tbl not in uniqTables:
                 self._tables.append(tbl)
@@ -352,9 +343,9 @@ def genTableList(tbl):
             for k, e in tbl.entries():
                 if isinstance(e, UdOpcodeTable):
                     genTableList(e)
+
         self._tables = []
         genTableList(self.root)
-                
 
     def patchAvx2byte(self):
         # create avx tables
@@ -371,7 +362,6 @@ def patchAvx2byte(self):
                 table = self.walk(self.root, ('c4', '/vex=' + vex))
                 self.map(self.root, ('c5', '/vex=' + vex), table)
 
-
     def addInsn(self, **insnDef):
 
         # Canonicalize opcode list
@@ -409,14 +399,13 @@ def addInsn(self, **insnDef):
         self._insns.append(insn)
         # add to lookup by mnemonic structure
         if insn.mnemonic not in self._mnemonics:
-            self._mnemonics[insn.mnemonic] = [ insn ]
+            self._mnemonics[insn.mnemonic] = [insn]
         else:
             self._mnemonics[insn.mnemonic].append(insn)
 
-
     def addInsnDef(self, insnDef):
-        opcodes  = []
-        opcexts  = {}
+        opcodes = []
+        opcexts = {}
 
         # pack plain opcodes first, and collect opcode
         # extensions
@@ -454,7 +443,7 @@ def addInsnDef(self, insnDef):
             # Construct a long-form definition of the avx instruction
             opcodes.insert(0, 'c4')
         elif (opcodes[0] == '0f' and opcodes[1] != '0f' and
-            '/sse' not in opcexts):
+                      '/sse' not in opcexts):
             # Make all 2-byte opcode form isntructions play nice with sse
             # opcode maps.
             opcexts['/sse'] = 'none'
@@ -471,7 +460,6 @@ def addInsnDef(self, insnDef):
            operands = insnDef['operands'],
            cpuid    = insnDef['cpuid'])
 
-
     def addSSE2AVXInsn(self, **insnDef):
         """Add an instruction definition containing an avx cpuid bit, but
            declared in its legacy SSE form. The function splits the
@@ -481,20 +469,20 @@ def addSSE2AVXInsn(self, **insnDef):
 
         # SSE
         ssemnemonic = insnDef['mnemonic']
-        sseopcodes  = insnDef['opcodes']
+        sseopcodes = insnDef['opcodes']
         # remove vex opcode extensions
-        sseopcexts  = dict([(e, v) for e, v in itemslist(insnDef['opcexts'])
-                                  if not e.startswith('/vex')])
+        sseopcexts = dict([(e, v) for e, v in itemslist(insnDef['opcexts'])
+                           if not e.startswith('/vex')])
         # strip out avx operands, preserving relative ordering
         # of remaining operands
         sseoperands = [opr for opr in insnDef['operands']
-                        if opr not in ('H', 'L')]
+                       if opr not in ('H', 'L')]
         # strip out avx prefixes
         sseprefixes = [pfx for pfx in insnDef['prefixes']
-                        if not pfx.startswith('vex')]
+                       if not pfx.startswith('vex')]
         # strip out avx bits from cpuid
-        ssecpuid    = [flag for flag in insnDef['cpuid']
-                        if not flag.startswith('avx')]
+        ssecpuid = [flag for flag in insnDef['cpuid']
+                    if not flag.startswith('avx')]
 
         self.addInsn(mnemonic = ssemnemonic,
                      prefixes = sseprefixes,
@@ -521,8 +509,8 @@ def addSSE2AVXInsn(self, **insnDef):
             if o in ('V', 'W', 'H', 'U'):
                 o = o + 'x'
             vexoperands.append(o)
-        vexcpuid    = [flag for flag in insnDef['cpuid']
-                        if not flag.startswith('sse')]
+        vexcpuid = [flag for flag in insnDef['cpuid']
+                    if not flag.startswith('sse')]
 
         self.addInsn(mnemonic = vexmnemonic,
                      prefixes = vexprefixes,
@@ -535,7 +523,6 @@ def getInsnList(self):
         """Returns a list of all instructions in the collection"""
         return self._insns
 
-
     def getTableList(self):
         """Returns a list of all tables in the collection"""
         return self._tables
@@ -544,7 +531,6 @@ def getMnemonicsList(self):
         """Returns a sorted list of mnemonics"""
         return sorted(self._mnemonics.keys())
 
-
     def pprint(self):
         def printWalk(tbl, indent=""):
             entries = tbl.entries()
@@ -554,8 +540,8 @@ def printWalk(tbl, indent=""):
                     printWalk(e, indent + "    |")
                 elif isinstance(e, UdInsnDef):
                     self.log("%s    |-<%02x> %s" % (indent, k, e))
-        printWalk(self.root)
 
+        printWalk(self.root)
 
     def printStats(self):
         tables = self.getTableList()
@@ -574,7 +560,6 @@ def printStats(self):
 
         self.pprint()
 
-
     @staticmethod
     def parseOptableXML(xml):
         """Parse udis86 optable.xml file and return list of
@@ -584,9 +569,9 @@ def parseOptableXML(xml):
 
         xmlDoc = minidom.parse(xml)
         tlNode = xmlDoc.firstChild
-        insns  = []
+        insns = []
 
-        while tlNode and tlNode.localName != "x86optable": 
+        while tlNode and tlNode.localName != "x86optable":
             tlNode = tlNode.nextSibling
 
         for insnNode in tlNode.childNodes:
@@ -605,7 +590,7 @@ def parseOptableXML(xml):
 
             for node in insnNode.childNodes:
                 if node.localName == 'def':
-                    insnDef = { 'pfx' : [] }
+                    insnDef = {'pfx': []}
                     for node in node.childNodes:
                         if not node.localName:
                             continue
