Skip to content

Commit 6a71ad8

Browse files
committed
FEAT: included macros for conversions from U8 to U32 and U64 (little endian) and back
1 parent 76e91b6 commit 6a71ad8

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

src/include/reb-c.h

+55-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
** OS_WIDE_CHAR - the OS uses wide chars (not UTF-8)
3131
**
3232
***********************************************************************/
33+
#ifndef REB_C_H
34+
#define REB_C_H
3335

3436
#ifndef FALSE
3537
#define FALSE 0
@@ -97,7 +99,7 @@ typedef unsigned short u16;
9799
typedef int i32;
98100
typedef unsigned int u32;
99101
#else
100-
typedef long i32;
102+
typedef long i32;
101103
typedef unsigned long u32;
102104
#endif
103105
#define I32_C(c) c
@@ -344,6 +346,56 @@ typedef void(*CFUNC)(void *);
344346
#endif
345347

346348

349+
/***********************************************************************
350+
**
351+
** Conversion Macros
352+
**
353+
***********************************************************************/
354+
355+
/* interpret four 8 bit unsigned integers as a 32 bit unsigned integer in little endian
356+
originaly named LE in ChaCha20 code and U8TO32 in Poly1305 code */
357+
#define U8TO32_LE(p) \
358+
(((u32)((p)[0])) | \
359+
((u32)((p)[1]) << 8) | \
360+
((u32)((p)[2]) << 16) | \
361+
((u32)((p)[3]) << 24))
362+
363+
/* store a 32 bit unsigned integer as four 8 bit unsigned integers in little endian
364+
originaly named FROMLE in ChaCha20 code */
365+
#define U32TO8_LE(p, v) \
366+
do { \
367+
(p)[0] = (u8)((v)); \
368+
(p)[1] = (u8)((v) >> 8); \
369+
(p)[2] = (u8)((v) >> 16); \
370+
(p)[3] = (u8)((v) >> 24); \
371+
} while (0)
372+
373+
/* interpret eight 8 bit unsigned integers as a 64 bit unsigned integer in little endian */
374+
#define U8TO64_LE(p) \
375+
(((u64)((p)[0] & 0xff) ) | \
376+
((u64)((p)[1] & 0xff) << 8) | \
377+
((u64)((p)[2] & 0xff) << 16) | \
378+
((u64)((p)[3] & 0xff) << 24) | \
379+
((u64)((p)[4] & 0xff) << 32) | \
380+
((u64)((p)[5] & 0xff) << 40) | \
381+
((u64)((p)[6] & 0xff) << 48) | \
382+
((u64)((p)[7] & 0xff) << 56))
383+
384+
385+
/* store a 64 bit unsigned integer as eight 8 bit unsigned integers in little endian */
386+
#define U64TO8_LE(p, v) \
387+
do { \
388+
(p)[0] = (u8)((v) ) & 0xff; \
389+
(p)[1] = (u8)((v) >> 8) & 0xff; \
390+
(p)[2] = (u8)((v) >> 16) & 0xff; \
391+
(p)[3] = (u8)((v) >> 24) & 0xff; \
392+
(p)[4] = (u8)((v) >> 32) & 0xff; \
393+
(p)[5] = (u8)((v) >> 40) & 0xff; \
394+
(p)[6] = (u8)((v) >> 48) & 0xff; \
395+
(p)[7] = (u8)((v) >> 56) & 0xff; \
396+
} while (0)
397+
398+
347399

348400
//
349401
// CASTING MACROS
@@ -514,3 +566,5 @@ typedef void(*CFUNC)(void *);
514566
));
515567
}
516568
#endif
569+
570+
#endif // REB_C_H

0 commit comments

Comments
 (0)