github.com/bodgit/sevenzip@v1.5.1/internal/bra/ppc.go (about)

     1  package bra
     2  
     3  import (
     4  	"encoding/binary"
     5  	"io"
     6  )
     7  
     8  const ppcAlignment = 4
     9  
    10  type ppc struct {
    11  	ip uint32
    12  }
    13  
    14  func (c *ppc) Size() int { return ppcAlignment }
    15  
    16  func (c *ppc) Convert(b []byte, encoding bool) int {
    17  	if len(b) < c.Size() {
    18  		return 0
    19  	}
    20  
    21  	var i int
    22  
    23  	for i = 0; i < len(b) & ^(ppcAlignment-1); i += ppcAlignment {
    24  		v := binary.BigEndian.Uint32(b[i:])
    25  
    26  		if b[i+0]&0xfc == 0x48 && b[i+3]&3 == 1 {
    27  			if encoding {
    28  				v += c.ip
    29  			} else {
    30  				v -= c.ip
    31  			}
    32  
    33  			v &= 0x03ffffff
    34  			v |= 0x48000000
    35  		}
    36  
    37  		c.ip += uint32(ppcAlignment)
    38  
    39  		binary.BigEndian.PutUint32(b[i:], v)
    40  	}
    41  
    42  	return i
    43  }
    44  
    45  // NewPPCReader returns a new PPC io.ReadCloser.
    46  func NewPPCReader(_ []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, error) {
    47  	return newReader(readers, new(ppc))
    48  }