Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
 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))
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
    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)