1 /* 2 * integers.h 3 * 4 * defines integer types (or refers to their definitions) 5 * 6 * David A. McGrew 7 * Cisco Systems, Inc. 8 */ 9 10 /* 11 * 12 * Copyright (c) 2001-2017, Cisco Systems, Inc. 13 * All rights reserved. 14 * 15 * Redistribution and use in source and binary forms, with or without 16 * modification, are permitted provided that the following conditions 17 * are met: 18 * 19 * Redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer. 21 * 22 * Redistributions in binary form must reproduce the above 23 * copyright notice, this list of conditions and the following 24 * disclaimer in the documentation and/or other materials provided 25 * with the distribution. 26 * 27 * Neither the name of the Cisco Systems, Inc. nor the names of its 28 * contributors may be used to endorse or promote products derived 29 * from this software without specific prior written permission. 30 * 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 34 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 35 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 38 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 42 * OF THE POSSIBILITY OF SUCH DAMAGE. 43 * 44 */ 45 46 #ifndef INTEGERS_H 47 #define INTEGERS_H 48 49 /* use standard integer definitions, if they're available */ 50 #ifdef HAVE_STDLIB_H 51 #include <stdlib.h> 52 #endif 53 #ifdef HAVE_STDINT_H 54 #include <stdint.h> 55 #endif 56 #ifdef HAVE_INTTYPES_H 57 #include <inttypes.h> 58 #endif 59 #ifdef HAVE_SYS_TYPES_H 60 #include <sys/types.h> 61 #endif 62 #ifdef HAVE_SYS_INT_TYPES_H 63 #include <sys/int_types.h> /* this exists on Sun OS */ 64 #endif 65 #ifdef HAVE_MACHINE_TYPES_H 66 #include <machine/types.h> 67 #endif 68 69 #ifdef __cplusplus 70 extern "C" { 71 #endif 72 73 /* Can we do 64 bit integers? */ 74 #if !defined(HAVE_UINT64_T) 75 #if SIZEOF_UNSIGNED_LONG == 8 76 typedef unsigned long uint64_t; 77 #elif SIZEOF_UNSIGNED_LONG_LONG == 8 78 typedef unsigned long long uint64_t; 79 #else 80 #define NO_64BIT_MATH 1 81 #endif 82 #endif 83 84 /* Reasonable defaults for 32 bit machines - you may need to 85 * edit these definitions for your own machine. */ 86 #ifndef HAVE_UINT8_T 87 typedef unsigned char uint8_t; 88 #endif 89 #ifndef HAVE_UINT16_T 90 typedef unsigned short int uint16_t; 91 #endif 92 #ifndef HAVE_UINT32_T 93 typedef unsigned int uint32_t; 94 #endif 95 #ifndef HAVE_INT32_T 96 typedef int int32_t; 97 #endif 98 99 #if defined(NO_64BIT_MATH) && defined(HAVE_CONFIG_H) 100 typedef double uint64_t; 101 /* assert that sizeof(double) == 8 */ 102 extern uint64_t make64(uint32_t high, uint32_t low); 103 extern uint32_t high32(uint64_t value); 104 extern uint32_t low32(uint64_t value); 105 #endif 106 107 /* These macros are to load and store 32-bit values from un-aligned 108 addresses. This is required for processors that do not allow unaligned 109 loads. */ 110 #ifdef ALIGNMENT_32BIT_REQUIRED 111 /* Note that if it's in a variable, you can memcpy it */ 112 #ifdef WORDS_BIGENDIAN 113 #define PUT_32(addr, value) \ 114 { \ 115 ((unsigned char *)(addr))[0] = (value >> 24); \ 116 ((unsigned char *)(addr))[1] = (value >> 16) & 0xff; \ 117 ((unsigned char *)(addr))[2] = (value >> 8) & 0xff; \ 118 ((unsigned char *)(addr))[3] = (value)&0xff; \ 119 } 120 #define GET_32(addr) \ 121 ((((unsigned char *)(addr))[0] << 24) | \ 122 (((unsigned char *)(addr))[1] << 16) | \ 123 (((unsigned char *)(addr))[2] << 8) | (((unsigned char *)(addr))[3])) 124 #else 125 #define PUT_32(addr, value) \ 126 { \ 127 ((unsigned char *)(addr))[3] = (value >> 24); \ 128 ((unsigned char *)(addr))[2] = (value >> 16) & 0xff; \ 129 ((unsigned char *)(addr))[1] = (value >> 8) & 0xff; \ 130 ((unsigned char *)(addr))[0] = (value)&0xff; \ 131 } 132 #define GET_32(addr) \ 133 ((((unsigned char *)(addr))[3] << 24) | \ 134 (((unsigned char *)(addr))[2] << 16) | \ 135 (((unsigned char *)(addr))[1] << 8) | (((unsigned char *)(addr))[0])) 136 #endif // WORDS_BIGENDIAN 137 #else 138 #define PUT_32(addr, value) *(((uint32_t *) (addr)) = (value) 139 #define GET_32(addr) (*(((uint32_t *) (addr))) 140 #endif 141 142 #ifdef __cplusplus 143 } 144 #endif 145 146 #endif /* INTEGERS_H */ 147