Home | History | Annotate | Download | only in patched-yasm
      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