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