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 }