Exemplo n.º 1
0
def mergeTransitions(headerList, headers):
    mergedHeaderList = []
    remapHdrs = {}
    for hdr in headerList:
        origHdrName = hdr.name
        if hdr.nextHeader:
            pos = 1
            while isinstance(hdr.nextHeader, str):
                nextHdr = headers[hdr.nextHeader]

                mergedHeader = Header('%s+%s' % (hdr.name, nextHdr.name))
                for field in hdr.fieldList:
                    mergedHeader.addField(field.name, field.width)
                for field in nextHdr.fieldList:
                    mergedHeader.addField('%d-%s' % (pos, field.name), field.width)

                for field in hdr.pseudofieldList:
                    mergedHeader.addPseudofield(field.name, field.width)
                for field in nextHdr.pseudofieldList:
                    mergedHeader.addPseudofield('%d-%s' % (pos, field.name), field.width)

                mergedHeader.nextHeader = nextHdr.nextHeader
                if isinstance(mergedHeader.nextHeader, tuple):
                    mergedHeader.nextHeader = copy.deepcopy(mergedHeader.nextHeader)
                    from_fields = mergedHeader.nextHeader[0]
                    for i in xrange(len(from_fields)):
                        from_fields[i] = '%d-%s' % (pos, from_fields[i])
                    #print from_fields

                if hdr.getRefCount() and nextHdr.getRefCount():
                    print "Headers being merged both have a reference count. Exiting..."
                    sys.exit(-1)
                elif hdr.getRefCount():
                    mergedHeader.setRefCount(hdr.getRefCount())
                else:
                    mergedHeader.setRefCount(nextHdr.getRefCount())

                if hdr.calcLength:
                    print "First header being merged has a calculated length. Unable to merge..."
                    sys.exit(-1)
                elif nextHdr.calcLength:
                    newExp = [hdr.length()[0], '+'] + nextHdr.calcLength
                    for i in xrange(len(newExp)):
                        if isinstance(newExp[i], str) and not opRE.match(newExp[i]):
                            newExp[i] = '%d-%s' % (pos, newExp[i])
                    mergedHeader.setCalcLength(newExp)

                if hdr.maxLength:
                    print "First header being merged has a max length. Unable to merge..."
                    sys.exit(-1)
                elif nextHdr.maxLength:
                    mergedHeader.setMaxLength(hdr.length()[0] + nextHdr.maxLength)

                remapHdrs[origHdrName] = mergedHeader.name
                hdr = mergedHeader
                headers[hdr.name] = hdr
                pos += 1

        mergedHeaderList.append(hdr)

    # Update references to the new headers
    for hdr in mergedHeaderList:
        if hdr.nextHeader:
            if isinstance(hdr.nextHeader, tuple):
                hdrList = hdr.nextHeader[1]
                for i in xrange(len(hdrList)):
                    nxtHdrName = hdrList[i][1]
                    if nxtHdrName in remapHdrs:
                        hdrList[i] = (hdrList[i][0], remapHdrs[nxtHdrName])

    return mergedHeaderList
Exemplo n.º 2
0
def mergeTransitions(headerList, headers):
    mergedHeaderList = []
    remapHdrs = {}
    for hdr in headerList:
        origHdrName = hdr.name
        if hdr.nextHeader:
            pos = 1
            while isinstance(hdr.nextHeader, str):
                nextHdr = headers[hdr.nextHeader]

                mergedHeader = Header('%s+%s' % (hdr.name, nextHdr.name))
                for field in hdr.fieldList:
                    mergedHeader.addField(field.name, field.width)
                for field in nextHdr.fieldList:
                    mergedHeader.addField('%d-%s' % (pos, field.name),
                                          field.width)

                for field in hdr.pseudofieldList:
                    mergedHeader.addPseudofield(field.name, field.width)
                for field in nextHdr.pseudofieldList:
                    mergedHeader.addPseudofield('%d-%s' % (pos, field.name),
                                                field.width)

                mergedHeader.nextHeader = nextHdr.nextHeader
                if isinstance(mergedHeader.nextHeader, tuple):
                    mergedHeader.nextHeader = copy.deepcopy(
                        mergedHeader.nextHeader)
                    from_fields = mergedHeader.nextHeader[0]
                    for i in xrange(len(from_fields)):
                        from_fields[i] = '%d-%s' % (pos, from_fields[i])
                    #print from_fields

                if hdr.getRefCount() and nextHdr.getRefCount():
                    print "Headers being merged both have a reference count. Exiting..."
                    sys.exit(-1)
                elif hdr.getRefCount():
                    mergedHeader.setRefCount(hdr.getRefCount())
                else:
                    mergedHeader.setRefCount(nextHdr.getRefCount())

                if hdr.calcLength:
                    print "First header being merged has a calculated length. Unable to merge..."
                    sys.exit(-1)
                elif nextHdr.calcLength:
                    newExp = [hdr.length()[0], '+'] + nextHdr.calcLength
                    for i in xrange(len(newExp)):
                        if isinstance(newExp[i],
                                      str) and not opRE.match(newExp[i]):
                            newExp[i] = '%d-%s' % (pos, newExp[i])
                    mergedHeader.setCalcLength(newExp)

                if hdr.maxLength:
                    print "First header being merged has a max length. Unable to merge..."
                    sys.exit(-1)
                elif nextHdr.maxLength:
                    mergedHeader.setMaxLength(hdr.length()[0] +
                                              nextHdr.maxLength)

                remapHdrs[origHdrName] = mergedHeader.name
                hdr = mergedHeader
                headers[hdr.name] = hdr
                pos += 1

        mergedHeaderList.append(hdr)

    # Update references to the new headers
    for hdr in mergedHeaderList:
        if hdr.nextHeader:
            if isinstance(hdr.nextHeader, tuple):
                hdrList = hdr.nextHeader[1]
                for i in xrange(len(hdrList)):
                    nxtHdrName = hdrList[i][1]
                    if nxtHdrName in remapHdrs:
                        hdrList[i] = (hdrList[i][0], remapHdrs[nxtHdrName])

    return mergedHeaderList