diff options
Diffstat (limited to 'src/openvpn/integer.h')
-rw-r--r-- | src/openvpn/integer.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/openvpn/integer.h b/src/openvpn/integer.h new file mode 100644 index 0000000..f0fc196 --- /dev/null +++ b/src/openvpn/integer.h @@ -0,0 +1,114 @@ +/* + * 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. + * + * Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net> + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef INTEGER_H +#define INTEGER_H + +#include "error.h" + +/* + * min/max functions + */ + +static inline int +max_int (int x, int y) +{ + if (x > y) + return x; + else + return y; +} + +static inline int +min_int (int x, int y) +{ + if (x < y) + return x; + else + return y; +} + +static inline int +constrain_int (int x, int min, int max) +{ + if (min > max) + return min; + if (x < min) + return min; + else if (x > max) + return max; + else + return x; +} + +/* + * 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) +{ + 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; +} + +/* + * 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) +{ + 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; +} + +static inline int +index_verify (int index, int size, const char *file, int line) +{ + 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; +} + +#endif |