1package msgp 2 3/* ---------------------------------- 4 integer encoding utilities 5 (inline-able) 6 7 TODO(tinylib): there are faster, 8 albeit non-portable solutions 9 to the code below. implement 10 byteswap? 11 ---------------------------------- */ 12 13func putMint64(b []byte, i int64) { 14 b[0] = mint64 15 b[1] = byte(i >> 56) 16 b[2] = byte(i >> 48) 17 b[3] = byte(i >> 40) 18 b[4] = byte(i >> 32) 19 b[5] = byte(i >> 24) 20 b[6] = byte(i >> 16) 21 b[7] = byte(i >> 8) 22 b[8] = byte(i) 23} 24 25func getMint64(b []byte) int64 { 26 return (int64(b[1]) << 56) | (int64(b[2]) << 48) | 27 (int64(b[3]) << 40) | (int64(b[4]) << 32) | 28 (int64(b[5]) << 24) | (int64(b[6]) << 16) | 29 (int64(b[7]) << 8) | (int64(b[8])) 30} 31 32func putMint32(b []byte, i int32) { 33 b[0] = mint32 34 b[1] = byte(i >> 24) 35 b[2] = byte(i >> 16) 36 b[3] = byte(i >> 8) 37 b[4] = byte(i) 38} 39 40func getMint32(b []byte) int32 { 41 return (int32(b[1]) << 24) | (int32(b[2]) << 16) | (int32(b[3]) << 8) | (int32(b[4])) 42} 43 44func putMint16(b []byte, i int16) { 45 b[0] = mint16 46 b[1] = byte(i >> 8) 47 b[2] = byte(i) 48} 49 50func getMint16(b []byte) (i int16) { 51 return (int16(b[1]) << 8) | int16(b[2]) 52} 53 54func putMint8(b []byte, i int8) { 55 b[0] = mint8 56 b[1] = byte(i) 57} 58 59func getMint8(b []byte) (i int8) { 60 return int8(b[1]) 61} 62 63func putMuint64(b []byte, u uint64) { 64 b[0] = muint64 65 b[1] = byte(u >> 56) 66 b[2] = byte(u >> 48) 67 b[3] = byte(u >> 40) 68 b[4] = byte(u >> 32) 69 b[5] = byte(u >> 24) 70 b[6] = byte(u >> 16) 71 b[7] = byte(u >> 8) 72 b[8] = byte(u) 73} 74 75func getMuint64(b []byte) uint64 { 76 return (uint64(b[1]) << 56) | (uint64(b[2]) << 48) | 77 (uint64(b[3]) << 40) | (uint64(b[4]) << 32) | 78 (uint64(b[5]) << 24) | (uint64(b[6]) << 16) | 79 (uint64(b[7]) << 8) | (uint64(b[8])) 80} 81 82func putMuint32(b []byte, u uint32) { 83 b[0] = muint32 84 b[1] = byte(u >> 24) 85 b[2] = byte(u >> 16) 86 b[3] = byte(u >> 8) 87 b[4] = byte(u) 88} 89 90func getMuint32(b []byte) uint32 { 91 return (uint32(b[1]) << 24) | (uint32(b[2]) << 16) | (uint32(b[3]) << 8) | (uint32(b[4])) 92} 93 94func putMuint16(b []byte, u uint16) { 95 b[0] = muint16 96 b[1] = byte(u >> 8) 97 b[2] = byte(u) 98} 99 100func getMuint16(b []byte) uint16 { 101 return (uint16(b[1]) << 8) | uint16(b[2]) 102} 103 104func putMuint8(b []byte, u uint8) { 105 b[0] = muint8 106 b[1] = byte(u) 107} 108 109func getMuint8(b []byte) uint8 { 110 return uint8(b[1]) 111} 112 113func getUnix(b []byte) (sec int64, nsec int32) { 114 sec = (int64(b[0]) << 56) | (int64(b[1]) << 48) | 115 (int64(b[2]) << 40) | (int64(b[3]) << 32) | 116 (int64(b[4]) << 24) | (int64(b[5]) << 16) | 117 (int64(b[6]) << 8) | (int64(b[7])) 118 119 nsec = (int32(b[8]) << 24) | (int32(b[9]) << 16) | (int32(b[10]) << 8) | (int32(b[11])) 120 return 121} 122 123func putUnix(b []byte, sec int64, nsec int32) { 124 b[0] = byte(sec >> 56) 125 b[1] = byte(sec >> 48) 126 b[2] = byte(sec >> 40) 127 b[3] = byte(sec >> 32) 128 b[4] = byte(sec >> 24) 129 b[5] = byte(sec >> 16) 130 b[6] = byte(sec >> 8) 131 b[7] = byte(sec) 132 b[8] = byte(nsec >> 24) 133 b[9] = byte(nsec >> 16) 134 b[10] = byte(nsec >> 8) 135 b[11] = byte(nsec) 136} 137 138/* ----------------------------- 139 prefix utilities 140 ----------------------------- */ 141 142// write prefix and uint8 143func prefixu8(b []byte, pre byte, sz uint8) { 144 b[0] = pre 145 b[1] = byte(sz) 146} 147 148// write prefix and big-endian uint16 149func prefixu16(b []byte, pre byte, sz uint16) { 150 b[0] = pre 151 b[1] = byte(sz >> 8) 152 b[2] = byte(sz) 153} 154 155// write prefix and big-endian uint32 156func prefixu32(b []byte, pre byte, sz uint32) { 157 b[0] = pre 158 b[1] = byte(sz >> 24) 159 b[2] = byte(sz >> 16) 160 b[3] = byte(sz >> 8) 161 b[4] = byte(sz) 162} 163 164func prefixu64(b []byte, pre byte, sz uint64) { 165 b[0] = pre 166 b[1] = byte(sz >> 56) 167 b[2] = byte(sz >> 48) 168 b[3] = byte(sz >> 40) 169 b[4] = byte(sz >> 32) 170 b[5] = byte(sz >> 24) 171 b[6] = byte(sz >> 16) 172 b[7] = byte(sz >> 8) 173 b[8] = byte(sz) 174} 175