src/openvpn/integer.h
6fbf66fa
 /*
  *  OpenVPN -- An application to securely tunnel IP networks
  *             over a single UDP port, with support for SSL/TLS-based
  *             session authentication and key exchange,
  *             packet encryption, packet authentication, and
  *             packet compression.
  *
49979459
  *  Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
6fbf66fa
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2
  *  as published by the Free Software Foundation.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
caa54ac3
  *  You should have received a copy of the GNU General Public License along
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
6fbf66fa
  */
 
 #ifndef INTEGER_H
 #define INTEGER_H
 
 #include "error.h"
 
9d59029a
 #ifndef htonll
 #define htonll(x) ((1==htonl(1)) ? (x) : \
                   ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
 #endif
 
 #ifndef ntohll
 #define ntohll(x) ((1==ntohl(1)) ? (x) : \
                   ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
 #endif
 
6fbf66fa
 /*
  * min/max functions
  */
 
 static inline int
81d882d5
 max_int(int x, int y)
6fbf66fa
 {
81d882d5
     if (x > y)
     {
         return x;
     }
     else
     {
         return y;
     }
6fbf66fa
 }
 
 static inline int
81d882d5
 min_int(int x, int y)
6fbf66fa
 {
81d882d5
     if (x < y)
     {
         return x;
     }
     else
     {
         return y;
     }
6fbf66fa
 }
 
 static inline int
81d882d5
 constrain_int(int x, int min, int max)
6fbf66fa
 {
81d882d5
     if (min > max)
     {
         return min;
     }
     if (x < min)
     {
         return min;
     }
     else if (x > max)
     {
         return max;
     }
     else
     {
         return x;
     }
6fbf66fa
 }
 
 /*
  * Functions used for circular buffer index arithmetic.
  */
 
 /*
  * Return x - y on a circle of circumference mod by shortest path.
  *
  * 0 <= x < mod
  * 0 <= y < mod
  */
 static inline int
 modulo_subtract(int x, int y, int mod)
 {
81d882d5
     const int d1 = x - y;
     const int d2 = (x > y ? -mod : mod) + d1;
     ASSERT(0 <= x && x < mod && 0 <= y && y < mod);
     return abs(d1) > abs(d2) ? d2 : d1;
6fbf66fa
 }
 
 /*
  * Return x + y on a circle of circumference mod.
  *
  * 0 <= x < mod
  * -mod <= y <= mod
  */
 static inline int
 modulo_add(int x, int y, int mod)
 {
81d882d5
     int sum = x + y;
     ASSERT(0 <= x && x < mod && -mod <= y && y <= mod);
     if (sum >= mod)
     {
         sum -= mod;
     }
     if (sum < 0)
     {
         sum += mod;
     }
     return sum;
6fbf66fa
 }
 
9fc0e963
 /*
  * Return the next largest power of 2
  * or u if u is a power of 2.
  */
 static inline size_t
 adjust_power_of_2(size_t u)
 {
     size_t ret = 1;
 
     while (ret < u)
     {
         ret <<= 1;
         ASSERT(ret > 0);
     }
 
     return ret;
 }
 
6fbf66fa
 static inline int
81d882d5
 index_verify(int index, int size, const char *file, int line)
6fbf66fa
 {
81d882d5
     if (index < 0 || index >= size)
     {
         msg(M_FATAL, "Assertion Failed: Array index=%d out of bounds for array size=%d in %s:%d",
             index,
             size,
             file,
             line);
     }
     return index;
6fbf66fa
 }
 
81d882d5
 #endif /* ifndef INTEGER_H */