119304Speter/*-
219304Speter * Copyright (c) 1994
319304Speter *	The Regents of the University of California.  All rights reserved.
419304Speter * Copyright (c) 1994, 1995, 1996
519304Speter *	Keith Bostic.  All rights reserved.
619304Speter *
719304Speter * See the LICENSE file for redistribution information.
819304Speter *
9254225Speter *	$Id: util.h,v 10.7 2013/02/24 21:00:10 zy Exp $
1019304Speter */
1119304Speter
1219304Speter/* Macros to init/set/clear/test flags. */
1319304Speter#define	FL_INIT(l, f)	(l) = (f)		/* Specific flags location. */
1419304Speter#define	FL_SET(l, f)	((l) |= (f))
1519304Speter#define	FL_CLR(l, f)	((l) &= ~(f))
1619304Speter#define	FL_ISSET(l, f)	((l) & (f))
1719304Speter
1819304Speter#define	LF_INIT(f)	FL_INIT(flags, f)	/* Local variable flags. */
1919304Speter#define	LF_SET(f)	FL_SET(flags, f)
2019304Speter#define	LF_CLR(f)	FL_CLR(flags, f)
2119304Speter#define	LF_ISSET(f)	FL_ISSET(flags, f)
2219304Speter
2319304Speter#define	F_INIT(p, f)	FL_INIT((p)->flags, f)	/* Structure element flags. */
2419304Speter#define	F_SET(p, f)	FL_SET((p)->flags, f)
2519304Speter#define	F_CLR(p, f)	FL_CLR((p)->flags, f)
2619304Speter#define	F_ISSET(p, f)	FL_ISSET((p)->flags, f)
2719304Speter
2819304Speter/* Offset to next column of stop size, e.g. tab offsets. */
2919304Speter#define	COL_OFF(c, stop)	((stop) - ((c) % (stop)))
3019304Speter
3119304Speter/* Busy message types. */
3219304Spetertypedef enum { B_NONE, B_OFF, B_READ, B_RECOVER, B_SEARCH, B_WRITE } bmsg_t;
3319304Speter
3419304Speter/*
3519304Speter * Number handling defines and protoypes.
3619304Speter *
3719304Speter * NNFITS:	test for addition of two negative numbers under a limit
3819304Speter * NPFITS:	test for addition of two positive numbers under a limit
3919304Speter * NADD_SLONG:	test for addition of two signed longs
4019304Speter * NADD_USLONG:	test for addition of two unsigned longs
4119304Speter */
4219304Speterenum nresult { NUM_ERR, NUM_OK, NUM_OVER, NUM_UNDER };
4319304Speter#define	NNFITS(min, cur, add)						\
4419304Speter	(((long)(min)) - (cur) <= (add))
4519304Speter#define	NPFITS(max, cur, add)						\
4619304Speter	(((unsigned long)(max)) - (cur) >= (add))
4719304Speter#define	NADD_SLONG(sp, v1, v2)						\
4819304Speter	((v1) < 0 ?							\
4919304Speter	    ((v2) < 0 &&						\
5019304Speter	    NNFITS(LONG_MIN, (v1), (v2))) ? NUM_UNDER : NUM_OK :	\
5119304Speter	 (v1) > 0 ?							\
5219304Speter	    (v2) > 0 &&							\
5319304Speter	    NPFITS(LONG_MAX, (v1), (v2)) ? NUM_OK : NUM_OVER :		\
5419304Speter	 NUM_OK)
5519304Speter#define	NADD_USLONG(sp, v1, v2)						\
5619304Speter	(NPFITS(ULONG_MAX, (v1), (v2)) ? NUM_OK : NUM_OVER)
57254225Speter
58254225Speter/* Macros for min/max. */
59254225Speter#undef	MIN
60254225Speter#undef	MAX
61254225Speter#define	MIN(_a,_b)	((_a)<(_b)?(_a):(_b))
62254225Speter#define	MAX(_a,_b)	((_a)<(_b)?(_b):(_a))
63254225Speter
64254225Speter/* Operations on timespecs */
65254225Speter#undef timespecclear
66254225Speter#undef timespecisset
67254225Speter#undef timespeccmp
68254225Speter#undef timespecadd
69254225Speter#undef timespecsub
70254225Speter#define	timespecclear(tvp)	((tvp)->tv_sec = (tvp)->tv_nsec = 0)
71254225Speter#define	timespecisset(tvp)	((tvp)->tv_sec || (tvp)->tv_nsec)
72254225Speter#define	timespeccmp(tvp, uvp, cmp)					\
73254225Speter	(((tvp)->tv_sec == (uvp)->tv_sec) ?				\
74254225Speter	    ((tvp)->tv_nsec cmp (uvp)->tv_nsec) :			\
75254225Speter	    ((tvp)->tv_sec cmp (uvp)->tv_sec))
76254225Speter#define timespecadd(vvp, uvp)						\
77254225Speter	do {								\
78254225Speter		(vvp)->tv_sec += (uvp)->tv_sec;				\
79254225Speter		(vvp)->tv_nsec += (uvp)->tv_nsec;			\
80254225Speter		if ((vvp)->tv_nsec >= 1000000000) {			\
81254225Speter			(vvp)->tv_sec++;				\
82254225Speter			(vvp)->tv_nsec -= 1000000000;			\
83254225Speter		}							\
84254225Speter	} while (0)
85254225Speter#define timespecsub(vvp, uvp)						\
86254225Speter	do {								\
87254225Speter		(vvp)->tv_sec -= (uvp)->tv_sec;				\
88254225Speter		(vvp)->tv_nsec -= (uvp)->tv_nsec;			\
89254225Speter		if ((vvp)->tv_nsec < 0) {				\
90254225Speter			(vvp)->tv_sec--;				\
91254225Speter			(vvp)->tv_nsec += 1000000000;			\
92254225Speter		}							\
93254225Speter	} while (0)
94