12de3b87aSKai Wang /*-
22de3b87aSKai Wang  * Copyright (c) 2009 Joseph Koshy
32de3b87aSKai Wang  * All rights reserved.
42de3b87aSKai Wang  *
52de3b87aSKai Wang  * Redistribution and use in source and binary forms, with or without
62de3b87aSKai Wang  * modification, are permitted provided that the following conditions
72de3b87aSKai Wang  * are met:
82de3b87aSKai Wang  * 1. Redistributions of source code must retain the above copyright
92de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer.
102de3b87aSKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
112de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer in the
122de3b87aSKai Wang  *    documentation and/or other materials provided with the distribution.
132de3b87aSKai Wang  *
142de3b87aSKai Wang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
152de3b87aSKai Wang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
162de3b87aSKai Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
172de3b87aSKai Wang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
182de3b87aSKai Wang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
192de3b87aSKai Wang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
202de3b87aSKai Wang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
212de3b87aSKai Wang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
222de3b87aSKai Wang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
232de3b87aSKai Wang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
242de3b87aSKai Wang  * SUCH DAMAGE.
252de3b87aSKai Wang  *
26b6b6f9ccSEd Maste  * $Id: _elftc.h 3446 2016-05-03 01:31:17Z emaste $
272de3b87aSKai Wang  */
282de3b87aSKai Wang 
292de3b87aSKai Wang /**
30b6b6f9ccSEd Maste  ** Miscellaneous definitions needed by multiple components.
312de3b87aSKai Wang  **/
322de3b87aSKai Wang 
332de3b87aSKai Wang #ifndef	_ELFTC_H
342de3b87aSKai Wang #define	_ELFTC_H
352de3b87aSKai Wang 
362de3b87aSKai Wang #ifndef	NULL
372de3b87aSKai Wang #define NULL 	((void *) 0)
382de3b87aSKai Wang #endif
392de3b87aSKai Wang 
402de3b87aSKai Wang #ifndef	offsetof
412de3b87aSKai Wang #define	offsetof(T, M)		((int) &((T*) 0) -> M)
422de3b87aSKai Wang #endif
432de3b87aSKai Wang 
442de3b87aSKai Wang /* --QUEUE-MACROS-- [[ */
452de3b87aSKai Wang 
462de3b87aSKai Wang /*
472de3b87aSKai Wang  * Supply macros missing from <sys/queue.h>
482de3b87aSKai Wang  */
492de3b87aSKai Wang 
502de3b87aSKai Wang /*
512de3b87aSKai Wang  * Copyright (c) 1991, 1993
522de3b87aSKai Wang  *	The Regents of the University of California.  All rights reserved.
532de3b87aSKai Wang  *
542de3b87aSKai Wang  * Redistribution and use in source and binary forms, with or without
552de3b87aSKai Wang  * modification, are permitted provided that the following conditions
562de3b87aSKai Wang  * are met:
572de3b87aSKai Wang  * 1. Redistributions of source code must retain the above copyright
582de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer.
592de3b87aSKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
602de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer in the
612de3b87aSKai Wang  *    documentation and/or other materials provided with the distribution.
622de3b87aSKai Wang  * 3. Neither the name of the University nor the names of its contributors
632de3b87aSKai Wang  *    may be used to endorse or promote products derived from this software
642de3b87aSKai Wang  *    without specific prior written permission.
652de3b87aSKai Wang  *
662de3b87aSKai Wang  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
672de3b87aSKai Wang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
682de3b87aSKai Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
692de3b87aSKai Wang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
702de3b87aSKai Wang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
712de3b87aSKai Wang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
722de3b87aSKai Wang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
732de3b87aSKai Wang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
742de3b87aSKai Wang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
752de3b87aSKai Wang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
762de3b87aSKai Wang  * SUCH DAMAGE.
772de3b87aSKai Wang  */
782de3b87aSKai Wang 
7971a0c925SEd Maste #ifndef	LIST_FOREACH_SAFE
8071a0c925SEd Maste #define	LIST_FOREACH_SAFE(var, head, field, tvar)		\
8171a0c925SEd Maste 	for ((var) = LIST_FIRST((head));			\
8271a0c925SEd Maste 	    (var) && ((tvar) = LIST_NEXT((var), field), 1);	\
8371a0c925SEd Maste 	    (var) = (tvar))
8471a0c925SEd Maste #endif
8571a0c925SEd Maste 
862de3b87aSKai Wang #ifndef	SLIST_FOREACH_SAFE
872de3b87aSKai Wang #define	SLIST_FOREACH_SAFE(var, head, field, tvar)		\
882de3b87aSKai Wang 	for ((var) = SLIST_FIRST((head));			\
892de3b87aSKai Wang 	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);	\
902de3b87aSKai Wang 	    (var) = (tvar))
912de3b87aSKai Wang #endif
922de3b87aSKai Wang 
932de3b87aSKai Wang #ifndef	STAILQ_CONCAT
942de3b87aSKai Wang #define	STAILQ_CONCAT(head1, head2) do {			\
952de3b87aSKai Wang 	if (!STAILQ_EMPTY((head2))) {				\
962de3b87aSKai Wang 		*(head1)->stqh_last = (head2)->stqh_first;	\
972de3b87aSKai Wang 		(head1)->stqh_last = (head2)->stqh_last;	\
982de3b87aSKai Wang 		STAILQ_INIT((head2));				\
992de3b87aSKai Wang 	}							\
1002de3b87aSKai Wang } while (/*CONSTCOND*/0)
1012de3b87aSKai Wang #endif
1022de3b87aSKai Wang 
1032de3b87aSKai Wang #ifndef	STAILQ_EMPTY
1042de3b87aSKai Wang #define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
1052de3b87aSKai Wang #endif
1062de3b87aSKai Wang 
1072de3b87aSKai Wang #ifndef	STAILQ_ENTRY
1082de3b87aSKai Wang #define	STAILQ_ENTRY(type)					\
1092de3b87aSKai Wang struct {							\
1102de3b87aSKai Wang 	struct type *stqe_next;	/* next element */		\
1112de3b87aSKai Wang }
1122de3b87aSKai Wang #endif
1132de3b87aSKai Wang 
1142de3b87aSKai Wang #ifndef	STAILQ_FIRST
1152de3b87aSKai Wang #define	STAILQ_FIRST(head)	((head)->stqh_first)
1162de3b87aSKai Wang #endif
1172de3b87aSKai Wang 
1182de3b87aSKai Wang #ifndef	STAILQ_HEAD
1192de3b87aSKai Wang #define	STAILQ_HEAD(name, type)					\
1202de3b87aSKai Wang struct name {							\
1212de3b87aSKai Wang 	struct type *stqh_first; /* first element */		\
1222de3b87aSKai Wang 	struct type **stqh_last; /* addr of last next element */ \
1232de3b87aSKai Wang }
1242de3b87aSKai Wang #endif
1252de3b87aSKai Wang 
1262de3b87aSKai Wang #ifndef	STAILQ_HEAD_INITIALIZER
1272de3b87aSKai Wang #define	STAILQ_HEAD_INITIALIZER(head)				\
1282de3b87aSKai Wang 	{ NULL, &(head).stqh_first }
1292de3b87aSKai Wang #endif
1302de3b87aSKai Wang 
1312de3b87aSKai Wang #ifndef	STAILQ_FOREACH
1322de3b87aSKai Wang #define	STAILQ_FOREACH(var, head, field)			\
1332de3b87aSKai Wang 	for ((var) = ((head)->stqh_first);			\
1342de3b87aSKai Wang 		(var);						\
1352de3b87aSKai Wang 		(var) = ((var)->field.stqe_next))
1362de3b87aSKai Wang #endif
1372de3b87aSKai Wang 
1382de3b87aSKai Wang #ifndef	STAILQ_FOREACH_SAFE
1392de3b87aSKai Wang #define STAILQ_FOREACH_SAFE(var, head, field, tvar)		\
1402de3b87aSKai Wang        for ((var) = STAILQ_FIRST((head));			\
1412de3b87aSKai Wang 	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);	\
1422de3b87aSKai Wang 	    (var) = (tvar))
1432de3b87aSKai Wang #endif
1442de3b87aSKai Wang 
1452de3b87aSKai Wang #ifndef	STAILQ_INIT
1462de3b87aSKai Wang #define	STAILQ_INIT(head) do {					\
1472de3b87aSKai Wang 	(head)->stqh_first = NULL;				\
1482de3b87aSKai Wang 	(head)->stqh_last = &(head)->stqh_first;		\
1492de3b87aSKai Wang } while (/*CONSTCOND*/0)
1502de3b87aSKai Wang #endif
1512de3b87aSKai Wang 
1522de3b87aSKai Wang #ifndef	STAILQ_INSERT_HEAD
1532de3b87aSKai Wang #define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
1542de3b87aSKai Wang 	if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)	\
1552de3b87aSKai Wang 		(head)->stqh_last = &(elm)->field.stqe_next;		\
1562de3b87aSKai Wang 	(head)->stqh_first = (elm);					\
1572de3b87aSKai Wang } while (/*CONSTCOND*/0)
1582de3b87aSKai Wang #endif
1592de3b87aSKai Wang 
1602de3b87aSKai Wang #ifndef	STAILQ_INSERT_TAIL
1612de3b87aSKai Wang #define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
1622de3b87aSKai Wang 	(elm)->field.stqe_next = NULL;					\
1632de3b87aSKai Wang 	*(head)->stqh_last = (elm);					\
1642de3b87aSKai Wang 	(head)->stqh_last = &(elm)->field.stqe_next;			\
1652de3b87aSKai Wang } while (/*CONSTCOND*/0)
1662de3b87aSKai Wang #endif
1672de3b87aSKai Wang 
1682de3b87aSKai Wang #ifndef	STAILQ_INSERT_AFTER
1692de3b87aSKai Wang #define	STAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
1702de3b87aSKai Wang 	if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
1712de3b87aSKai Wang 		(head)->stqh_last = &(elm)->field.stqe_next;		\
1722de3b87aSKai Wang 	(listelm)->field.stqe_next = (elm);				\
1732de3b87aSKai Wang } while (/*CONSTCOND*/0)
1742de3b87aSKai Wang #endif
1752de3b87aSKai Wang 
1762de3b87aSKai Wang #ifndef	STAILQ_LAST
1772de3b87aSKai Wang #define STAILQ_LAST(head, type, field)					\
1782de3b87aSKai Wang 	(STAILQ_EMPTY((head)) ?					\
1792de3b87aSKai Wang 	    NULL : ((struct type *)(void *)				\
1802de3b87aSKai Wang 	    ((char *)((head)->stqh_last) - offsetof(struct type, field))))
1812de3b87aSKai Wang #endif
1822de3b87aSKai Wang 
1832de3b87aSKai Wang #ifndef	STAILQ_NEXT
1842de3b87aSKai Wang #define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
1852de3b87aSKai Wang #endif
1862de3b87aSKai Wang 
1872de3b87aSKai Wang #ifndef	STAILQ_REMOVE
1882de3b87aSKai Wang #define	STAILQ_REMOVE(head, elm, type, field) do {			\
1892de3b87aSKai Wang 	if ((head)->stqh_first == (elm)) {				\
1902de3b87aSKai Wang 		STAILQ_REMOVE_HEAD((head), field);			\
1912de3b87aSKai Wang 	} else {							\
1922de3b87aSKai Wang 		struct type *curelm = (head)->stqh_first;		\
1932de3b87aSKai Wang 		while (curelm->field.stqe_next != (elm))		\
1942de3b87aSKai Wang 			curelm = curelm->field.stqe_next;		\
1952de3b87aSKai Wang 		if ((curelm->field.stqe_next =				\
1962de3b87aSKai Wang 			curelm->field.stqe_next->field.stqe_next) == NULL) \
1972de3b87aSKai Wang 			    (head)->stqh_last = &(curelm)->field.stqe_next; \
1982de3b87aSKai Wang 	}								\
1992de3b87aSKai Wang } while (/*CONSTCOND*/0)
2002de3b87aSKai Wang #endif
2012de3b87aSKai Wang 
2022de3b87aSKai Wang #ifndef	STAILQ_REMOVE_HEAD
2032de3b87aSKai Wang #define	STAILQ_REMOVE_HEAD(head, field) do {				\
2042de3b87aSKai Wang 	if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == \
2052de3b87aSKai Wang 	    NULL)							\
2062de3b87aSKai Wang 		(head)->stqh_last = &(head)->stqh_first;		\
2072de3b87aSKai Wang } while (/*CONSTCOND*/0)
2082de3b87aSKai Wang #endif
2092de3b87aSKai Wang 
2102de3b87aSKai Wang /*
2112de3b87aSKai Wang  * The STAILQ_SORT macro is adapted from Simon Tatham's O(n*log(n))
2122de3b87aSKai Wang  * mergesort algorithm.
2132de3b87aSKai Wang  */
2142de3b87aSKai Wang #ifndef	STAILQ_SORT
2152de3b87aSKai Wang #define	STAILQ_SORT(head, type, field, cmp) do {			\
2162de3b87aSKai Wang 	STAILQ_HEAD(, type) _la, _lb;					\
2172de3b87aSKai Wang 	struct type *_p, *_q, *_e;					\
2182de3b87aSKai Wang 	int _i, _sz, _nmerges, _psz, _qsz;				\
2192de3b87aSKai Wang 									\
2202de3b87aSKai Wang 	_sz = 1;							\
2212de3b87aSKai Wang 	do {								\
2222de3b87aSKai Wang 		_nmerges = 0;						\
2232de3b87aSKai Wang 		STAILQ_INIT(&_lb);					\
2242de3b87aSKai Wang 		while (!STAILQ_EMPTY((head))) {				\
2252de3b87aSKai Wang 			_nmerges++;					\
2262de3b87aSKai Wang 			STAILQ_INIT(&_la);				\
2272de3b87aSKai Wang 			_psz = 0;					\
2282de3b87aSKai Wang 			for (_i = 0; _i < _sz && !STAILQ_EMPTY((head));	\
2292de3b87aSKai Wang 			     _i++) {					\
2302de3b87aSKai Wang 				_e = STAILQ_FIRST((head));		\
2312de3b87aSKai Wang 				if (_e == NULL)				\
2322de3b87aSKai Wang 					break;				\
2332de3b87aSKai Wang 				_psz++;					\
2342de3b87aSKai Wang 				STAILQ_REMOVE_HEAD((head), field);	\
2352de3b87aSKai Wang 				STAILQ_INSERT_TAIL(&_la, _e, field);	\
2362de3b87aSKai Wang 			}						\
2372de3b87aSKai Wang 			_p = STAILQ_FIRST(&_la);			\
2382de3b87aSKai Wang 			_qsz = _sz;					\
2392de3b87aSKai Wang 			_q = STAILQ_FIRST((head));			\
2402de3b87aSKai Wang 			while (_psz > 0 || (_qsz > 0 && _q != NULL)) {	\
2412de3b87aSKai Wang 				if (_psz == 0) {			\
2422de3b87aSKai Wang 					_e = _q;			\
2432de3b87aSKai Wang 					_q = STAILQ_NEXT(_q, field);	\
2442de3b87aSKai Wang 					STAILQ_REMOVE_HEAD((head),	\
2452de3b87aSKai Wang 					    field);			\
2462de3b87aSKai Wang 					_qsz--;				\
2472de3b87aSKai Wang 				} else if (_qsz == 0 || _q == NULL) {	\
2482de3b87aSKai Wang 					_e = _p;			\
2492de3b87aSKai Wang 					_p = STAILQ_NEXT(_p, field);	\
2502de3b87aSKai Wang 					STAILQ_REMOVE_HEAD(&_la, field);\
2512de3b87aSKai Wang 					_psz--;				\
2522de3b87aSKai Wang 				} else if (cmp(_p, _q) <= 0) {		\
2532de3b87aSKai Wang 					_e = _p;			\
2542de3b87aSKai Wang 					_p = STAILQ_NEXT(_p, field);	\
2552de3b87aSKai Wang 					STAILQ_REMOVE_HEAD(&_la, field);\
2562de3b87aSKai Wang 					_psz--;				\
2572de3b87aSKai Wang 				} else {				\
2582de3b87aSKai Wang 					_e = _q;			\
2592de3b87aSKai Wang 					_q = STAILQ_NEXT(_q, field);	\
2602de3b87aSKai Wang 					STAILQ_REMOVE_HEAD((head),	\
2612de3b87aSKai Wang 					    field);			\
2622de3b87aSKai Wang 					_qsz--;				\
2632de3b87aSKai Wang 				}					\
2642de3b87aSKai Wang 				STAILQ_INSERT_TAIL(&_lb, _e, field);	\
2652de3b87aSKai Wang 			}						\
2662de3b87aSKai Wang 		}							\
2672de3b87aSKai Wang 		(head)->stqh_first = _lb.stqh_first;			\
2682de3b87aSKai Wang 		(head)->stqh_last = _lb.stqh_last;			\
2692de3b87aSKai Wang 		_sz *= 2;						\
2702de3b87aSKai Wang 	} while (_nmerges > 1);						\
2712de3b87aSKai Wang } while (/*CONSTCOND*/0)
2722de3b87aSKai Wang #endif
2732de3b87aSKai Wang 
2742de3b87aSKai Wang #ifndef	TAILQ_FOREACH_SAFE
2752de3b87aSKai Wang #define TAILQ_FOREACH_SAFE(var, head, field, tvar)                      \
2762de3b87aSKai Wang 	for ((var) = TAILQ_FIRST((head));                               \
2772de3b87aSKai Wang 	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);            \
2782de3b87aSKai Wang 	    (var) = (tvar))
2792de3b87aSKai Wang #endif
2802de3b87aSKai Wang 
2812de3b87aSKai Wang /* ]] --QUEUE-MACROS-- */
2822de3b87aSKai Wang 
2832de3b87aSKai Wang /*
2842de3b87aSKai Wang  * VCS Ids.
2852de3b87aSKai Wang  */
2862de3b87aSKai Wang 
2872de3b87aSKai Wang #ifndef	ELFTC_VCSID
2882de3b87aSKai Wang 
2892de3b87aSKai Wang #if defined(__DragonFly__)
2902de3b87aSKai Wang #define	ELFTC_VCSID(ID)		__RCSID(ID)
2912de3b87aSKai Wang #endif
2922de3b87aSKai Wang 
2932de3b87aSKai Wang #if defined(__FreeBSD__)
2942de3b87aSKai Wang #define	ELFTC_VCSID(ID)		__FBSDID(ID)
2952de3b87aSKai Wang #endif
2962de3b87aSKai Wang 
29767d97fe7SEd Maste #if defined(__APPLE__) || defined(__GLIBC__) || defined(__GNU__) || \
29867d97fe7SEd Maste     defined(__linux__)
2992de3b87aSKai Wang #if defined(__GNUC__)
3002de3b87aSKai Wang #define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
3012de3b87aSKai Wang #else
3022de3b87aSKai Wang #define	ELFTC_VCSID(ID)		/**/
3032de3b87aSKai Wang #endif
3042de3b87aSKai Wang #endif
3052de3b87aSKai Wang 
3062de3b87aSKai Wang #if defined(__minix)
3072de3b87aSKai Wang #if defined(__GNUC__)
3082de3b87aSKai Wang #define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
3092de3b87aSKai Wang #else
3102de3b87aSKai Wang #define	ELFTC_VCSID(ID)		/**/
3112de3b87aSKai Wang #endif	/* __GNU__ */
3122de3b87aSKai Wang #endif
3132de3b87aSKai Wang 
3142de3b87aSKai Wang #if defined(__NetBSD__)
3152de3b87aSKai Wang #define	ELFTC_VCSID(ID)		__RCSID(ID)
3162de3b87aSKai Wang #endif
3172de3b87aSKai Wang 
3182de3b87aSKai Wang #if defined(__OpenBSD__)
3192de3b87aSKai Wang #if defined(__GNUC__)
3202de3b87aSKai Wang #define	ELFTC_VCSID(ID)		__asm__(".ident\t\"" ID "\"")
3212de3b87aSKai Wang #else
3222de3b87aSKai Wang #define	ELFTC_VCSID(ID)		/**/
3232de3b87aSKai Wang #endif	/* __GNUC__ */
3242de3b87aSKai Wang #endif
3252de3b87aSKai Wang 
3262de3b87aSKai Wang #endif	/* ELFTC_VCSID */
3272de3b87aSKai Wang 
3282de3b87aSKai Wang /*
3292de3b87aSKai Wang  * Provide an equivalent for getprogname(3).
3302de3b87aSKai Wang  */
3312de3b87aSKai Wang 
3322de3b87aSKai Wang #ifndef	ELFTC_GETPROGNAME
3332de3b87aSKai Wang 
33467d97fe7SEd Maste #if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
33567d97fe7SEd Maste     defined(__minix) || defined(__NetBSD__)
3362de3b87aSKai Wang 
3372de3b87aSKai Wang #include <stdlib.h>
3382de3b87aSKai Wang 
3392de3b87aSKai Wang #define	ELFTC_GETPROGNAME()	getprogname()
3402de3b87aSKai Wang 
3412de3b87aSKai Wang #endif	/* __DragonFly__ || __FreeBSD__ || __minix || __NetBSD__ */
3422de3b87aSKai Wang 
3432de3b87aSKai Wang 
34467d97fe7SEd Maste #if defined(__GLIBC__) || defined(__linux__)
3453ef90571SEd Maste #ifndef _GNU_SOURCE
3462de3b87aSKai Wang /*
3472de3b87aSKai Wang  * GLIBC based systems have a global 'char *' pointer referencing
3482de3b87aSKai Wang  * the executable's name.
3492de3b87aSKai Wang  */
3502de3b87aSKai Wang extern const char *program_invocation_short_name;
3513ef90571SEd Maste #endif	/* !_GNU_SOURCE */
3522de3b87aSKai Wang 
3532de3b87aSKai Wang #define	ELFTC_GETPROGNAME()	program_invocation_short_name
3542de3b87aSKai Wang 
35567d97fe7SEd Maste #endif	/* __GLIBC__ || __linux__ */
3562de3b87aSKai Wang 
3572de3b87aSKai Wang 
3582de3b87aSKai Wang #if defined(__OpenBSD__)
3592de3b87aSKai Wang 
3602de3b87aSKai Wang extern const char *__progname;
3612de3b87aSKai Wang 
3622de3b87aSKai Wang #define	ELFTC_GETPROGNAME()	__progname
3632de3b87aSKai Wang 
3642de3b87aSKai Wang #endif	/* __OpenBSD__ */
3652de3b87aSKai Wang 
3662de3b87aSKai Wang #endif	/* ELFTC_GETPROGNAME */
3672de3b87aSKai Wang 
3682de3b87aSKai Wang 
3692de3b87aSKai Wang /**
3702de3b87aSKai Wang  ** Per-OS configuration.
3712de3b87aSKai Wang  **/
3722de3b87aSKai Wang 
37367d97fe7SEd Maste #if defined(__APPLE__)
37467d97fe7SEd Maste 
375656f49f8SEd Maste #include <libkern/OSByteOrder.h>
376656f49f8SEd Maste #define	htobe32(x)	OSSwapHostToBigInt32(x)
377b46517aaSAlex Richardson #define	htole32(x)	OSSwapHostToLittleInt32(x)
378b46517aaSAlex Richardson #ifndef roundup2
37967d97fe7SEd Maste #define	roundup2	roundup
380b46517aaSAlex Richardson #endif
38167d97fe7SEd Maste 
382b46517aaSAlex Richardson #define	ELFTC_BYTE_ORDER			__DARWIN_BYTE_ORDER
383b46517aaSAlex Richardson #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		__DARWIN_LITTLE_ENDIAN
384b46517aaSAlex Richardson #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		__DARWIN_BIG_ENDIAN
38567d97fe7SEd Maste 
38667d97fe7SEd Maste #define	ELFTC_HAVE_MMAP				1
38767d97fe7SEd Maste #define	ELFTC_HAVE_STRMODE			1
38867d97fe7SEd Maste 
389656f49f8SEd Maste #define ELFTC_NEED_BYTEORDER_EXTENSIONS		1
39067d97fe7SEd Maste #endif /* __APPLE__ */
39167d97fe7SEd Maste 
39267d97fe7SEd Maste 
3932de3b87aSKai Wang #if defined(__DragonFly__)
3942de3b87aSKai Wang 
3952de3b87aSKai Wang #include <osreldate.h>
3962de3b87aSKai Wang #include <sys/endian.h>
3972de3b87aSKai Wang 
3982de3b87aSKai Wang #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
3992de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
4002de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
4012de3b87aSKai Wang 
4022de3b87aSKai Wang #define	ELFTC_HAVE_MMAP				1
4032de3b87aSKai Wang 
4042de3b87aSKai Wang #endif
4052de3b87aSKai Wang 
40667d97fe7SEd Maste #if defined(__GLIBC__) || defined(__linux__)
4072de3b87aSKai Wang 
4082de3b87aSKai Wang #include <endian.h>
4092de3b87aSKai Wang 
4102de3b87aSKai Wang #define	ELFTC_BYTE_ORDER			__BYTE_ORDER
4112de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		__LITTLE_ENDIAN
4122de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		__BIG_ENDIAN
4132de3b87aSKai Wang 
4142de3b87aSKai Wang #define	ELFTC_HAVE_MMAP				1
4152de3b87aSKai Wang 
4162de3b87aSKai Wang /*
4172de3b87aSKai Wang  * Debian GNU/Linux and Debian GNU/kFreeBSD do not have strmode(3).
4182de3b87aSKai Wang  */
4192de3b87aSKai Wang #define	ELFTC_HAVE_STRMODE			0
4202de3b87aSKai Wang 
4212de3b87aSKai Wang /* Whether we need to supply {be,le}32dec. */
4222de3b87aSKai Wang #define ELFTC_NEED_BYTEORDER_EXTENSIONS		1
4232de3b87aSKai Wang 
424b46517aaSAlex Richardson #ifndef roundup2
4252de3b87aSKai Wang #define	roundup2	roundup
426b46517aaSAlex Richardson #endif
4272de3b87aSKai Wang 
42867d97fe7SEd Maste #endif	/* __GLIBC__ || __linux__ */
4292de3b87aSKai Wang 
4302de3b87aSKai Wang 
4312de3b87aSKai Wang #if defined(__FreeBSD__)
4322de3b87aSKai Wang 
4332de3b87aSKai Wang #include <osreldate.h>
4342de3b87aSKai Wang #include <sys/endian.h>
4352de3b87aSKai Wang 
4362de3b87aSKai Wang #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
4372de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
4382de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
4392de3b87aSKai Wang 
4402de3b87aSKai Wang #define	ELFTC_HAVE_MMAP				1
4412de3b87aSKai Wang #define	ELFTC_HAVE_STRMODE			1
4422de3b87aSKai Wang #if __FreeBSD_version <= 900000
4432de3b87aSKai Wang #define	ELFTC_BROKEN_YY_NO_INPUT		1
4442de3b87aSKai Wang #endif
4452de3b87aSKai Wang #endif	/* __FreeBSD__ */
4462de3b87aSKai Wang 
4472de3b87aSKai Wang 
4482de3b87aSKai Wang #if defined(__minix)
4492de3b87aSKai Wang #define	ELFTC_HAVE_MMAP				0
4502de3b87aSKai Wang #endif	/* __minix */
4512de3b87aSKai Wang 
4522de3b87aSKai Wang 
4532de3b87aSKai Wang #if defined(__NetBSD__)
4542de3b87aSKai Wang 
4552de3b87aSKai Wang #include <sys/param.h>
4562de3b87aSKai Wang #include <sys/endian.h>
4572de3b87aSKai Wang 
4582de3b87aSKai Wang #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
4592de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
4602de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
4612de3b87aSKai Wang 
4622de3b87aSKai Wang #define	ELFTC_HAVE_MMAP				1
4632de3b87aSKai Wang #define	ELFTC_HAVE_STRMODE			1
4642de3b87aSKai Wang #if __NetBSD_Version__ <= 599002100
4652de3b87aSKai Wang /* from src/doc/CHANGES: flex(1): Import flex-2.5.35 [christos 20091025] */
4662de3b87aSKai Wang /* and 5.99.21 was from Wed Oct 21 21:28:36 2009 UTC */
4672de3b87aSKai Wang #  define ELFTC_BROKEN_YY_NO_INPUT		1
4682de3b87aSKai Wang #endif
4692de3b87aSKai Wang #endif	/* __NetBSD __ */
4702de3b87aSKai Wang 
4712de3b87aSKai Wang 
4722de3b87aSKai Wang #if defined(__OpenBSD__)
4732de3b87aSKai Wang 
4742de3b87aSKai Wang #include <sys/param.h>
4752de3b87aSKai Wang #include <sys/endian.h>
4762de3b87aSKai Wang 
4772de3b87aSKai Wang #define	ELFTC_BYTE_ORDER			_BYTE_ORDER
4782de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_LITTLE_ENDIAN		_LITTLE_ENDIAN
4792de3b87aSKai Wang #define	ELFTC_BYTE_ORDER_BIG_ENDIAN		_BIG_ENDIAN
4802de3b87aSKai Wang 
4812de3b87aSKai Wang #define	ELFTC_HAVE_MMAP				1
4822de3b87aSKai Wang #define	ELFTC_HAVE_STRMODE			1
4832de3b87aSKai Wang 
4842de3b87aSKai Wang #define	ELFTC_NEED_BYTEORDER_EXTENSIONS		1
4852de3b87aSKai Wang #define	roundup2	roundup
4862de3b87aSKai Wang 
4872de3b87aSKai Wang #endif	/* __OpenBSD__ */
4882de3b87aSKai Wang 
4892de3b87aSKai Wang #endif	/* _ELFTC_H */
490