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