1*f8fb3368SJohn Marino /*-
2*f8fb3368SJohn Marino  * Copyright (c) 2009 Joseph Koshy
3*f8fb3368SJohn Marino  * All rights reserved.
4*f8fb3368SJohn Marino  *
5*f8fb3368SJohn Marino  * Redistribution and use in source and binary forms, with or without
6*f8fb3368SJohn Marino  * modification, are permitted provided that the following conditions
7*f8fb3368SJohn Marino  * are met:
8*f8fb3368SJohn Marino  * 1. Redistributions of source code must retain the above copyright
9*f8fb3368SJohn Marino  *    notice, this list of conditions and the following disclaimer.
10*f8fb3368SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
11*f8fb3368SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
12*f8fb3368SJohn Marino  *    documentation and/or other materials provided with the distribution.
13*f8fb3368SJohn Marino  *
14*f8fb3368SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*f8fb3368SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*f8fb3368SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*f8fb3368SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*f8fb3368SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*f8fb3368SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*f8fb3368SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*f8fb3368SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*f8fb3368SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*f8fb3368SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*f8fb3368SJohn Marino  * SUCH DAMAGE.
25*f8fb3368SJohn Marino  *
26*f8fb3368SJohn Marino  * $Id: _elftc.h 3244 2015-08-31 19:53:08Z emaste $
27*f8fb3368SJohn Marino  */
28*f8fb3368SJohn Marino 
29*f8fb3368SJohn Marino /**
30*f8fb3368SJohn Marino  ** Miscellanous definitions needed by multiple components.
31*f8fb3368SJohn Marino  **/
32*f8fb3368SJohn Marino 
33*f8fb3368SJohn Marino #ifndef	_ELFTC_H
34*f8fb3368SJohn Marino #define	_ELFTC_H
35*f8fb3368SJohn Marino 
36*f8fb3368SJohn Marino #ifndef	NULL
37*f8fb3368SJohn Marino #define NULL 	((void *) 0)
38*f8fb3368SJohn Marino #endif
39*f8fb3368SJohn Marino 
40*f8fb3368SJohn Marino #ifndef	offsetof
41*f8fb3368SJohn Marino #define	offsetof(T, M)		((int) &((T*) 0) -> M)
42*f8fb3368SJohn Marino #endif
43*f8fb3368SJohn Marino 
44*f8fb3368SJohn Marino /* --QUEUE-MACROS-- [[ */
45*f8fb3368SJohn Marino 
46*f8fb3368SJohn Marino /*
47*f8fb3368SJohn Marino  * Supply macros missing from <sys/queue.h>
48*f8fb3368SJohn Marino  */
49*f8fb3368SJohn Marino 
50*f8fb3368SJohn Marino /*
51*f8fb3368SJohn Marino  * Copyright (c) 1991, 1993
52*f8fb3368SJohn Marino  *	The Regents of the University of California.  All rights reserved.
53*f8fb3368SJohn Marino  *
54*f8fb3368SJohn Marino  * Redistribution and use in source and binary forms, with or without
55*f8fb3368SJohn Marino  * modification, are permitted provided that the following conditions
56*f8fb3368SJohn Marino  * are met:
57*f8fb3368SJohn Marino  * 1. Redistributions of source code must retain the above copyright
58*f8fb3368SJohn Marino  *    notice, this list of conditions and the following disclaimer.
59*f8fb3368SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
60*f8fb3368SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
61*f8fb3368SJohn Marino  *    documentation and/or other materials provided with the distribution.
62*f8fb3368SJohn Marino  * 3. Neither the name of the University nor the names of its contributors
63*f8fb3368SJohn Marino  *    may be used to endorse or promote products derived from this software
64*f8fb3368SJohn Marino  *    without specific prior written permission.
65*f8fb3368SJohn Marino  *
66*f8fb3368SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
67*f8fb3368SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
68*f8fb3368SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
69*f8fb3368SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
70*f8fb3368SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
71*f8fb3368SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
72*f8fb3368SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
73*f8fb3368SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
74*f8fb3368SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
75*f8fb3368SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
76*f8fb3368SJohn Marino  * SUCH DAMAGE.
77*f8fb3368SJohn Marino  */
78*f8fb3368SJohn Marino 
79*f8fb3368SJohn Marino #ifndef	LIST_FOREACH_SAFE
80*f8fb3368SJohn Marino #define	LIST_FOREACH_SAFE(var, head, field, tvar)		\
81*f8fb3368SJohn Marino 	for ((var) = LIST_FIRST((head));			\
82*f8fb3368SJohn Marino 	    (var) && ((tvar) = LIST_NEXT((var), field), 1);	\
83*f8fb3368SJohn Marino 	    (var) = (tvar))
84*f8fb3368SJohn Marino #endif
85*f8fb3368SJohn Marino 
86*f8fb3368SJohn Marino #ifndef	SLIST_FOREACH_SAFE
87*f8fb3368SJohn Marino #define	SLIST_FOREACH_SAFE(var, head, field, tvar)		\
88*f8fb3368SJohn Marino 	for ((var) = SLIST_FIRST((head));			\
89*f8fb3368SJohn Marino 	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);	\
90*f8fb3368SJohn Marino 	    (var) = (tvar))
91*f8fb3368SJohn Marino #endif
92*f8fb3368SJohn Marino 
93*f8fb3368SJohn Marino #ifndef	STAILQ_CONCAT
94*f8fb3368SJohn Marino #define	STAILQ_CONCAT(head1, head2) do {			\
95*f8fb3368SJohn Marino 	if (!STAILQ_EMPTY((head2))) {				\
96*f8fb3368SJohn Marino 		*(head1)->stqh_last = (head2)->stqh_first;	\
97*f8fb3368SJohn Marino 		(head1)->stqh_last = (head2)->stqh_last;	\
98*f8fb3368SJohn Marino 		STAILQ_INIT((head2));				\
99*f8fb3368SJohn Marino 	}							\
100*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
101*f8fb3368SJohn Marino #endif
102*f8fb3368SJohn Marino 
103*f8fb3368SJohn Marino #ifndef	STAILQ_EMPTY
104*f8fb3368SJohn Marino #define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
105*f8fb3368SJohn Marino #endif
106*f8fb3368SJohn Marino 
107*f8fb3368SJohn Marino #ifndef	STAILQ_ENTRY
108*f8fb3368SJohn Marino #define	STAILQ_ENTRY(type)					\
109*f8fb3368SJohn Marino struct {							\
110*f8fb3368SJohn Marino 	struct type *stqe_next;	/* next element */		\
111*f8fb3368SJohn Marino }
112*f8fb3368SJohn Marino #endif
113*f8fb3368SJohn Marino 
114*f8fb3368SJohn Marino #ifndef	STAILQ_FIRST
115*f8fb3368SJohn Marino #define	STAILQ_FIRST(head)	((head)->stqh_first)
116*f8fb3368SJohn Marino #endif
117*f8fb3368SJohn Marino 
118*f8fb3368SJohn Marino #ifndef	STAILQ_HEAD
119*f8fb3368SJohn Marino #define	STAILQ_HEAD(name, type)					\
120*f8fb3368SJohn Marino struct name {							\
121*f8fb3368SJohn Marino 	struct type *stqh_first; /* first element */		\
122*f8fb3368SJohn Marino 	struct type **stqh_last; /* addr of last next element */ \
123*f8fb3368SJohn Marino }
124*f8fb3368SJohn Marino #endif
125*f8fb3368SJohn Marino 
126*f8fb3368SJohn Marino #ifndef	STAILQ_HEAD_INITIALIZER
127*f8fb3368SJohn Marino #define	STAILQ_HEAD_INITIALIZER(head)				\
128*f8fb3368SJohn Marino 	{ NULL, &(head).stqh_first }
129*f8fb3368SJohn Marino #endif
130*f8fb3368SJohn Marino 
131*f8fb3368SJohn Marino #ifndef	STAILQ_FOREACH
132*f8fb3368SJohn Marino #define	STAILQ_FOREACH(var, head, field)			\
133*f8fb3368SJohn Marino 	for ((var) = ((head)->stqh_first);			\
134*f8fb3368SJohn Marino 		(var);						\
135*f8fb3368SJohn Marino 		(var) = ((var)->field.stqe_next))
136*f8fb3368SJohn Marino #endif
137*f8fb3368SJohn Marino 
138*f8fb3368SJohn Marino #ifndef	STAILQ_FOREACH_SAFE
139*f8fb3368SJohn Marino #define STAILQ_FOREACH_SAFE(var, head, field, tvar)		\
140*f8fb3368SJohn Marino        for ((var) = STAILQ_FIRST((head));			\
141*f8fb3368SJohn Marino 	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);	\
142*f8fb3368SJohn Marino 	    (var) = (tvar))
143*f8fb3368SJohn Marino #endif
144*f8fb3368SJohn Marino 
145*f8fb3368SJohn Marino #ifndef	STAILQ_INIT
146*f8fb3368SJohn Marino #define	STAILQ_INIT(head) do {					\
147*f8fb3368SJohn Marino 	(head)->stqh_first = NULL;				\
148*f8fb3368SJohn Marino 	(head)->stqh_last = &(head)->stqh_first;		\
149*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
150*f8fb3368SJohn Marino #endif
151*f8fb3368SJohn Marino 
152*f8fb3368SJohn Marino #ifndef	STAILQ_INSERT_HEAD
153*f8fb3368SJohn Marino #define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
154*f8fb3368SJohn Marino 	if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)	\
155*f8fb3368SJohn Marino 		(head)->stqh_last = &(elm)->field.stqe_next;		\
156*f8fb3368SJohn Marino 	(head)->stqh_first = (elm);					\
157*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
158*f8fb3368SJohn Marino #endif
159*f8fb3368SJohn Marino 
160*f8fb3368SJohn Marino #ifndef	STAILQ_INSERT_TAIL
161*f8fb3368SJohn Marino #define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
162*f8fb3368SJohn Marino 	(elm)->field.stqe_next = NULL;					\
163*f8fb3368SJohn Marino 	*(head)->stqh_last = (elm);					\
164*f8fb3368SJohn Marino 	(head)->stqh_last = &(elm)->field.stqe_next;			\
165*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
166*f8fb3368SJohn Marino #endif
167*f8fb3368SJohn Marino 
168*f8fb3368SJohn Marino #ifndef	STAILQ_INSERT_AFTER
169*f8fb3368SJohn Marino #define	STAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
170*f8fb3368SJohn Marino 	if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
171*f8fb3368SJohn Marino 		(head)->stqh_last = &(elm)->field.stqe_next;		\
172*f8fb3368SJohn Marino 	(listelm)->field.stqe_next = (elm);				\
173*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
174*f8fb3368SJohn Marino #endif
175*f8fb3368SJohn Marino 
176*f8fb3368SJohn Marino #ifndef	STAILQ_LAST
177*f8fb3368SJohn Marino #define STAILQ_LAST(head, type, field)					\
178*f8fb3368SJohn Marino 	(STAILQ_EMPTY((head)) ?					\
179*f8fb3368SJohn Marino 	    NULL : ((struct type *)(void *)				\
180*f8fb3368SJohn Marino 	    ((char *)((head)->stqh_last) - offsetof(struct type, field))))
181*f8fb3368SJohn Marino #endif
182*f8fb3368SJohn Marino 
183*f8fb3368SJohn Marino #ifndef	STAILQ_NEXT
184*f8fb3368SJohn Marino #define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
185*f8fb3368SJohn Marino #endif
186*f8fb3368SJohn Marino 
187*f8fb3368SJohn Marino #ifndef	STAILQ_REMOVE
188*f8fb3368SJohn Marino #define	STAILQ_REMOVE(head, elm, type, field) do {			\
189*f8fb3368SJohn Marino 	if ((head)->stqh_first == (elm)) {				\
190*f8fb3368SJohn Marino 		STAILQ_REMOVE_HEAD((head), field);			\
191*f8fb3368SJohn Marino 	} else {							\
192*f8fb3368SJohn Marino 		struct type *curelm = (head)->stqh_first;		\
193*f8fb3368SJohn Marino 		while (curelm->field.stqe_next != (elm))		\
194*f8fb3368SJohn Marino 			curelm = curelm->field.stqe_next;		\
195*f8fb3368SJohn Marino 		if ((curelm->field.stqe_next =				\
196*f8fb3368SJohn Marino 			curelm->field.stqe_next->field.stqe_next) == NULL) \
197*f8fb3368SJohn Marino 			    (head)->stqh_last = &(curelm)->field.stqe_next; \
198*f8fb3368SJohn Marino 	}								\
199*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
200*f8fb3368SJohn Marino #endif
201*f8fb3368SJohn Marino 
202*f8fb3368SJohn Marino #ifndef	STAILQ_REMOVE_HEAD
203*f8fb3368SJohn Marino #define	STAILQ_REMOVE_HEAD(head, field) do {				\
204*f8fb3368SJohn Marino 	if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == \
205*f8fb3368SJohn Marino 	    NULL)							\
206*f8fb3368SJohn Marino 		(head)->stqh_last = &(head)->stqh_first;		\
207*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
208*f8fb3368SJohn Marino #endif
209*f8fb3368SJohn Marino 
210*f8fb3368SJohn Marino /*
211*f8fb3368SJohn Marino  * The STAILQ_SORT macro is adapted from Simon Tatham's O(n*log(n))
212*f8fb3368SJohn Marino  * mergesort algorithm.
213*f8fb3368SJohn Marino  */
214*f8fb3368SJohn Marino #ifndef	STAILQ_SORT
215*f8fb3368SJohn Marino #define	STAILQ_SORT(head, type, field, cmp) do {			\
216*f8fb3368SJohn Marino 	STAILQ_HEAD(, type) _la, _lb;					\
217*f8fb3368SJohn Marino 	struct type *_p, *_q, *_e;					\
218*f8fb3368SJohn Marino 	int _i, _sz, _nmerges, _psz, _qsz;				\
219*f8fb3368SJohn Marino 									\
220*f8fb3368SJohn Marino 	_sz = 1;							\
221*f8fb3368SJohn Marino 	do {								\
222*f8fb3368SJohn Marino 		_nmerges = 0;						\
223*f8fb3368SJohn Marino 		STAILQ_INIT(&_lb);					\
224*f8fb3368SJohn Marino 		while (!STAILQ_EMPTY((head))) {				\
225*f8fb3368SJohn Marino 			_nmerges++;					\
226*f8fb3368SJohn Marino 			STAILQ_INIT(&_la);				\
227*f8fb3368SJohn Marino 			_psz = 0;					\
228*f8fb3368SJohn Marino 			for (_i = 0; _i < _sz && !STAILQ_EMPTY((head));	\
229*f8fb3368SJohn Marino 			     _i++) {					\
230*f8fb3368SJohn Marino 				_e = STAILQ_FIRST((head));		\
231*f8fb3368SJohn Marino 				if (_e == NULL)				\
232*f8fb3368SJohn Marino 					break;				\
233*f8fb3368SJohn Marino 				_psz++;					\
234*f8fb3368SJohn Marino 				STAILQ_REMOVE_HEAD((head), field);	\
235*f8fb3368SJohn Marino 				STAILQ_INSERT_TAIL(&_la, _e, field);	\
236*f8fb3368SJohn Marino 			}						\
237*f8fb3368SJohn Marino 			_p = STAILQ_FIRST(&_la);			\
238*f8fb3368SJohn Marino 			_qsz = _sz;					\
239*f8fb3368SJohn Marino 			_q = STAILQ_FIRST((head));			\
240*f8fb3368SJohn Marino 			while (_psz > 0 || (_qsz > 0 && _q != NULL)) {	\
241*f8fb3368SJohn Marino 				if (_psz == 0) {			\
242*f8fb3368SJohn Marino 					_e = _q;			\
243*f8fb3368SJohn Marino 					_q = STAILQ_NEXT(_q, field);	\
244*f8fb3368SJohn Marino 					STAILQ_REMOVE_HEAD((head),	\
245*f8fb3368SJohn Marino 					    field);			\
246*f8fb3368SJohn Marino 					_qsz--;				\
247*f8fb3368SJohn Marino 				} else if (_qsz == 0 || _q == NULL) {	\
248*f8fb3368SJohn Marino 					_e = _p;			\
249*f8fb3368SJohn Marino 					_p = STAILQ_NEXT(_p, field);	\
250*f8fb3368SJohn Marino 					STAILQ_REMOVE_HEAD(&_la, field);\
251*f8fb3368SJohn Marino 					_psz--;				\
252*f8fb3368SJohn Marino 				} else if (cmp(_p, _q) <= 0) {		\
253*f8fb3368SJohn Marino 					_e = _p;			\
254*f8fb3368SJohn Marino 					_p = STAILQ_NEXT(_p, field);	\
255*f8fb3368SJohn Marino 					STAILQ_REMOVE_HEAD(&_la, field);\
256*f8fb3368SJohn Marino 					_psz--;				\
257*f8fb3368SJohn Marino 				} else {				\
258*f8fb3368SJohn Marino 					_e = _q;			\
259*f8fb3368SJohn Marino 					_q = STAILQ_NEXT(_q, field);	\
260*f8fb3368SJohn Marino 					STAILQ_REMOVE_HEAD((head),	\
261*f8fb3368SJohn Marino 					    field);			\
262*f8fb3368SJohn Marino 					_qsz--;				\
263*f8fb3368SJohn Marino 				}					\
264*f8fb3368SJohn Marino 				STAILQ_INSERT_TAIL(&_lb, _e, field);	\
265*f8fb3368SJohn Marino 			}						\
266*f8fb3368SJohn Marino 		}							\
267*f8fb3368SJohn Marino 		(head)->stqh_first = _lb.stqh_first;			\
268*f8fb3368SJohn Marino 		(head)->stqh_last = _lb.stqh_last;			\
269*f8fb3368SJohn Marino 		_sz *= 2;						\
270*f8fb3368SJohn Marino 	} while (_nmerges > 1);						\
271*f8fb3368SJohn Marino } while (/*CONSTCOND*/0)
272*f8fb3368SJohn Marino #endif
273*f8fb3368SJohn Marino 
274*f8fb3368SJohn Marino #ifndef	TAILQ_FOREACH_SAFE
275*f8fb3368SJohn Marino #define TAILQ_FOREACH_SAFE(var, head, field, tvar)                      \
276*f8fb3368SJohn Marino 	for ((var) = TAILQ_FIRST((head));                               \
277*f8fb3368SJohn Marino 	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);            \
278*f8fb3368SJohn Marino 	    (var) = (tvar))
279*f8fb3368SJohn Marino #endif
280*f8fb3368SJohn Marino 
281*f8fb3368SJohn Marino /* ]] --QUEUE-MACROS-- */
282*f8fb3368SJohn Marino 
283*f8fb3368SJohn Marino /*
284*f8fb3368SJohn Marino  * VCS Ids.
285*f8fb3368SJohn Marino  */
286*f8fb3368SJohn Marino 
287*f8fb3368SJohn Marino #ifndef	ELFTC_VCSID
288*f8fb3368SJohn Marino 
289*f8fb3368SJohn Marino #if defined(__DragonFly__)
290*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		__RCSID(ID)
291*f8fb3368SJohn Marino #endif
292*f8fb3368SJohn Marino 
293*f8fb3368SJohn Marino #if defined(__FreeBSD__)
294*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		__FBSDID(ID)
295*f8fb3368SJohn Marino #endif
296*f8fb3368SJohn Marino 
297*f8fb3368SJohn Marino #if defined(__APPLE__) || defined(__GLIBC__) || defined(__GNU__) || \
298*f8fb3368SJohn Marino     defined(__linux__)
299*f8fb3368SJohn Marino #if defined(__GNUC__)
300*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
301*f8fb3368SJohn Marino #else
302*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		/**/
303*f8fb3368SJohn Marino #endif
304*f8fb3368SJohn Marino #endif
305*f8fb3368SJohn Marino 
306*f8fb3368SJohn Marino #if defined(__minix)
307*f8fb3368SJohn Marino #if defined(__GNUC__)
308*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
309*f8fb3368SJohn Marino #else
310*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		/**/
311*f8fb3368SJohn Marino #endif	/* __GNU__ */
312*f8fb3368SJohn Marino #endif
313*f8fb3368SJohn Marino 
314*f8fb3368SJohn Marino #if defined(__NetBSD__)
315*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		__RCSID(ID)
316*f8fb3368SJohn Marino #endif
317*f8fb3368SJohn Marino 
318*f8fb3368SJohn Marino #if defined(__OpenBSD__)
319*f8fb3368SJohn Marino #if defined(__GNUC__)
320*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
321*f8fb3368SJohn Marino #else
322*f8fb3368SJohn Marino #define	ELFTC_VCSID(ID)		/**/
323*f8fb3368SJohn Marino #endif	/* __GNUC__ */
324*f8fb3368SJohn Marino #endif
325*f8fb3368SJohn Marino 
326*f8fb3368SJohn Marino #endif	/* ELFTC_VCSID */
327*f8fb3368SJohn Marino 
328*f8fb3368SJohn Marino /*
329*f8fb3368SJohn Marino  * Provide an equivalent for getprogname(3).
330*f8fb3368SJohn Marino  */
331*f8fb3368SJohn Marino 
332*f8fb3368SJohn Marino #ifndef	ELFTC_GETPROGNAME
333*f8fb3368SJohn Marino 
334*f8fb3368SJohn Marino #if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
335*f8fb3368SJohn Marino     defined(__minix) || defined(__NetBSD__)
336*f8fb3368SJohn Marino 
337*f8fb3368SJohn Marino #include <stdlib.h>
338*f8fb3368SJohn Marino 
339*f8fb3368SJohn Marino #define	ELFTC_GETPROGNAME()	getprogname()
340*f8fb3368SJohn Marino 
341*f8fb3368SJohn Marino #endif	/* __DragonFly__ || __FreeBSD__ || __minix || __NetBSD__ */
342*f8fb3368SJohn Marino 
343*f8fb3368SJohn Marino 
344*f8fb3368SJohn Marino #if defined(__GLIBC__) || defined(__linux__)
345*f8fb3368SJohn Marino #ifndef _GNU_SOURCE
346*f8fb3368SJohn Marino /*
347*f8fb3368SJohn Marino  * GLIBC based systems have a global 'char *' pointer referencing
348*f8fb3368SJohn Marino  * the executable's name.
349*f8fb3368SJohn Marino  */
350*f8fb3368SJohn Marino extern const char *program_invocation_short_name;
351*f8fb3368SJohn Marino #endif	/* !_GNU_SOURCE */
352*f8fb3368SJohn Marino 
353*f8fb3368SJohn Marino #define	ELFTC_GETPROGNAME()	program_invocation_short_name
354*f8fb3368SJohn Marino 
355*f8fb3368SJohn Marino #endif	/* __GLIBC__ || __linux__ */
356*f8fb3368SJohn Marino 
357*f8fb3368SJohn Marino 
358*f8fb3368SJohn Marino #if defined(__OpenBSD__)
359*f8fb3368SJohn Marino 
360*f8fb3368SJohn Marino extern const char *__progname;
361*f8fb3368SJohn Marino 
362*f8fb3368SJohn Marino #define	ELFTC_GETPROGNAME()	__progname
363*f8fb3368SJohn Marino 
364*f8fb3368SJohn Marino #endif	/* __OpenBSD__ */
365*f8fb3368SJohn Marino 
366*f8fb3368SJohn Marino #endif	/* ELFTC_GETPROGNAME */
367*f8fb3368SJohn Marino 
368*f8fb3368SJohn Marino 
369*f8fb3368SJohn Marino /**
370*f8fb3368SJohn Marino  ** Per-OS configuration.
371*f8fb3368SJohn Marino  **/
372*f8fb3368SJohn Marino 
373*f8fb3368SJohn Marino #if defined(__APPLE__)
374*f8fb3368SJohn Marino 
375*f8fb3368SJohn Marino #include <libkern/OSByteOrder.h>
376*f8fb3368SJohn Marino #define	htobe32(x)	OSSwapHostToBigInt32(x)
377*f8fb3368SJohn Marino #define	roundup2	roundup
378*f8fb3368SJohn Marino 
379*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
380*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
381*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
382*f8fb3368SJohn Marino 
383*f8fb3368SJohn Marino #define	ELFTC_HAVE_MMAP				1
384*f8fb3368SJohn Marino #define	ELFTC_HAVE_STRMODE			1
385*f8fb3368SJohn Marino 
386*f8fb3368SJohn Marino #define ELFTC_NEED_BYTEORDER_EXTENSIONS		1
387*f8fb3368SJohn Marino #endif /* __APPLE__ */
388*f8fb3368SJohn Marino 
389*f8fb3368SJohn Marino 
390*f8fb3368SJohn Marino #if defined(__DragonFly__)
391*f8fb3368SJohn Marino 
392*f8fb3368SJohn Marino #include <osreldate.h>
393*f8fb3368SJohn Marino #include <sys/endian.h>
394*f8fb3368SJohn Marino 
395*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
396*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
397*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
398*f8fb3368SJohn Marino 
399*f8fb3368SJohn Marino #define	ELFTC_HAVE_MMAP				1
400*f8fb3368SJohn Marino 
401*f8fb3368SJohn Marino #endif
402*f8fb3368SJohn Marino 
403*f8fb3368SJohn Marino #if defined(__GLIBC__) || defined(__linux__)
404*f8fb3368SJohn Marino 
405*f8fb3368SJohn Marino #include <endian.h>
406*f8fb3368SJohn Marino 
407*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER			__BYTE_ORDER
408*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		__LITTLE_ENDIAN
409*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		__BIG_ENDIAN
410*f8fb3368SJohn Marino 
411*f8fb3368SJohn Marino #define	ELFTC_HAVE_MMAP				1
412*f8fb3368SJohn Marino 
413*f8fb3368SJohn Marino /*
414*f8fb3368SJohn Marino  * Debian GNU/Linux and Debian GNU/kFreeBSD do not have strmode(3).
415*f8fb3368SJohn Marino  */
416*f8fb3368SJohn Marino #define	ELFTC_HAVE_STRMODE			0
417*f8fb3368SJohn Marino 
418*f8fb3368SJohn Marino /* Whether we need to supply {be,le}32dec. */
419*f8fb3368SJohn Marino #define ELFTC_NEED_BYTEORDER_EXTENSIONS		1
420*f8fb3368SJohn Marino 
421*f8fb3368SJohn Marino #define	roundup2	roundup
422*f8fb3368SJohn Marino 
423*f8fb3368SJohn Marino #endif	/* __GLIBC__ || __linux__ */
424*f8fb3368SJohn Marino 
425*f8fb3368SJohn Marino 
426*f8fb3368SJohn Marino #if defined(__FreeBSD__)
427*f8fb3368SJohn Marino 
428*f8fb3368SJohn Marino #include <osreldate.h>
429*f8fb3368SJohn Marino #include <sys/endian.h>
430*f8fb3368SJohn Marino 
431*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
432*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
433*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
434*f8fb3368SJohn Marino 
435*f8fb3368SJohn Marino #define	ELFTC_HAVE_MMAP				1
436*f8fb3368SJohn Marino #define	ELFTC_HAVE_STRMODE			1
437*f8fb3368SJohn Marino #if __FreeBSD_version <= 900000
438*f8fb3368SJohn Marino #define	ELFTC_BROKEN_YY_NO_INPUT		1
439*f8fb3368SJohn Marino #endif
440*f8fb3368SJohn Marino #endif	/* __FreeBSD__ */
441*f8fb3368SJohn Marino 
442*f8fb3368SJohn Marino 
443*f8fb3368SJohn Marino #if defined(__minix)
444*f8fb3368SJohn Marino #define	ELFTC_HAVE_MMAP				0
445*f8fb3368SJohn Marino #endif	/* __minix */
446*f8fb3368SJohn Marino 
447*f8fb3368SJohn Marino 
448*f8fb3368SJohn Marino #if defined(__NetBSD__)
449*f8fb3368SJohn Marino 
450*f8fb3368SJohn Marino #include <sys/param.h>
451*f8fb3368SJohn Marino #include <sys/endian.h>
452*f8fb3368SJohn Marino 
453*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
454*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
455*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
456*f8fb3368SJohn Marino 
457*f8fb3368SJohn Marino #define	ELFTC_HAVE_MMAP				1
458*f8fb3368SJohn Marino #define	ELFTC_HAVE_STRMODE			1
459*f8fb3368SJohn Marino #if __NetBSD_Version__ <= 599002100
460*f8fb3368SJohn Marino /* from src/doc/CHANGES: flex(1): Import flex-2.5.35 [christos 20091025] */
461*f8fb3368SJohn Marino /* and 5.99.21 was from Wed Oct 21 21:28:36 2009 UTC */
462*f8fb3368SJohn Marino #  define ELFTC_BROKEN_YY_NO_INPUT		1
463*f8fb3368SJohn Marino #endif
464*f8fb3368SJohn Marino #endif	/* __NetBSD __ */
465*f8fb3368SJohn Marino 
466*f8fb3368SJohn Marino 
467*f8fb3368SJohn Marino #if defined(__OpenBSD__)
468*f8fb3368SJohn Marino 
469*f8fb3368SJohn Marino #include <sys/param.h>
470*f8fb3368SJohn Marino #include <sys/endian.h>
471*f8fb3368SJohn Marino 
472*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
473*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
474*f8fb3368SJohn Marino #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
475*f8fb3368SJohn Marino 
476*f8fb3368SJohn Marino #define	ELFTC_HAVE_MMAP				1
477*f8fb3368SJohn Marino #define	ELFTC_HAVE_STRMODE			1
478*f8fb3368SJohn Marino 
479*f8fb3368SJohn Marino #define	ELFTC_NEED_BYTEORDER_EXTENSIONS		1
480*f8fb3368SJohn Marino #define	roundup2	roundup
481*f8fb3368SJohn Marino 
482*f8fb3368SJohn Marino #endif	/* __OpenBSD__ */
483*f8fb3368SJohn Marino 
484*f8fb3368SJohn Marino #endif	/* _ELFTC_H */
485