bobcat_cd/
lib.rs

1#![no_std]
2
3pub use bobcat_maths::{U};
4
5#[macro_export]
6macro_rules! read_word_slices {
7    ($slice:expr, 1) => {{
8        let s = $slice;
9        assert!(s.len() >= 32);
10        unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) }
11    }};
12    ($slice:expr, 2) => {{
13        let s = $slice;
14        assert!(s.len() >= 64);
15        (
16            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
17            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
18        )
19    }};
20    ($slice:expr, 3) => {{
21        let s = $slice;
22        assert!(s.len() >= 96);
23        (
24            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
25            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
26            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
27        )
28    }};
29    ($slice:expr, 4) => {{
30        let s = $slice;
31        assert!(s.len() >= 128);
32        (
33            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
34            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
35            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
36            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
37        )
38    }};
39    ($slice:expr, 5) => {{
40        let s = $slice;
41        assert!(s.len() >= 160);
42        (
43            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
44            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
45            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
46            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
47            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
48        )
49    }};
50    ($slice:expr, 6) => {{
51        let s = $slice;
52        assert!(s.len() >= 192);
53        (
54            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
55            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
56            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
57            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
58            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
59            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
60        )
61    }};
62    ($slice:expr, 7) => {{
63        let s = $slice;
64        assert!(s.len() >= 224);
65        (
66            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
67            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
68            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
69            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
70            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
71            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
72            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
73        )
74    }};
75    ($slice:expr, 8) => {{
76        let s = $slice;
77        assert!(s.len() >= 256);
78        (
79            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
80            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
81            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
82            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
83            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
84            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
85            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
86            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
87        )
88    }};
89    ($slice:expr, 9) => {{
90        let s = $slice;
91        assert!(s.len() >= 288);
92        (
93            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
94            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
95            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
96            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
97            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
98            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
99            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
100            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
101            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
102        )
103    }};
104    ($slice:expr, 10) => {{
105        let s = $slice;
106        assert!(s.len() >= 320);
107        (
108            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
109            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
110            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
111            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
112            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
113            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
114            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
115            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
116            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
117            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
118        )
119    }};
120    ($slice:expr, 11) => {{
121        let s = $slice;
122        assert!(s.len() >= 352);
123        (
124            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
125            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
126            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
127            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
128            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
129            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
130            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
131            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
132            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
133            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
134            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
135        )
136    }};
137    ($slice:expr, 12) => {{
138        let s = $slice;
139        assert!(s.len() >= 384);
140        (
141            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
142            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
143            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
144            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
145            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
146            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
147            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
148            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
149            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
150            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
151            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
152            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
153        )
154    }};
155    ($slice:expr, 13) => {{
156        let s = $slice;
157        assert!(s.len() >= 416);
158        (
159            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
160            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
161            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
162            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
163            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
164            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
165            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
166            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
167            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
168            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
169            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
170            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
171            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
172        )
173    }};
174    ($slice:expr, 14) => {{
175        let s = $slice;
176        assert!(s.len() >= 448);
177        (
178            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
179            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
180            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
181            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
182            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
183            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
184            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
185            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
186            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
187            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
188            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
189            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
190            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
191            unsafe { &*(s[416..448].as_ptr() as *const [u8; 32]) },
192        )
193    }};
194    ($slice:expr, 15) => {{
195        let s = $slice;
196        assert!(s.len() >= 480);
197        (
198            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
199            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
200            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
201            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
202            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
203            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
204            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
205            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
206            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
207            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
208            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
209            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
210            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
211            unsafe { &*(s[416..448].as_ptr() as *const [u8; 32]) },
212            unsafe { &*(s[448..480].as_ptr() as *const [u8; 32]) },
213        )
214    }};
215    ($slice:expr, 16) => {{
216        let s = $slice;
217        assert!(s.len() >= 512);
218        (
219            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
220            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
221            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
222            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
223            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
224            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
225            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
226            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
227            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
228            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
229            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
230            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
231            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
232            unsafe { &*(s[416..448].as_ptr() as *const [u8; 32]) },
233            unsafe { &*(s[448..480].as_ptr() as *const [u8; 32]) },
234            unsafe { &*(s[480..512].as_ptr() as *const [u8; 32]) },
235        )
236    }};
237    ($slice:expr, 17) => {{
238        let s = $slice;
239        assert!(s.len() >= 544);
240        (
241            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
242            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
243            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
244            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
245            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
246            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
247            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
248            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
249            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
250            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
251            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
252            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
253            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
254            unsafe { &*(s[416..448].as_ptr() as *const [u8; 32]) },
255            unsafe { &*(s[448..480].as_ptr() as *const [u8; 32]) },
256            unsafe { &*(s[480..512].as_ptr() as *const [u8; 32]) },
257            unsafe { &*(s[512..544].as_ptr() as *const [u8; 32]) },
258        )
259    }};
260    ($slice:expr, 18) => {{
261        let s = $slice;
262        assert!(s.len() >= 576);
263        (
264            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
265            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
266            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
267            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
268            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
269            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
270            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
271            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
272            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
273            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
274            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
275            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
276            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
277            unsafe { &*(s[416..448].as_ptr() as *const [u8; 32]) },
278            unsafe { &*(s[448..480].as_ptr() as *const [u8; 32]) },
279            unsafe { &*(s[480..512].as_ptr() as *const [u8; 32]) },
280            unsafe { &*(s[512..544].as_ptr() as *const [u8; 32]) },
281            unsafe { &*(s[544..576].as_ptr() as *const [u8; 32]) },
282        )
283    }};
284    ($slice:expr, 19) => {{
285        let s = $slice;
286        assert!(s.len() >= 608);
287        (
288            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
289            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
290            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
291            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
292            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
293            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
294            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
295            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
296            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
297            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
298            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
299            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
300            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
301            unsafe { &*(s[416..448].as_ptr() as *const [u8; 32]) },
302            unsafe { &*(s[448..480].as_ptr() as *const [u8; 32]) },
303            unsafe { &*(s[480..512].as_ptr() as *const [u8; 32]) },
304            unsafe { &*(s[512..544].as_ptr() as *const [u8; 32]) },
305            unsafe { &*(s[544..576].as_ptr() as *const [u8; 32]) },
306            unsafe { &*(s[576..608].as_ptr() as *const [u8; 32]) },
307        )
308    }};
309    ($slice:expr, 20) => {{
310        let s = $slice;
311        assert!(s.len() >= 640);
312        (
313            unsafe { &*(s[0..32].as_ptr() as *const [u8; 32]) },
314            unsafe { &*(s[32..64].as_ptr() as *const [u8; 32]) },
315            unsafe { &*(s[64..96].as_ptr() as *const [u8; 32]) },
316            unsafe { &*(s[96..128].as_ptr() as *const [u8; 32]) },
317            unsafe { &*(s[128..160].as_ptr() as *const [u8; 32]) },
318            unsafe { &*(s[160..192].as_ptr() as *const [u8; 32]) },
319            unsafe { &*(s[192..224].as_ptr() as *const [u8; 32]) },
320            unsafe { &*(s[224..256].as_ptr() as *const [u8; 32]) },
321            unsafe { &*(s[256..288].as_ptr() as *const [u8; 32]) },
322            unsafe { &*(s[288..320].as_ptr() as *const [u8; 32]) },
323            unsafe { &*(s[320..352].as_ptr() as *const [u8; 32]) },
324            unsafe { &*(s[352..384].as_ptr() as *const [u8; 32]) },
325            unsafe { &*(s[384..416].as_ptr() as *const [u8; 32]) },
326            unsafe { &*(s[416..448].as_ptr() as *const [u8; 32]) },
327            unsafe { &*(s[448..480].as_ptr() as *const [u8; 32]) },
328            unsafe { &*(s[480..512].as_ptr() as *const [u8; 32]) },
329            unsafe { &*(s[512..544].as_ptr() as *const [u8; 32]) },
330            unsafe { &*(s[544..576].as_ptr() as *const [u8; 32]) },
331            unsafe { &*(s[576..608].as_ptr() as *const [u8; 32]) },
332            unsafe { &*(s[608..640].as_ptr() as *const [u8; 32]) },
333        )
334    }};
335}
336
337#[test]
338fn test_access() {
339    use bobcat_maths::Address;
340    let cd = const_hex::const_decode_to_array::<{ 32 * 2 + 4 }>(b"a9059cbb0000000000000000000000006221a9c005f6e47eb398fd867784cacfdcfff4e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap();
341    let a = const_hex::const_decode_to_array::<20>(b"6221a9c005f6e47eb398fd867784cacfdcfff4e7")
342        .unwrap();
343    let (addr, amt) = read_word_slices!(&cd[4..], 2);
344    assert_eq!((a, U::MAX), (Address::from(U::from(*addr)), U::from(*amt)));
345}