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