github.com/bodgit/sevenzip@v1.5.1/internal/bra/sparc.go (about) 1 package bra 2 3 import ( 4 "encoding/binary" 5 "io" 6 ) 7 8 const sparcAlignment = 4 9 10 type sparc struct { 11 ip uint32 12 } 13 14 func (c *sparc) Size() int { return sparcAlignment } 15 16 func (c *sparc) 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) & ^(sparcAlignment-1); i += sparcAlignment { 24 v := binary.BigEndian.Uint32(b[i:]) 25 26 if (b[i+0] == 0x40 && b[i+1]&0xc0 == 0) || (b[i+0] == 0x7f && b[i+1] >= 0xc0) { 27 v <<= 2 28 29 if encoding { 30 v += c.ip 31 } else { 32 v -= c.ip 33 } 34 35 v &= 0x01ffffff 36 v -= uint32(1) << 24 37 v ^= 0xff000000 38 v >>= 2 39 v |= 0x40000000 40 } 41 42 c.ip += uint32(sparcAlignment) 43 44 binary.BigEndian.PutUint32(b[i:], v) 45 } 46 47 return i 48 } 49 50 // NewSPARCReader returns a new SPARC io.ReadCloser. 51 func NewSPARCReader(_ []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, error) { 52 return newReader(readers, new(sparc)) 53 }