1/*
2 * support.h - Useful definitions and macros. Originated from the Linux-NTFS project.
3 *
4 * Copyright (c) 2000-2004 Anton Altaparmakov
5 *
6 * This program/include file is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as published
8 * by the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program/include file is distributed in the hope that it will be
12 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program (in the main directory of the NTFS-3G
18 * distribution in the file COPYING); if not, write to the Free Software
19 * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 */
21
22#ifndef _NTFS_SUPPORT_H
23#define _NTFS_SUPPORT_H
24
25#ifdef HAVE_CONFIG_H
26#include "config.h"
27#endif
28
29#ifdef HAVE_STDDEF_H
30#include <stddef.h>
31#endif
32
33/*
34 * Our mailing list. Use this define to prevent typos in email address.
35 */
36#define NTFS_DEV_LIST	"ntfs-3g-devel@lists.sf.net"
37
38/*
39 * Generic macro to convert pointers to values for comparison purposes.
40 */
41#ifndef p2n
42#define p2n(p)		((ptrdiff_t)((ptrdiff_t*)(p)))
43#endif
44
45/*
46 * The classic min and max macros.
47 */
48#ifndef min
49#define min(a,b)	((a) <= (b) ? (a) : (b))
50#endif
51
52#ifndef max
53#define max(a,b)	((a) >= (b) ? (a) : (b))
54#endif
55
56/*
57 * Useful macro for determining the offset of a struct member.
58 */
59#ifndef offsetof
60#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
61#endif
62
63/*
64 * Simple bit operation macros. NOTE: These are NOT atomic.
65 */
66#define test_bit(bit, var)	      ((var) & (1 << (bit)))
67#define set_bit(bit, var)	      (var) |= 1 << (bit)
68#define clear_bit(bit, var)	      (var) &= ~(1 << (bit))
69
70#define test_and_set_bit(bit, var)			\
71({							\
72	const BOOL old_state = test_bit(bit, var);	\
73	set_bit(bit, var);				\
74	old_state;					\
75})
76
77#define test_and_clear_bit(bit, var)			\
78({							\
79	const BOOL old_state = test_bit(bit, var);	\
80	clear_bit(bit, var);				\
81	old_state;					\
82})
83
84#endif /* defined _NTFS_SUPPORT_H */
85
86