def __init__(self, stmt, CP): self.ascii = [] self.ebcdic = [] self.name = stmt.ID for parm in stmt.parms: ptyp = parm.typ.upper() if len(parm.attr) != 2: raise sopl.SOPLError(loc=parm.source,\ msg="characters statement parameter requires two attributes: %s" \ % len(parm.attr)) name = parm.attr[0] point = parm.attr[1] try: pvalue = int(point, 16) except IndexError: raise sopl.SOPLError(loc=parm.source,\ msg="characters parameter code point not hexadecimal value: '%s'" % point) if pvalue < 0 or pvalue > 255: raise sopl.SOPLError(loc=parm.source,\ msg="code point value out of range (0-255): '%s'" % pvalue) tup = (name, pvalue) if ptyp == "A": self.ascii.append(tup) elif ptyp == "E": self.ebcdic.append(tup)
def __init__(self, stmt, CP): self.name = stmt.ID self.chars = {} # Maps a code point name to its integer value self.cbytes = {} # Maps code point integer value to code point name if len(stmt.attr) != 1: raise sopl.SOPLError(loc=stmt.source,\ msg="codepage statement requires one attribute: %s" % len(stmt.attr[0])) cset = stmt.attr[0].upper() if cset not in ["ASCII", "EBCDIC"]: raise sopl.SOPLError(loc=stmt.source,\ msg="codepage statement attribute unrecognized: '%s'" % cset) self.cset = cset for parm in stmt.parms: for s in parm.attr: try: lsto = CP.clists[s] except KeyError: raise sopl.SOPLError(loc=stmt.source,\ msg="codepage chars parameter character list undefiend: '%s'" \ % s) if cset == "ASCII": lst = lsto.ascii else: lst = lsto.ebcdic for point, cbyte in lst: self.__char(point, cbyte, stmt.source)
def __find_codepage(self, parm, typ): cp = parm.attr[0] try: return (cp, self.cp.codepages[cp]) except KeyError: raise sopl.SOPLError(loc=parm.source,\ msg="translation %s parameter code page undefined: '%s'"\ % (parm.ID,cp))
def __process_dump(self, parm, output, limit): attr = parm.attr attrs = len(attr) if attrs < 2 or attrs > 3: raise sopl.SOPLError(loc=parm.source,\ msg="translation statement %s parameter requires 2 or 3 " "attributes: %s" % (parm.typ,attrs)) fillchar = attr[0] primary = attr[1] merge = False if attrs == 3: if attr[2] == "merge": merge = True else: raise sopl.SOPLError(loc=parm.source,\ msg="translation statement %s parameter unrecognized: '%s'" \ % (parm.typ,attr[2])) dump = BinDump(fillchar, output, primary.upper(), limit, merge=merge) return dump
def build(self, trans="94C", filename=None, fail=False): if filename is None: self.multiline(default, fail=fail) else: self.recognize(filename, fail=fail) self.__process() try: return self.__translator(name=trans) except KeyError: raise sopl.SOPLError(msg="requested translation not defined: '%s'" \ % trans) from None
def __char(self, point, cbyte, loc): if not isinstance(point, str): cls_str = "codepage.py - %s.char() -" % self.__class__.__name__ raise ValueError("%s 'point' argument must be a string: %s" \ % (cls_str,point)) if not isinstance(cbyte, int): cls_str = "codepage.py - %s.char() -" % self.__class__.__name__ raise ValueError("%s 'cbyte' argument must be an integer: %s" \ % (cls_str,cbyte)) try: self.chars[point] raise sopl.SOPLError(loc=loc,\ msg="code point name must be unique: %s" % point) except KeyError: pass try: self.cbytes[cbyte] raise sopl.SOPLError(loc=loc,\ msg="code point value must be unique: %s" % hex(cbyte)) except KeyError: pass self.chars[point] = cbyte self.cbytes[cbyte] = point
def __init__(self, stmt, CP): self.name = stmt.ID # Translation ID self.ascii_parm = None # ascii parameter Parm object self.ebcdic_parm = None # ebcdic parameter Parm object self.dumpa_parm = None # dumpa parameter Parm object self.dumpe_parm = None # dumpe parmeter Parm object self.cp = CP # CODEPAGE object # ascii parameter values self.ascii = None # ASCII code page name self.asciicp = None # ASCII CodePage object # ebcdic parameter values self.ebcdic = None # EBCDIC code page name self.ebcdiccp = None # EBCDIC CodePage object # Dump parameter values self.dumpa = None self.dumpe = None # Attributes used by display() method and built by __tmap() method self.tmaps = {} # TMap objects are stored here by character id self.rtmaps = {} # Reverse TMaps are stored here self.max_char = 0 # Maximum length of character names for parm in stmt.parms: parmid = parm.typ if parmid == "ascii": if len(parm.attr) != 1: raise sopl.SOPLError(loc=parm.source,\ msg="translation %s parameter requires one attribute: %s" \ % (parmid,len(parm.attr))) self.ascii_parm = parm self.ascii, self.asciicp = self.__find_codepage(parm, CP) elif parmid == "ebcdic": if len(parm.attr) != 1: raise sopl.SOPLError(loc=parm.source,\ msg="translation %s parameter requires one attribute: %s" \ % (parmid,len(parm.attr))) self.ebcdic_parm = parm self.ebcdic, self.ebcdiccp = self.__find_codepage(parm, CP) elif parmid == "dumpa": self.dumpa_parm = parm self.dumpa = self.__process_dump(parm, "ASCII", 0x20) elif parmid == "dumpe": self.dumpe_parm = parm self.dumpe = self.__process_dump(parm, "EBCDIC", 0x40) else: cls_str = "codepage.py - %s.__init__() -" % self.__class__.__name__ raise ValueError("%s unexpected parameter ID: %s" % (cls_str, parm.ID)) # Make sure all of the translation parameters have been specified if self.ascii is None: raise sopl.SOPLError(loc=stmt.source,\ msg="translation statement required ascii parameter missing") if self.ebcdic is None: raise sopl.SOPLError(loc=stmt.source,\ msg="translation statement required ebcdic parameter missing") if self.dumpa is None: raise sopl.SOPLError(loc=stmt.source,\ msg="translation statement required dumpa parameter missing") if self.dumpe is None: raise sopl.SOPLError(loc=stmt.source,\ msg="translation statement required dumpa parameter missing") self.dumpa.select(self.asciicp, self.ebcdiccp) self.dumpe.select(self.asciicp, self.ebcdiccp)