Fixes compiling peXXigen under MAC OS/X where the wcsncasecmp function is not available.
authorNick Clifton <nickc@redhat.com>
Tue, 24 Feb 2015 17:01:23 +0000 (17:01 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 24 Feb 2015 17:01:23 +0000 (17:01 +0000)
* configure.ac (AC_CHECK_HEADERS): Add wctype.h.
* configure: Regenerate.
* config.in: Regenerate.
* peXXigen.c: Include wctype.h if HAVE_WCTYPE_H is defined.
(u16_mbtowc): Use wint_t types if HAVE_WCTYPE_H is defined.
(rsrc_cmp): Use towlower instead of wcsncasecmp if HAVE_WCTYPE_H
is defined.

bfd/ChangeLog
bfd/config.in
bfd/configure
bfd/configure.ac
bfd/peXXigen.c

index 24e21766c42e256e1bbc3a4b461a1ed5341dcef9..9ed4fd35dd919623d75b07d9981fae48cb446dd8 100644 (file)
@@ -1,3 +1,13 @@
+2015-02-24  Nick Clifton  <nickc@redhat.com>
+
+       * configure.ac (AC_CHECK_HEADERS): Add wctype.h.
+       * configure: Regenerate.
+       * config.in: Regenerate.
+       * peXXigen.c: Include wctype.h if HAVE_WCTYPE_H is defined.
+       (u16_mbtowc): Use wint_t types if HAVE_WCTYPE_H is defined.
+       (rsrc_cmp): Use towlower instead of wcsncasecmp if HAVE_WCTYPE_H
+       is defined.
+
 2015-02-24  Nick Clifton  <nickc@redhat.com>
 
        * pdp11.c (set_section_contents): Pad the .text and .data sections
index b911bf6efd0e3fb097ac108d70b9ee7ad6e5aec5..96a3e7403033eefdca3812a89f605051c6532fa2 100644 (file)
 /* Define to 1 if you have the <wchar.h> header file. */
 #undef HAVE_WCHAR_H
 
+/* Define to 1 if you have the <wctype.h> header file. */
+#undef HAVE_WCTYPE_H
+
 /* Define if <sys/procfs.h> has win32_pstatus_t. */
 #undef HAVE_WIN32_PSTATUS_T
 
index 20b2e2770bcebf60dcc8a41dfed14adbd36bc974..a328813b425a77f772379bf191b73d311cf76981 100755 (executable)
@@ -12988,7 +12988,7 @@ $as_echo "$bfd_cv_build_exeext" >&6; }
 fi
 
 
-for ac_header in alloca.h stddef.h string.h strings.h stdlib.h time.h unistd.h wchar.h
+for ac_header in alloca.h stddef.h string.h strings.h stdlib.h time.h unistd.h wchar.h wctype.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
index cd186893e799491834616eb4e197db2e0176bb18..a1b20358dbf07c51772f3fe4e2dc2fae06c61b27 100644 (file)
@@ -207,7 +207,7 @@ AC_SUBST(BFD_HOSTPTR_T)
 
 BFD_CC_FOR_BUILD
 
-AC_CHECK_HEADERS(alloca.h stddef.h string.h strings.h stdlib.h time.h unistd.h wchar.h)
+AC_CHECK_HEADERS(alloca.h stddef.h string.h strings.h stdlib.h time.h unistd.h wchar.h wctype.h)
 AC_CHECK_HEADERS(fcntl.h sys/file.h sys/time.h sys/stat.h sys/resource.h)
 GCC_HEADER_STDINT(bfd_stdint.h)
 AC_HEADER_TIME
index a7e9f04efebfc8702e5ab9a9c29d04ae3ebe5435..c13c3ff41d8f6addd1a31b5e5ca39b5add723a9f 100644 (file)
@@ -65,6 +65,9 @@
 #ifdef HAVE_WCHAR_H
 #include <wchar.h>
 #endif
+#ifdef HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
 
 /* NOTE: it's strange to be including an architecture specific header
    in what's supposed to be general (to PE/PEI) code.  However, that's
@@ -3537,7 +3540,11 @@ rsrc_write_directory (rsrc_write_data * data,
    putting its 'ucs4_t' representation in *PUC.  */
 
 static unsigned int
+#if defined HAVE_WCTYPE_H
+u16_mbtouc (wint_t * puc, const unsigned short * s, unsigned int n)
+#else
 u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n)
+#endif
 {
   unsigned short c = * s;
 
@@ -3609,20 +3616,34 @@ rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b)
 #elif defined HAVE_WCHAR_H
   {
     unsigned int  i;
+
     res = 0;
     for (i = min (alen, blen); i--; astring += 2, bstring += 2)
       {
+#if defined HAVE_WCTYPE_H
+       wint_t awc;
+       wint_t bwc;
+#else
        wchar_t awc;
        wchar_t bwc;
+#endif
 
-       /* Convert UTF-16 unicode characters into wchar_t characters so
-          that we can then perform a case insensitive comparison.  */
-       int Alen = u16_mbtouc (& awc, (const unsigned short *) astring, 2);
-       int Blen = u16_mbtouc (& bwc, (const unsigned short *) bstring, 2);
+       /* Convert UTF-16 unicode characters into wchar_t characters
+          so that we can then perform a case insensitive comparison.  */
+       unsigned int Alen = u16_mbtouc (& awc, (const unsigned short *) astring, 2);
+       unsigned int Blen = u16_mbtouc (& bwc, (const unsigned short *) bstring, 2);
 
        if (Alen != Blen)
          return Alen - Blen;
+
+#ifdef HAVE_WCTYPE_H
+       awc = towlower (awc);
+       bwc = towlower (bwc);
+
+       res = awc - bwc;
+#else
        res = wcsncasecmp (& awc, & bwc, 1);
+#endif
        if (res)
          break;
       }