1 /* 2 3 silctypes.h 4 5 Author: Pekka Riikonen <priikone@silcnet.org> 6 7 Copyright (C) 2002 - 2007 Pekka Riikonen 8 9 The contents of this file are subject to one of the Licenses specified 10 in the COPYING file; You may not use this file except in compliance 11 with the License. 12 13 The software distributed under the License is distributed on an "AS IS" 14 basis, in the hope that it will be useful, but WITHOUT WARRANTY OF ANY 15 KIND, either expressed or implied. See the COPYING file for more 16 information. 17 18 */ 19 20 /****h* silcutil/SILC Types 21 * 22 * DESCRIPTION 23 * 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 27 * for application. 28 * 29 ***/ 30 31 #ifndef SILCTYPES_H 32 #define SILCTYPES_H 33 34 /****d* silcutil/SILCTypes/SilcBool 35 * 36 * NAME 37 * 38 * typedef unigned char SilcBool; 39 * 40 * DESCRIPTION 41 * 42 * Boolean value, and is always 8-bits. Represents value 0 or 1. 43 * 44 ***/ 45 typedef unsigned char SilcBool; 46 47 /* The bool macro is deprecated. Use SilcBool instead. */ 48 #ifdef SILC_MACOSX 49 #define bool _Bool 50 #endif 51 #ifndef __cplusplus 52 #ifndef bool 53 #define bool unsigned char 54 #endif 55 #endif 56 57 /****d* silcutil/SILCTypes/TRUE 58 * 59 * NAME 60 * 61 * #define TRUE ... 62 * 63 * DESCRIPTION 64 * 65 * Boolean true value indicator. 66 * 67 * SOURCE 68 */ 69 #ifndef TRUE 70 #define TRUE 1 71 #endif 72 /***/ 73 74 /****d* silcutil/SILCTypes/FALSE 75 * 76 * NAME 77 * 78 * #define FALSE ... 79 * 80 * DESCRIPTION 81 * 82 * Boolean false value indicator. 83 * 84 * SOURCE 85 */ 86 #ifndef FALSE 87 #define FALSE 0 88 #endif 89 /***/ 90 91 /* Our offsetof macro */ 92 #define silc_offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 93 94 /* silc_likely and silc_unlikely GCC branch prediction macros. Use only if 95 you have profiled the code first. */ 96 #if __GNUC__ >= 3 97 #define silc_likely(expr) __builtin_expect(!!(expr), 1) 98 #define silc_unlikely(expr) __builtin_expect(!!(expr), 0) 99 #else 100 #define silc_likely(expr) (expr) 101 #define silc_unlikely(expr) (expr) 102 #endif /* __GNUC__ >= 3 */ 103 104 #if SILC_SIZEOF_SHORT > 2 105 #error "size of the short must be 2 bytes" 106 #endif 107 108 /****d* silcutil/SILCTypes/SilcUInt8 109 * 110 * NAME 111 * 112 * typedef unsigned char SilcUInt8; 113 * 114 * DESCRIPTION 115 * 116 * 8-bit unsigned integer. 117 * 118 * SOURCE 119 */ 120 typedef unsigned char SilcUInt8; 121 /***/ 122 123 /****d* silcutil/SILCTypes/SilcInt8 124 * 125 * NAME 126 * 127 * typedef signed char SilcInt8; 128 * 129 * DESCRIPTION 130 * 131 * 8-bit signed integer. 132 * 133 * SOURCE 134 */ 135 typedef signed char SilcInt8; 136 /***/ 137 138 /****d* silcutil/SILCTypes/SilcUInt16 139 * 140 * NAME 141 * 142 * typedef unsigned short SilcUInt16; 143 * 144 * DESCRIPTION 145 * 146 * 16-bit unsigned integer. Guaranteed to be 16-bits. 147 * 148 * SOURCE 149 */ 150 typedef unsigned short SilcUInt16; 151 /***/ 152 153 /****d* silcutil/SILCTypes/SilcInt16 154 * 155 * NAME 156 * 157 * typedef signed short SilcInt16; 158 * 159 * DESCRIPTION 160 * 161 * 16-bit signed integer. Guaranteed to be 16-bits. 162 * 163 * SOURCE 164 */ 165 typedef signed short SilcInt16; 166 /***/ 167 168 /****d* silcutil/SILCTypes/SilcUInt32 169 * 170 * NAME 171 * 172 * typedef unsigned long SilcUInt32; 173 * 174 * DESCRIPTION 175 * 176 * 32-bit unsigned integer. Guaranteed to be 32-bits. 177 * 178 * SOURCE 179 */ 180 #if SILC_SIZEOF_INT == 4 181 typedef unsigned int SilcUInt32; 182 typedef signed int SilcInt32; 183 #else 184 #if SILC_SIZEOF_LONG == 4 185 typedef unsigned long SilcUInt32; 186 typedef signed long SilcInt32; 187 #else 188 #if SILC_SIZEOF_LONG_LONG >= 4 189 #ifndef WIN32 190 typedef unsigned long long SilcUInt32; 191 typedef signed long long SilcInt32; 192 #endif 193 #endif 194 #endif 195 #endif 196 /***/ 197 198 /****d* silcutil/SILCTypes/SilcInt32 199 * 200 * NAME 201 * 202 * typedef signed long SilcInt32; 203 * 204 * DESCRIPTION 205 * 206 * 32-bit signed integer. Guaranteed to be 32-bits. 207 * 208 ***/ 209 210 /****d* silcutil/SILCTypes/SilcUInt64 211 * 212 * NAME 213 * 214 * typedef unsigned long long SilcUInt64; 215 * 216 * DESCRIPTION 217 * 218 * 64-bit unsigned integer. Guaranteed to be 64-bits on systems that 219 * support it. 220 * 221 * SOURCE 222 */ 223 #if SILC_SIZEOF_LONG >= 8 224 typedef unsigned long SilcUInt64; 225 typedef signed long SilcInt64; 226 #else 227 #if SILC_SIZEOF_LONG_LONG >= 8 228 #ifndef WIN32 229 typedef unsigned long long SilcUInt64; 230 typedef signed long long SilcInt64; 231 #else 232 typedef unsigned __int64 SilcUInt64; 233 typedef signed __int64 SilcInt64; 234 #endif 235 #else 236 typedef SilcUInt32 SilcUInt64; 237 typedef SilcInt32 SilcInt64; 238 #endif 239 #endif 240 /***/ 241 242 /****d* silcutil/SILCTypes/SilcInt64 243 * 244 * NAME 245 * 246 * typedef signed long long SilcInt64; 247 * 248 * DESCRIPTION 249 * 250 * 64-bit signed integer. Guaranteed to be 64-bits on systems that 251 * support it. 252 * 253 ***/ 254 255 #if SILC_SIZEOF_VOID_P < 4 256 typedef SilcUInt32 * void *; 257 #endif 258 259 /****d* silcutil/SILCTypes/SilcSocket 260 * 261 * NAME 262 * 263 * SilcSocket 264 * 265 * DESCRIPTION 266 * 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. 271 * 272 * SOURCE 273 */ 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; 280 #endif 281 /***/ 282 283 /* Macros */ 284 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]) 289 290 /****d* silcutil/SILCTypes/SILC_GET16_MSB 291 * 292 * NAME 293 * 294 * #define SILC_GET16_MSB ... 295 * 296 * DESCRIPTION 297 * 298 * Return two 8-bit bytes, most significant bytes first. 299 * 300 * SOURCE 301 */ 302 #define SILC_GET16_MSB(l, cp) \ 303 do { \ 304 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0] << 8) \ 305 | ((SilcUInt32)(SilcUInt8)(cp)[1]); \ 306 } while(0) 307 /***/ 308 309 /****d* silcutil/SILCTypes/SILC_GET32_MSB 310 * 311 * NAME 312 * 313 * #define SILC_GET32_MSB ... 314 * 315 * DESCRIPTION 316 * 317 * Return four 8-bit bytes, most significant bytes first. 318 * 319 * SOURCE 320 */ 321 #define SILC_GET32_MSB(l, cp) \ 322 do { \ 323 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \ 324 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \ 325 | ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \ 326 | ((SilcUInt32)(SilcUInt8)(cp)[3]); \ 327 } while(0) 328 /***/ 329 330 /****d* silcutil/SILCTypes/SILC_GET64_MSB 331 * 332 * NAME 333 * 334 * #define SILC_GET64_MSB ... 335 * 336 * DESCRIPTION 337 * 338 * Return eight 8-bit bytes, most significant bytes first. 339 * 340 * SOURCE 341 */ 342 #define SILC_GET64_MSB(l, cp) \ 343 do { \ 344 (l) = ((((SilcUInt64)SILC_GET_WORD((cp))) << 32) | \ 345 ((SilcUInt64)SILC_GET_WORD((cp) + 4))); \ 346 } while(0) 347 /***/ 348 349 /****d* silcutil/SILCTypes/SILC_GET16_LSB 350 * 351 * NAME 352 * 353 * #define SILC_GET16_MSB ... 354 * 355 * DESCRIPTION 356 * 357 * Return two 8-bit bytes, least significant bytes first. 358 * 359 * SOURCE 360 */ 361 #if defined(SILC_I486) && defined(__GNUC__) 362 #define SILC_GET16_LSB(l, cp) (l) = (*(SilcUInt16 *)(cp)) 363 #else 364 #define SILC_GET16_LSB(l, cp) \ 365 do { \ 366 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) \ 367 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 8); \ 368 } while(0) 369 #endif /* SILC_I486 && __GNUC__ */ 370 /***/ 371 372 /****d* silcutil/SILCTypes/SILC_GET32_LSB 373 * 374 * NAME 375 * 376 * #define SILC_GET32_LSB ... 377 * 378 * DESCRIPTION 379 * 380 * Return four 8-bit bytes, least significant bytes first. 381 * 382 * SOURCE 383 */ 384 #if defined(SILC_I486) && defined(__GNUC__) 385 #define SILC_GET32_LSB(l, cp) (l) = (*(SilcUInt32 *)(cp)) 386 #else 387 #define SILC_GET32_LSB(l, cp) \ 388 do { \ 389 (l) = ((SilcUInt32)(SilcUInt8)(cp)[0]) \ 390 | ((SilcUInt32)(SilcUInt8)(cp)[1] << 8) \ 391 | ((SilcUInt32)(SilcUInt8)(cp)[2] << 16) \ 392 | ((SilcUInt32)(SilcUInt8)(cp)[3] << 24); \ 393 } while(0) 394 #endif /* SILC_I486 && __GNUC__ */ 395 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)) 399 #else 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__ */ 406 /***/ 407 408 /****d* silcutil/SILCTypes/SILC_PUT16_MSB 409 * 410 * NAME 411 * 412 * #define SILC_PUT16_MSB ... 413 * 414 * DESCRIPTION 415 * 416 * Put two 8-bit bytes, most significant bytes first. 417 * 418 * SOURCE 419 */ 420 #define SILC_PUT16_MSB(l, cp) \ 421 do { \ 422 (cp)[0] = (SilcUInt8)((l) >> 8); \ 423 (cp)[1] = (SilcUInt8)(l); \ 424 } while(0) 425 /***/ 426 427 /****d* silcutil/SILCTypes/SILC_PUT32_MSB 428 * 429 * NAME 430 * 431 * #define SILC_PUT32_MSB ... 432 * 433 * DESCRIPTION 434 * 435 * Put four 8-bit bytes, most significant bytes first. 436 * 437 * SOURCE 438 */ 439 #define SILC_PUT32_MSB(l, cp) \ 440 do { \ 441 (cp)[0] = (SilcUInt8)((l) >> 24); \ 442 (cp)[1] = (SilcUInt8)((l) >> 16); \ 443 (cp)[2] = (SilcUInt8)((l) >> 8); \ 444 (cp)[3] = (SilcUInt8)(l); \ 445 } while(0) 446 /***/ 447 448 /****d* silcutil/SILCTypes/SILC_PUT64_MSB 449 * 450 * NAME 451 * 452 * #define SILC_PUT64_MSB ... 453 * 454 * DESCRIPTION 455 * 456 * Put eight 8-bit bytes, most significant bytes first. 457 * 458 * SOURCE 459 */ 460 #define SILC_PUT64_MSB(l, cp) \ 461 do { \ 462 SILC_PUT32_MSB((SilcUInt32)((SilcUInt64)(l) >> 32), (cp)); \ 463 SILC_PUT32_MSB((SilcUInt32)(l), (cp) + 4); \ 464 } while(0) 465 /***/ 466 467 /****d* silcutil/SILCTypes/SILC_PUT16_LSB 468 * 469 * NAME 470 * 471 * #define SILC_PUT16_LSB ... 472 * 473 * DESCRIPTION 474 * 475 * Put two 8-bit bytes, least significant bytes first. 476 * 477 * SOURCE 478 */ 479 #if defined(SILC_I486) && defined(__GNUC__) 480 #define SILC_PUT16_LSB(l, cp) (*(SilcUInt16 *)(cp)) = (l) 481 #else 482 #define SILC_PUT16_LSB(l, cp) \ 483 do { \ 484 (cp)[0] = (SilcUInt8)(l); \ 485 (cp)[1] = (SilcUInt8)((l) >> 8); \ 486 } while(0) 487 #endif /* SILC_I486 && __GNUC__ */ 488 /***/ 489 490 /****d* silcutil/SILCTypes/SILC_PUT32_LSB 491 * 492 * NAME 493 * 494 * #define SILC_PUT32_LSB ... 495 * 496 * DESCRIPTION 497 * 498 * Put four 8-bit bytes, least significant bytes first. 499 * 500 * SOURCE 501 */ 502 #if defined(SILC_I486) && defined(__GNUC__) 503 #define SILC_PUT32_LSB(l, cp) (*(SilcUInt32 *)(cp)) = (l) 504 #else 505 #define SILC_PUT32_LSB(l, cp) \ 506 do { \ 507 (cp)[0] = (SilcUInt8)(l); \ 508 (cp)[1] = (SilcUInt8)((l) >> 8); \ 509 (cp)[2] = (SilcUInt8)((l) >> 16); \ 510 (cp)[3] = (SilcUInt8)((l) >> 24); \ 511 } while(0) 512 #endif /* SILC_I486 && __GNUC__ */ 513 /***/ 514 515 /****d* silcutil/SILCTypes/SILC_SWAB_16 516 * 517 * NAME 518 * 519 * #define SILC_SWAB_16 ... 520 * 521 * DESCRIPTION 522 * 523 * Swabs 16-bit unsigned integer byte order. 524 * 525 * SOURCE 526 */ 527 #define SILC_SWAB_16(l) \ 528 ((SilcUInt16)(((SilcUInt16)(l) & (SilcUInt16)0x00FFU) << 8) | \ 529 (((SilcUInt16)(l) & (SilcUInt16)0xFF00U) >> 8)) 530 /***/ 531 532 /****d* silcutil/SILCTypes/SILC_SWAB_32 533 * 534 * NAME 535 * 536 * #define SILC_SWAB_32 ... 537 * 538 * DESCRIPTION 539 * 540 * Swabs 32-bit unsigned integer byte order. 541 * 542 * SOURCE 543 */ 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)) 549 /***/ 550 551 /****d* silcutil/SILCTypes/SILC_PTR_TO_32 552 * 553 * NAME 554 * 555 * #define SILC_PTR_TO_32 ... 556 * 557 * DESCRIPTION 558 * 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 561 * of different size. 562 * 563 * SOURCE 564 */ 565 #if SILC_SIZEOF_VOID_P < 8 566 #define SILC_PTR_TO_32(_ptr__) ((SilcUInt32)(_ptr__)) 567 #else 568 #define SILC_PTR_TO_32(_ptr__) \ 569 ((SilcUInt32)((SilcUInt64)(_ptr__) & (SilcUInt32)0xFFFFFFFFUL)) 570 #endif 571 /***/ 572 573 /****d* silcutil/SILCTypes/SILC_PTR_TO_64 574 * 575 * NAME 576 * 577 * #define SILC_PTR_TO_64 ... 578 * 579 * DESCRIPTION 580 * 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 583 * of different size. 584 * 585 * SOURCE 586 */ 587 #if SILC_SIZEOF_VOID_P < 8 588 #define SILC_PTR_TO_64(_ptr__) ((SilcUInt64)((SilcUInt32)(_ptr__))) 589 #else 590 #define SILC_PTR_TO_64(_ptr__) ((SilcUInt64)((SilcUInt64)(_ptr__))) 591 #endif 592 /***/ 593 594 /****d* silcutil/SILCTypes/SILC_32_TO_PTR 595 * 596 * NAME 597 * 598 * #define SILC_32_TO_PTR ... 599 * 600 * DESCRIPTION 601 * 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 604 * different size. 605 * 606 * SOURCE 607 */ 608 #if SILC_SIZEOF_VOID_P < 8 609 #define SILC_32_TO_PTR(_ival__) ((void *)((SilcUInt32)(_ival__))) 610 #else 611 #define SILC_32_TO_PTR(_ival__) ((void *)((SilcUInt64)(_ival__))) 612 #endif 613 /***/ 614 615 /****d* silcutil/SILCTypes/SILC_64_TO_PTR 616 * 617 * NAME 618 * 619 * #define SILC_64_TO_PTR ... 620 * 621 * DESCRIPTION 622 * 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 625 * different size. 626 * 627 * SOURCE 628 */ 629 #if SILC_SIZEOF_VOID_P < 8 630 #define SILC_64_TO_PTR(_ival__) \ 631 ((void *)((SilcUInt32)((SilcUInt64)(_ival__) & (SilcUInt32)0xFFFFFFFFUL))) 632 #else 633 #define SILC_64_TO_PTR(_ival__) ((void *)((SilcUInt64)(_ival__))) 634 #endif 635 /***/ 636 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]; 643 644 #endif /* SILCTYPES_H */ 645