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  }