xref: /aosp_15_r20/external/libsrtp2/crypto/include/integers.h (revision 90e502c7aef8d77d0622bb67d75435c6190cfc1a)
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