1 /* 2 * YASM utility functions. 3 * 4 * Includes standard headers and defines prototypes for replacement functions 5 * if needed. 6 * 7 * Copyright (C) 2001-2007 Peter Johnson 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 */ 30 #ifndef YASM_UTIL_H 31 #define YASM_UTIL_H 32 33 #ifdef HAVE_CONFIG_H 34 #include <config.h> 35 #endif 36 37 #if defined(HAVE_GNU_C_LIBRARY) || defined(__MINGW32__) || defined(__DJGPP__) 38 39 /* Work around glibc's non-defining of certain things when using gcc -ansi */ 40 # ifdef __STRICT_ANSI__ 41 # undef __STRICT_ANSI__ 42 # endif 43 44 /* Work around glibc's string inlines (in bits/string2.h) if needed */ 45 # ifdef NO_STRING_INLINES 46 # define __NO_STRING_INLINES 47 # endif 48 49 #endif 50 51 #if !defined(lint) && !defined(NDEBUG) 52 # define NDEBUG 53 #endif 54 55 #include <stdio.h> 56 #include <stdarg.h> 57 58 #include <stddef.h> 59 #include <stdlib.h> 60 #include <string.h> 61 #include <assert.h> 62 63 #ifdef HAVE_STRINGS_H 64 #include <strings.h> 65 #endif 66 67 #include <libyasm-stdint.h> 68 #include <libyasm/coretype.h> 69 70 #ifdef lint 71 # define _(String) String 72 #else 73 # ifdef HAVE_LOCALE_H 74 # include <locale.h> 75 # endif 76 77 # ifdef ENABLE_NLS 78 # include <libintl.h> 79 # define _(String) gettext(String) 80 # else 81 # define gettext(Msgid) (Msgid) 82 # define dgettext(Domainname, Msgid) (Msgid) 83 # define dcgettext(Domainname, Msgid, Category) (Msgid) 84 # define textdomain(Domainname) while (0) /* nothing */ 85 # define bindtextdomain(Domainname, Dirname) while (0) /* nothing */ 86 # define _(String) (String) 87 # endif 88 #endif 89 90 #ifdef gettext_noop 91 # define N_(String) gettext_noop(String) 92 #else 93 # define N_(String) (String) 94 #endif 95 96 #ifdef HAVE_MERGESORT 97 #define yasm__mergesort(a, b, c, d) mergesort(a, b, c, d) 98 #endif 99 100 #ifdef HAVE_STRSEP 101 #define yasm__strsep(a, b) strsep(a, b) 102 #endif 103 104 #ifdef HAVE_STRCASECMP 105 # define yasm__strcasecmp(x, y) strcasecmp(x, y) 106 # define yasm__strncasecmp(x, y, n) strncasecmp(x, y, n) 107 #elif HAVE_STRICMP 108 # define yasm__strcasecmp(x, y) stricmp(x, y) 109 # define yasm__strncasecmp(x, y, n) strnicmp(x, y, n) 110 #elif HAVE__STRICMP 111 # define yasm__strcasecmp(x, y) _stricmp(x, y) 112 # define yasm__strncasecmp(x, y, n) _strnicmp(x, y, n) 113 #elif HAVE_STRCMPI 114 # define yasm__strcasecmp(x, y) strcmpi(x, y) 115 # define yasm__strncasecmp(x, y, n) strncmpi(x, y, n) 116 #else 117 # define USE_OUR_OWN_STRCASECMP 118 #endif 119 120 #include <libyasm/compat-queue.h> 121 122 #ifdef WITH_DMALLOC 123 # include <dmalloc.h> 124 # define yasm__xstrdup(str) xstrdup(str) 125 # define yasm_xmalloc(size) xmalloc(size) 126 # define yasm_xcalloc(count, size) xcalloc(count, size) 127 # define yasm_xrealloc(ptr, size) xrealloc(ptr, size) 128 # define yasm_xfree(ptr) xfree(ptr) 129 #endif 130 131 /* Bit-counting: used primarily by HAMT but also in a few other places. */ 132 #define BC_TWO(c) (0x1ul << (c)) 133 #define BC_MSK(c) (((unsigned long)(-1)) / (BC_TWO(BC_TWO(c)) + 1ul)) 134 #define BC_COUNT(x,c) ((x) & BC_MSK(c)) + (((x) >> (BC_TWO(c))) & BC_MSK(c)) 135 #define BitCount(d, s) do { \ 136 d = BC_COUNT(s, 0); \ 137 d = BC_COUNT(d, 1); \ 138 d = BC_COUNT(d, 2); \ 139 d = BC_COUNT(d, 3); \ 140 d = BC_COUNT(d, 4); \ 141 } while (0) 142 143 /** Determine if a value is exactly a power of 2. Zero is treated as a power 144 * of two. 145 * \param x value 146 * \return Nonzero if x is a power of 2. 147 */ 148 #define is_exp2(x) ((x & (x - 1)) == 0) 149 150 #ifndef NELEMS 151 /** Get the number of elements in an array. 152 * \internal 153 * \param array array 154 * \return Number of elements. 155 */ 156 #define NELEMS(array) (sizeof(array) / sizeof(array[0])) 157 #endif 158 159 #endif 160