9fans.net/go@v0.0.5/draw/drawfcall/bit.go (about)

     1  package drawfcall // import "9fans.net/go/draw/drawfcall"
     2  
     3  // Note that these are big-endian, unlike Plan 9 fcalls, which are little-endian.
     4  
     5  func gbit8(b []byte) (uint8, []byte) {
     6  	return uint8(b[0]), b[1:]
     7  }
     8  
     9  func gbit16(b []byte) (uint16, []byte) {
    10  	return uint16(b[1]) | uint16(b[0])<<8, b[2:]
    11  }
    12  
    13  func gbit32(b []byte) (int, []byte) {
    14  	return int(uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24), b[4:]
    15  }
    16  
    17  func gbit64(b []byte) (uint64, []byte) {
    18  	hi, b := gbit32(b)
    19  	lo, b := gbit32(b)
    20  	return uint64(hi)<<32 | uint64(lo), b
    21  }
    22  
    23  func gstring(b []byte) (string, []byte) {
    24  	n, b := gbit32(b)
    25  	return string(b[0:n]), b[n:]
    26  }
    27  
    28  func gbytes(b []byte) ([]byte, []byte) {
    29  	n, b := gbit32(b)
    30  	return b[0:n], b[n:]
    31  }
    32  
    33  func pbit8(b []byte, x uint8) []byte {
    34  	n := len(b)
    35  	if n+1 > cap(b) {
    36  		nb := make([]byte, n, 100+2*cap(b))
    37  		copy(nb, b)
    38  		b = nb
    39  	}
    40  	b = b[0 : n+1]
    41  	b[n] = x
    42  	return b
    43  }
    44  
    45  func pbit16(b []byte, x uint16) []byte {
    46  	n := len(b)
    47  	if n+2 > cap(b) {
    48  		nb := make([]byte, n, 100+2*cap(b))
    49  		copy(nb, b)
    50  		b = nb
    51  	}
    52  	b = b[0 : n+2]
    53  	b[n] = byte(x >> 8)
    54  	b[n+1] = byte(x)
    55  	return b
    56  }
    57  
    58  func pbit32(b []byte, i int) []byte {
    59  	x := uint32(i)
    60  	n := len(b)
    61  	if n+4 > cap(b) {
    62  		nb := make([]byte, n, 100+2*cap(b))
    63  		copy(nb, b)
    64  		b = nb
    65  	}
    66  	b = b[0 : n+4]
    67  	b[n] = byte(x >> 24)
    68  	b[n+1] = byte(x >> 16)
    69  	b[n+2] = byte(x >> 8)
    70  	b[n+3] = byte(x)
    71  	return b
    72  }
    73  
    74  func pbit64(b []byte, x uint64) []byte {
    75  	b = pbit32(b, int(x>>32))
    76  	b = pbit32(b, int(x))
    77  	return b
    78  }
    79  
    80  func pstring(b []byte, s string) []byte {
    81  	b = pbit32(b, len(s))
    82  	b = append(b, []byte(s)...)
    83  	return b
    84  }
    85  
    86  func pbytes(b, s []byte) []byte {
    87  	b = pbit32(b, len(s))
    88  	b = append(b, s...)
    89  	return b
    90  }