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