/*
- silctypes.h
+ silctypes.h
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2002 Pekka Riikonen
+ Copyright (C) 2002 - 2004 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
*
* SOURCE
*/
+#ifdef SILC_MACOSX
+#define bool _Bool
+#endif
+
#ifndef __cplusplus
#ifndef bool
#define bool unsigned char
#endif
/***/
-/* Define offsetof */
-#ifndef offsetof
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-#endif
+#define silc_offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#if SILC_SIZEOF_SHORT > 2
#error "size of the short must be 2 bytes"
typedef unsigned long long SilcUInt64;
typedef signed long long SilcInt64;
#else
-typedef SilcUInt32 SilcUInt64; /* XXX Use Windows's own 64 bit types */
-typedef SilcInt32 SilcInt64;
+typedef unsigned __int64 SilcUInt64;
+typedef signed __int64 SilcInt64;
#endif
#else
typedef SilcUInt32 SilcUInt64;
/* Macros */
-#define GET_WORD(cp) ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \
- | ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \
- | ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \
+#define SILC_GET_WORD(cp) ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \
+ | ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \
+ | ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \
| ((SilcUInt32)(SilcUInt8)(cp)[3])
/****d* silcutil/SILCTypes/SILC_GET16_MSB
* SOURCE
*/
#define SILC_GET16_MSB(l, cp) \
+do { \
(l) = ((SilcUInt32)(SilcUInt8)(cp)[0] << 8) \
- | ((SilcUInt32)(SilcUInt8)(cp)[1])
+ | ((SilcUInt32)(SilcUInt8)(cp)[1]); \
+} while(0)
/***/
/****d* silcutil/SILCTypes/SILC_GET32_MSB
* SOURCE
*/
#define SILC_GET32_MSB(l, cp) \
+do { \
(l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \
| ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \
| ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \
- | ((SilcUInt32)(SilcUInt8)(cp)[3])
+ | ((SilcUInt32)(SilcUInt8)(cp)[3]); \
+} while(0)
/***/
/****d* silcutil/SILCTypes/SILC_GET64_MSB
*
* SOURCE
*/
-#define SILC_GET64_MSB(l, cp) \
- (l) = ((((SilcUInt64)GET_WORD((cp))) << 32) | \
- ((SilcUInt64)GET_WORD((cp) + 4)))
+#define SILC_GET64_MSB(l, cp) \
+do { \
+ (l) = ((((SilcUInt64)SILC_GET_WORD((cp))) << 32) | \
+ ((SilcUInt64)SILC_GET_WORD((cp) + 4))); \
+} while(0)
/***/
/****d* silcutil/SILCTypes/SILC_GET16_LSB
* SOURCE
*/
#define SILC_GET16_LSB(l, cp) \
+do { \
(l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) \
- | ((SilcUInt32)(SilcUInt8)(cp)[1] << 8)
+ | ((SilcUInt32)(SilcUInt8)(cp)[1] << 8); \
+} while(0)
/***/
/****d* silcutil/SILCTypes/SILC_GET32_LSB
* SOURCE
*/
#define SILC_GET32_LSB(l, cp) \
+do { \
(l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) \
| ((SilcUInt32)(SilcUInt8)(cp)[1] << 8) \
| ((SilcUInt32)(SilcUInt8)(cp)[2] << 16) \
- | ((SilcUInt32)(SilcUInt8)(cp)[3] << 24)
+ | ((SilcUInt32)(SilcUInt8)(cp)[3] << 24); \
+} while(0)
/* Same as upper but XOR the result always. Special purpose macro. */
#define SILC_GET32_X_LSB(l, cp) \
* SOURCE
*/
#define SILC_PUT16_MSB(l, cp) \
- (cp)[0] = l >> 8; \
- (cp)[1] = l;
+do { \
+ (cp)[0] = (SilcUInt8)((l) >> 8); \
+ (cp)[1] = (SilcUInt8)(l); \
+} while(0)
/***/
/****d* silcutil/SILCTypes/SILC_PUT32_MSB
* SOURCE
*/
#define SILC_PUT32_MSB(l, cp) \
- (cp)[0] = l >> 24; \
- (cp)[1] = l >> 16; \
- (cp)[2] = l >> 8; \
- (cp)[3] = l;
+do { \
+ (cp)[0] = (SilcUInt8)((l) >> 24); \
+ (cp)[1] = (SilcUInt8)((l) >> 16); \
+ (cp)[2] = (SilcUInt8)((l) >> 8); \
+ (cp)[3] = (SilcUInt8)(l); \
+} while(0)
/***/
/****d* silcutil/SILCTypes/SILC_PUT64_MSB
* SOURCE
*/
#define SILC_PUT16_LSB(l, cp) \
- (cp)[0] = l; \
- (cp)[1] = l >> 8;
+do { \
+ (cp)[0] = (SilcUInt8)(l); \
+ (cp)[1] = (SilcUInt8)((l) >> 8); \
+} while(0)
/***/
/****d* silcutil/SILCTypes/SILC_PUT32_LSB
* SOURCE
*/
#define SILC_PUT32_LSB(l, cp) \
- (cp)[0] = l; \
- (cp)[1] = l >> 8; \
- (cp)[2] = l >> 16; \
- (cp)[3] = l >> 24;
+do { \
+ (cp)[0] = (SilcUInt8)(l); \
+ (cp)[1] = (SilcUInt8)((l) >> 8); \
+ (cp)[2] = (SilcUInt8)((l) >> 16); \
+ (cp)[3] = (SilcUInt8)((l) >> 24); \
+} while(0)
+/***/
+
+/****d* silcutil/SILCTypes/SILC_SWAB_16
+ *
+ * NAME
+ *
+ * #define SILC_SWAB_16 ...
+ *
+ * DESCRIPTION
+ *
+ * Swabs 16-bit unsigned integer byte order.
+ *
+ * SOURCE
+ */
+#define SILC_SWAB_16(l) \
+ ((SilcUInt16)(((SilcUInt16)(l) & (SilcUInt16)0x00FFU) << 8) | \
+ (((SilcUInt16)(l) & (SilcUInt16)0xFF00U) >> 8))
+/***/
+
+/****d* silcutil/SILCTypes/SILC_SWAB_32
+ *
+ * NAME
+ *
+ * #define SILC_SWAB_32 ...
+ *
+ * DESCRIPTION
+ *
+ * Swabs 32-bit unsigned integer byte order.
+ *
+ * SOURCE
+ */
+#define SILC_SWAB_32(l) \
+ ((SilcUInt32)(((SilcUInt32)(l) & (SilcUInt32)0x000000FFUL) << 24) | \
+ (((SilcUInt32)(l) & (SilcUInt32)0x0000FF00UL) << 8) | \
+ (((SilcUInt32)(l) & (SilcUInt32)0x00FF0000UL) >> 8) | \
+ (((SilcUInt32)(l) & (SilcUInt32)0xFF000000UL) >> 24))
+/***/
+
+/****d* silcutil/SILCTypes/SILC_PTR_TO_32
+ *
+ * NAME
+ *
+ * #define SILC_PTR_TO_32 ...
+ *
+ * DESCRIPTION
+ *
+ * Type casts a pointer's value into a 32-bit integer. Use this to
+ * avoid compiler warnings when type casting pointers to integers
+ * of different size.
+ *
+ * SOURCE
+ */
+#if SILC_SIZEOF_VOID_P < 8
+#define SILC_PTR_TO_32(_ptr__) ((SilcUInt32)(_ptr__))
+#else
+#define SILC_PTR_TO_32(_ptr__) \
+ ((SilcUInt32)((SilcUInt64)(_ptr__) & (SilcUInt32)0xFFFFFFFFUL))
+#endif
+/***/
+
+/****d* silcutil/SILCTypes/SILC_PTR_TO_64
+ *
+ * NAME
+ *
+ * #define SILC_PTR_TO_64 ...
+ *
+ * DESCRIPTION
+ *
+ * Type casts a pointer's value into a 64-bit integer. Use this to
+ * avoid compiler warnings when type casting pointers to integers
+ * of different size.
+ *
+ * SOURCE
+ */
+#if SILC_SIZEOF_VOID_P < 8
+#define SILC_PTR_TO_64(_ptr__) ((SilcUInt64)((SilcUInt32)(_ptr__)))
+#else
+#define SILC_PTR_TO_64(_ptr__) \
+ ((SilcUInt64)((SilcUInt64)(_ptr__) & (SilcUInt32)0xFFFFFFFFUL))
+#endif
+/***/
+
+/****d* silcutil/SILCTypes/SILC_32_TO_PTR
+ *
+ * NAME
+ *
+ * #define SILC_PTR_TO_32 ...
+ *
+ * DESCRIPTION
+ *
+ * Type casts a 32-bit integer value into a pointer. Use this to
+ * avoid compiler warnings when type casting integers to pointers of
+ * different size.
+ *
+ * SOURCE
+ */
+#if SILC_SIZEOF_VOID_P < 8
+#define SILC_32_TO_PTR(_ival__) ((void *)((SilcUInt32)(_ival__)))
+#else
+#define SILC_32_TO_PTR(_ival__) ((void *)((SilcUInt64)(_ival__)))
+#endif
+/***/
+
+/****d* silcutil/SILCTypes/SILC_64_TO_PTR
+ *
+ * NAME
+ *
+ * #define SILC_PTR_TO_64 ...
+ *
+ * DESCRIPTION
+ *
+ * Type casts a 64-bit integer value into a pointer. Use this to
+ * avoid compiler warnings when type casting integers to pointers of
+ * different size.
+ *
+ * SOURCE
+ */
+#if SILC_SIZEOF_VOID_P < 8
+#define SILC_64_TO_PTR(_ival__) \
+ ((void *)((SilcUInt32)((SilcUInt64)(_ival__) & (SilcUInt32)0xFFFFFFFFUL)))
+#else
+#define SILC_64_TO_PTR(_ival__) ((void *)((SilcUInt64)(_ival__)))
+#endif
/***/
#endif /* SILCTYPES_H */