binary.go raw

   1  package wasm
   2  
   3  import (
   4  	"encoding/binary"
   5  	"io"
   6  )
   7  
   8  func read(r io.Reader, v interface{}) error {
   9  	return binary.Read(r, binary.LittleEndian, v)
  10  }
  11  
  12  func readByte(r io.Reader) (byte, error) {
  13  	b := make([]byte, 1)
  14  	if _, err := r.Read(b); err != nil {
  15  		return 0, err
  16  	}
  17  	return b[0], nil
  18  }
  19  
  20  func readUntil(r io.Reader, delim byte, v *[]byte) error {
  21  	for {
  22  		b, err := readByte(r)
  23  		if err != nil {
  24  			return err
  25  		}
  26  		*v = append(*v, b)
  27  		if b == byte(delim) {
  28  			break
  29  		}
  30  	}
  31  	return nil
  32  }
  33  
  34  func readVarUint1(r io.Reader, v *uint8) error {
  35  	return read(r, v)
  36  }
  37  
  38  func readVarUint7(r io.Reader, v *uint8) error {
  39  	return read(r, v)
  40  }
  41  
  42  func readVarUint32(r io.Reader, v *uint32) error {
  43  	var shift uint32
  44  	for {
  45  		b, err := readByte(r)
  46  		if err != nil {
  47  			return err
  48  		}
  49  		*v |= uint32(b&0x7F) << shift
  50  		if (b & 0x80) == 0 {
  51  			break
  52  		}
  53  		shift += 7
  54  	}
  55  
  56  	return nil
  57  }
  58  
  59  func readVarUint64(r io.Reader, v *uint64) error {
  60  	var shift uint32
  61  	for {
  62  		b, err := readByte(r)
  63  		if err != nil {
  64  			return err
  65  		}
  66  		*v |= uint64(b&0x7F) << shift
  67  		if (b & 0x80) == 0 {
  68  			break
  69  		}
  70  		shift += 7
  71  	}
  72  
  73  	return nil
  74  }
  75  
  76  func readVarInt7(r io.Reader, v *int8) error {
  77  	if err := read(r, v); err != nil {
  78  		return err
  79  	}
  80  	*v &= 0x7F
  81  	return nil
  82  }
  83  
  84  func readVarInt32(r io.Reader, v *int32) error {
  85  	var shift uint32
  86  	for {
  87  		b, err := readByte(r)
  88  		if err != nil {
  89  			return err
  90  		}
  91  		*v |= int32(b&0x7F) << shift
  92  		if (b & 0x80) == 0 {
  93  			break
  94  		}
  95  		shift += 7
  96  	}
  97  
  98  	return nil
  99  }
 100  
 101  // varUint32Size returns the size in bytes of a varuint32
 102  func varUint32Size(v uint32) int {
 103  	s := 0
 104  	for v > 0 {
 105  		s++
 106  		v = v >> 8
 107  	}
 108  	return s
 109  }
 110  
 111  func readString(r io.Reader, result *string) error {
 112  	var stringLen uint32
 113  	if err := readVarUint32(r, &stringLen); err != nil {
 114  		return err
 115  	}
 116  	stringBytes := make([]byte, stringLen)
 117  	if err := read(r, stringBytes); err != nil {
 118  		return err
 119  	}
 120  	*result = string(stringBytes)
 121  	return nil
 122  }
 123