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