5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2002 - 2007 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
20 /****h* silcutil/SILC Types
24 * This header includes the most basic types used in the SILC source
25 * tree, such as arithmetic types and their manipulation macros. This
26 * file is included in the silcincludes.h and is automatically available
34 /****d* silcutil/SILCTypes/SilcBool
38 * typedef unigned char SilcBool;
42 * Boolean value, and is always 8-bits. Represents value 0 or 1.
45 typedef unsigned char SilcBool;
47 /* The bool macro is deprecated. Use SilcBool instead. */
53 #define bool unsigned char
57 /****d* silcutil/SILCTypes/TRUE
65 * Boolean true value indicator.
74 /****d* silcutil/SILCTypes/FALSE
82 * Boolean false value indicator.
91 /* Our offsetof macro */
92 #define silc_offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
94 /* silc_likely and silc_unlikely GCC branch prediction macros. Use only if
95 you have profiled the code first. */
97 #define silc_likely(expr) __builtin_expect(!!(expr), 1)
98 #define silc_unlikely(expr) __builtin_expect(!!(expr), 0)
100 #define silc_likely(expr) (expr)
101 #define silc_unlikely(expr) (expr)
102 #endif /* __GNUC__ >= 3 */
104 #if SILC_SIZEOF_SHORT > 2
105 #error "size of the short must be 2 bytes"
108 /****d* silcutil/SILCTypes/SilcUInt8
112 * typedef unsigned char SilcUInt8;
116 * 8-bit unsigned integer.
120 typedef unsigned char SilcUInt8;
123 /****d* silcutil/SILCTypes/SilcInt8
127 * typedef signed char SilcInt8;
131 * 8-bit signed integer.
135 typedef signed char SilcInt8;
138 /****d* silcutil/SILCTypes/SilcUInt16
142 * typedef unsigned short SilcUInt16;
146 * 16-bit unsigned integer. Guaranteed to be 16-bits.
150 typedef unsigned short SilcUInt16;
153 /****d* silcutil/SILCTypes/SilcInt16
157 * typedef signed short SilcInt16;
161 * 16-bit signed integer. Guaranteed to be 16-bits.
165 typedef signed short SilcInt16;
168 /****d* silcutil/SILCTypes/SilcUInt32
172 * typedef unsigned long SilcUInt32;
176 * 32-bit unsigned integer. Guaranteed to be 32-bits.
180 #if SILC_SIZEOF_INT == 4
181 typedef unsigned int SilcUInt32;
182 typedef signed int SilcInt32;
184 #if SILC_SIZEOF_LONG == 4
185 typedef unsigned long SilcUInt32;
186 typedef signed long SilcInt32;
188 #if SILC_SIZEOF_LONG_LONG >= 4
190 typedef unsigned long long SilcUInt32;
191 typedef signed long long SilcInt32;
198 /****d* silcutil/SILCTypes/SilcInt32
202 * typedef signed long SilcInt32;
206 * 32-bit signed integer. Guaranteed to be 32-bits.
210 /****d* silcutil/SILCTypes/SilcUInt64
214 * typedef unsigned long long SilcUInt64;
218 * 64-bit unsigned integer. Guaranteed to be 64-bits on systems that
223 #if SILC_SIZEOF_LONG >= 8
224 typedef unsigned long SilcUInt64;
225 typedef signed long SilcInt64;
227 #if SILC_SIZEOF_LONG_LONG >= 8
229 typedef unsigned long long SilcUInt64;
230 typedef signed long long SilcInt64;
232 typedef unsigned __int64 SilcUInt64;
233 typedef signed __int64 SilcInt64;
236 typedef SilcUInt32 SilcUInt64;
237 typedef SilcInt32 SilcInt64;
242 /****d* silcutil/SILCTypes/SilcInt64
246 * typedef signed long long SilcInt64;
250 * 64-bit signed integer. Guaranteed to be 64-bits on systems that
255 #if SILC_SIZEOF_VOID_P < 4
256 typedef SilcUInt32 * void *;
259 /****d* silcutil/SILCTypes/SilcSocket
267 * Platform specific socket. On POSIX compliant systems this is simply
268 * an integer, representing the socket. On other systems it is platform
269 * specific socket context. Access it only through routines that can
270 * handle SilcSocket types, unless you know what you are doing.
274 #if defined(SILC_UNIX)
275 typedef int SilcSocket;
276 #elif defined(SILC_WIN32)
277 typedef SOCKET SilcSocket;
278 #elif defined(SILC_SYMBIAN)
279 typedef void * SilcSocket;
285 #define SILC_GET_WORD(cp) ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \
286 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \
287 | ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \
288 | ((SilcUInt32)(SilcUInt8)(cp)[3])
290 /****d* silcutil/SILCTypes/SILC_GET16_MSB
294 * #define SILC_GET16_MSB ...
298 * Return two 8-bit bytes, most significant bytes first.
302 #define SILC_GET16_MSB(l, cp) \
304 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0] << 8) \
305 | ((SilcUInt32)(SilcUInt8)(cp)[1]); \
309 /****d* silcutil/SILCTypes/SILC_GET32_MSB
313 * #define SILC_GET32_MSB ...
317 * Return four 8-bit bytes, most significant bytes first.
321 #define SILC_GET32_MSB(l, cp) \
323 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \
324 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \
325 | ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \
326 | ((SilcUInt32)(SilcUInt8)(cp)[3]); \
330 /****d* silcutil/SILCTypes/SILC_GET64_MSB
334 * #define SILC_GET64_MSB ...
338 * Return eight 8-bit bytes, most significant bytes first.
342 #define SILC_GET64_MSB(l, cp) \
344 (l) = ((((SilcUInt64)SILC_GET_WORD((cp))) << 32) | \
345 ((SilcUInt64)SILC_GET_WORD((cp) + 4))); \
349 /****d* silcutil/SILCTypes/SILC_GET16_LSB
353 * #define SILC_GET16_MSB ...
357 * Return two 8-bit bytes, least significant bytes first.
361 #if defined(SILC_I486) && defined(__GNUC__)
362 #define SILC_GET16_LSB(l, cp) (l) = (*(SilcUInt16 *)(cp))
364 #define SILC_GET16_LSB(l, cp) \
366 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) \
367 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 8); \
369 #endif /* SILC_I486 && __GNUC__ */
372 /****d* silcutil/SILCTypes/SILC_GET32_LSB
376 * #define SILC_GET32_LSB ...
380 * Return four 8-bit bytes, least significant bytes first.
384 #if defined(SILC_I486) && defined(__GNUC__)
385 #define SILC_GET32_LSB(l, cp) (l) = (*(SilcUInt32 *)(cp))
387 #define SILC_GET32_LSB(l, cp) \
389 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) \
390 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 8) \
391 | ((SilcUInt32)(SilcUInt8)(cp)[2] << 16) \
392 | ((SilcUInt32)(SilcUInt8)(cp)[3] << 24); \
394 #endif /* SILC_I486 && __GNUC__ */
396 /* Same as upper but XOR the result always. Special purpose macro. */
397 #if defined(SILC_I486) && defined(__GNUC__)
398 #define SILC_GET32_X_LSB(l, cp) (l) ^= (*(SilcUInt32 *)(cp))
400 #define SILC_GET32_X_LSB(l, cp) \
401 (l) ^= ((SilcUInt32)(SilcUInt8)(cp)[0]) \
402 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 8) \
403 | ((SilcUInt32)(SilcUInt8)(cp)[2] << 16) \
404 | ((SilcUInt32)(SilcUInt8)(cp)[3] << 24)
405 #endif /* SILC_I486 && __GNUC__ */
408 /****d* silcutil/SILCTypes/SILC_PUT16_MSB
412 * #define SILC_PUT16_MSB ...
416 * Put two 8-bit bytes, most significant bytes first.
420 #define SILC_PUT16_MSB(l, cp) \
422 (cp)[0] = (SilcUInt8)((l) >> 8); \
423 (cp)[1] = (SilcUInt8)(l); \
427 /****d* silcutil/SILCTypes/SILC_PUT32_MSB
431 * #define SILC_PUT32_MSB ...
435 * Put four 8-bit bytes, most significant bytes first.
439 #define SILC_PUT32_MSB(l, cp) \
441 (cp)[0] = (SilcUInt8)((l) >> 24); \
442 (cp)[1] = (SilcUInt8)((l) >> 16); \
443 (cp)[2] = (SilcUInt8)((l) >> 8); \
444 (cp)[3] = (SilcUInt8)(l); \
448 /****d* silcutil/SILCTypes/SILC_PUT64_MSB
452 * #define SILC_PUT64_MSB ...
456 * Put eight 8-bit bytes, most significant bytes first.
460 #define SILC_PUT64_MSB(l, cp) \
462 SILC_PUT32_MSB((SilcUInt32)((SilcUInt64)(l) >> 32), (cp)); \
463 SILC_PUT32_MSB((SilcUInt32)(l), (cp) + 4); \
467 /****d* silcutil/SILCTypes/SILC_PUT16_LSB
471 * #define SILC_PUT16_LSB ...
475 * Put two 8-bit bytes, least significant bytes first.
479 #if defined(SILC_I486) && defined(__GNUC__)
480 #define SILC_PUT16_LSB(l, cp) (*(SilcUInt16 *)(cp)) = (l)
482 #define SILC_PUT16_LSB(l, cp) \
484 (cp)[0] = (SilcUInt8)(l); \
485 (cp)[1] = (SilcUInt8)((l) >> 8); \
487 #endif /* SILC_I486 && __GNUC__ */
490 /****d* silcutil/SILCTypes/SILC_PUT32_LSB
494 * #define SILC_PUT32_LSB ...
498 * Put four 8-bit bytes, least significant bytes first.
502 #if defined(SILC_I486) && defined(__GNUC__)
503 #define SILC_PUT32_LSB(l, cp) (*(SilcUInt32 *)(cp)) = (l)
505 #define SILC_PUT32_LSB(l, cp) \
507 (cp)[0] = (SilcUInt8)(l); \
508 (cp)[1] = (SilcUInt8)((l) >> 8); \
509 (cp)[2] = (SilcUInt8)((l) >> 16); \
510 (cp)[3] = (SilcUInt8)((l) >> 24); \
512 #endif /* SILC_I486 && __GNUC__ */
515 /****d* silcutil/SILCTypes/SILC_SWAB_16
519 * #define SILC_SWAB_16 ...
523 * Swabs 16-bit unsigned integer byte order.
527 #define SILC_SWAB_16(l) \
528 ((SilcUInt16)(((SilcUInt16)(l) & (SilcUInt16)0x00FFU) << 8) | \
529 (((SilcUInt16)(l) & (SilcUInt16)0xFF00U) >> 8))
532 /****d* silcutil/SILCTypes/SILC_SWAB_32
536 * #define SILC_SWAB_32 ...
540 * Swabs 32-bit unsigned integer byte order.
544 #define SILC_SWAB_32(l) \
545 ((SilcUInt32)(((SilcUInt32)(l) & (SilcUInt32)0x000000FFUL) << 24) | \
546 (((SilcUInt32)(l) & (SilcUInt32)0x0000FF00UL) << 8) | \
547 (((SilcUInt32)(l) & (SilcUInt32)0x00FF0000UL) >> 8) | \
548 (((SilcUInt32)(l) & (SilcUInt32)0xFF000000UL) >> 24))
551 /****d* silcutil/SILCTypes/SILC_PTR_TO_32
555 * #define SILC_PTR_TO_32 ...
559 * Type casts a pointer's value into a 32-bit integer. Use this to
560 * avoid compiler warnings when type casting pointers to integers
565 #if SILC_SIZEOF_VOID_P < 8
566 #define SILC_PTR_TO_32(_ptr__) ((SilcUInt32)(_ptr__))
568 #define SILC_PTR_TO_32(_ptr__) \
569 ((SilcUInt32)((SilcUInt64)(_ptr__) & (SilcUInt32)0xFFFFFFFFUL))
573 /****d* silcutil/SILCTypes/SILC_PTR_TO_64
577 * #define SILC_PTR_TO_64 ...
581 * Type casts a pointer's value into a 64-bit integer. Use this to
582 * avoid compiler warnings when type casting pointers to integers
587 #if SILC_SIZEOF_VOID_P < 8
588 #define SILC_PTR_TO_64(_ptr__) ((SilcUInt64)((SilcUInt32)(_ptr__)))
590 #define SILC_PTR_TO_64(_ptr__) ((SilcUInt64)((SilcUInt64)(_ptr__)))
594 /****d* silcutil/SILCTypes/SILC_32_TO_PTR
598 * #define SILC_32_TO_PTR ...
602 * Type casts a 32-bit integer value into a pointer. Use this to
603 * avoid compiler warnings when type casting integers to pointers of
608 #if SILC_SIZEOF_VOID_P < 8
609 #define SILC_32_TO_PTR(_ival__) ((void *)((SilcUInt32)(_ival__)))
611 #define SILC_32_TO_PTR(_ival__) ((void *)((SilcUInt64)(_ival__)))
615 /****d* silcutil/SILCTypes/SILC_64_TO_PTR
619 * #define SILC_64_TO_PTR ...
623 * Type casts a 64-bit integer value into a pointer. Use this to
624 * avoid compiler warnings when type casting integers to pointers of
629 #if SILC_SIZEOF_VOID_P < 8
630 #define SILC_64_TO_PTR(_ival__) \
631 ((void *)((SilcUInt32)((SilcUInt64)(_ival__) & (SilcUInt32)0xFFFFFFFFUL)))
633 #define SILC_64_TO_PTR(_ival__) ((void *)((SilcUInt64)(_ival__)))
637 typedef char __check_size1[sizeof(SilcInt8) == 1 ? 1 : -1];
638 typedef char __check_size2[sizeof(SilcUInt8) == 1 ? 1 : -1];
639 typedef char __check_size3[sizeof(SilcInt16) == 2 ? 1 : -1];
640 typedef char __check_size4[sizeof(SilcUInt16) == 2 ? 1 : -1];
641 typedef char __check_size5[sizeof(SilcInt32) == 4 ? 1 : -1];
642 typedef char __check_size6[sizeof(SilcUInt32) == 4 ? 1 : -1];
644 #endif /* SILCTYPES_H */