1/* 2 * OpenVPN -- An application to securely tunnel IP networks 3 * over a single UDP port, with support for SSL/TLS-based 4 * session authentication and key exchange, 5 * packet encryption, packet authentication, and 6 * packet compression. 7 * 8 * Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 12 * as published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program (see the file COPYING included with this 21 * distribution); if not, write to the Free Software Foundation, Inc., 22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 */ 24 25#ifndef INTEGER_H 26#define INTEGER_H 27 28#include "error.h" 29 30/* 31 * min/max functions 32 */ 33 34static inline int 35max_int (int x, int y) 36{ 37 if (x > y) 38 return x; 39 else 40 return y; 41} 42 43static inline int 44min_int (int x, int y) 45{ 46 if (x < y) 47 return x; 48 else 49 return y; 50} 51 52static inline int 53constrain_int (int x, int min, int max) 54{ 55 if (min > max) 56 return min; 57 if (x < min) 58 return min; 59 else if (x > max) 60 return max; 61 else 62 return x; 63} 64 65/* 66 * Functions used for circular buffer index arithmetic. 67 */ 68 69/* 70 * Return x - y on a circle of circumference mod by shortest path. 71 * 72 * 0 <= x < mod 73 * 0 <= y < mod 74 */ 75static inline int 76modulo_subtract(int x, int y, int mod) 77{ 78 const int d1 = x - y; 79 const int d2 = (x > y ? -mod : mod) + d1; 80 ASSERT (0 <= x && x < mod && 0 <= y && y < mod); 81 return abs(d1) > abs(d2) ? d2 : d1; 82} 83 84/* 85 * Return x + y on a circle of circumference mod. 86 * 87 * 0 <= x < mod 88 * -mod <= y <= mod 89 */ 90static inline int 91modulo_add(int x, int y, int mod) 92{ 93 int sum = x + y; 94 ASSERT (0 <= x && x < mod && -mod <= y && y <= mod); 95 if (sum >= mod) 96 sum -= mod; 97 if (sum < 0) 98 sum += mod; 99 return sum; 100} 101 102static inline int 103index_verify (int index, int size, const char *file, int line) 104{ 105 if (index < 0 || index >= size) 106 msg (M_FATAL, "Assertion Failed: Array index=%d out of bounds for array size=%d in %s:%d", 107 index, 108 size, 109 file, 110 line); 111 return index; 112} 113 114#endif 115