def table_header(self, outfd, title_format_list = None): """Table header renders the title row of a table This also stores the header types to ensure everything is formatted appropriately. It must be a list of tuples rather than a dict for ordering purposes. """ titles = [] rules = [] self._formatlist = [] profile = addrspace.BufferAddressSpace(self._config).profile for (k, v) in title_format_list: spec = fmtspec.FormatSpec(self._formatlookup(profile, v)) # If spec.minwidth = -1, this field is unbounded length if spec.minwidth != -1: spec.minwidth = max(spec.minwidth, len(k)) # Get the title specification to follow the alignment of the field titlespec = fmtspec.FormatSpec(formtype = 's', minwidth = max(spec.minwidth, len(k))) titlespec.align = spec.align if spec.align in "<>^" else "<" # Add this to the titles, rules, and formatspecs lists titles.append(("{0:" + titlespec.to_string() + "}").format(k)) rules.append("-" * titlespec.minwidth) self._formatlist.append(spec) # Write out the titles and line rules if outfd: outfd.write(self.tablesep.join(titles) + "\n") outfd.write(self.tablesep.join(rules) + "\n")
def __format__(self, formatspec): spec = fmtspec.FormatSpec(string=formatspec, altform=False, formtype='s', fill="-", align=">") return format('-', str(spec))
def _formatlookup(self, profile, code): """Code to turn profile specific values into format specifications""" code = code or "" if not code.startswith('['): return code # Strip off the square brackets code = code[1:-1].lower() if code.startswith('addr'): spec = fmtspec.FormatSpec("#10x") if profile.metadata.get('memory_model', '32bit') == '64bit': spec.minwidth += 8 if 'pad' in code: spec.fill = "0" spec.align = spec.align if spec.align else "=" else: # Non-padded addresses will come out as numbers, # so titles should align > spec.align = ">" return spec.to_string() # Something went wrong debug.warning("Unknown table format specification: " + code) return ""