changeset 12951:dbe2adea8676

wctype: Avoid #define replacements in C++ mode.
author Bruno Haible <bruno@clisp.org>
date Mon, 08 Mar 2010 01:56:19 +0100
parents 0d37d2127e54
children 41b26ea3dacc
files ChangeLog lib/wctype.in.h m4/wctype_h.m4 modules/wctype
diffstat 4 files changed, 176 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2010-03-07  Bruno Haible  <bruno@clisp.org>
 
+	wctype: Avoid #define replacements in C++ mode.
+	* lib/wctype.in.h: Include c++defs.h, warn-on-use.h.
+	(iswalnum, iswalpha, iswblank, iswcntrl, iswdigit, iswgraph, iswlower,
+	iswprint, iswpunct, iswspace, iswupper, iswxdigit, towlower, towupper):
+	In C++, define a namespaced alias symbol.
+	* m4/wctype_h.m4 (gl_WCTYPE_H): Don't set WCTYPE_H.
+	* modules/wctype (Depends-on): Add c++defs, warn-on-use.
+	(Makefile.am): Provide a wctype.h replacement always. Update wctype.h
+	rule.
+
 	wchar: Avoid #define replacements in C++ mode.
 	* lib/wchar.in.h: Include c++defs.h.
 	(btowc, wctob, mbsinit, mbrtowc, mbrlen, mbsrtowcs, mbsnrtowcs,
--- a/lib/wctype.in.h
+++ b/lib/wctype.in.h
@@ -54,6 +54,10 @@
 #ifndef _GL_WCTYPE_H
 #define _GL_WCTYPE_H
 
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
 /* Define wint_t.  (Also done in wchar.in.h.)  */
 #if !@HAVE_WINT_T@ && !defined wint_t
 # define wint_t int
@@ -62,9 +66,6 @@
 # endif
 #endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
    Linux libc5 has <wctype.h> and the functions but they are broken.
@@ -93,73 +94,120 @@
 
 /* Linux libc5 has <wctype.h> and the functions but they are broken.  */
 # if @REPLACE_ISWCNTRL@
-#  define iswalnum rpl_iswalnum
-#  define iswalpha rpl_iswalpha
-#  define iswblank rpl_iswblank
-#  define iswcntrl rpl_iswcntrl
-#  define iswdigit rpl_iswdigit
-#  define iswgraph rpl_iswgraph
-#  define iswlower rpl_iswlower
-#  define iswprint rpl_iswprint
-#  define iswpunct rpl_iswpunct
-#  define iswspace rpl_iswspace
-#  define iswupper rpl_iswupper
-#  define iswxdigit rpl_iswxdigit
-#  define towlower rpl_towlower
-#  define towupper rpl_towupper
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define iswalnum rpl_iswalnum
+#   define iswalpha rpl_iswalpha
+#   define iswblank rpl_iswblank
+#   define iswcntrl rpl_iswcntrl
+#   define iswdigit rpl_iswdigit
+#   define iswgraph rpl_iswgraph
+#   define iswlower rpl_iswlower
+#   define iswprint rpl_iswprint
+#   define iswpunct rpl_iswpunct
+#   define iswspace rpl_iswspace
+#   define iswupper rpl_iswupper
+#   define iswxdigit rpl_iswxdigit
+#   define towlower rpl_towlower
+#   define towupper rpl_towupper
+#  endif
 # endif
 
 static inline int
-iswalnum (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswalnum
+# else
+iswalnum
+# endif
+         (wint_t wc)
 {
   return ((wc >= '0' && wc <= '9')
           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
 }
 
 static inline int
-iswalpha (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswalpha
+# else
+iswalpha
+# endif
+         (wint_t wc)
 {
   return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
 }
 
 static inline int
-iswblank (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswblank
+# else
+iswblank
+# endif
+         (wint_t wc)
 {
   return wc == ' ' || wc == '\t';
 }
 
 static inline int
-iswcntrl (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswcntrl
+# else
+iswcntrl
+# endif
+        (wint_t wc)
 {
   return (wc & ~0x1f) == 0 || wc == 0x7f;
 }
 
 static inline int
-iswdigit (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswdigit
+# else
+iswdigit
+# endif
+         (wint_t wc)
 {
   return wc >= '0' && wc <= '9';
 }
 
 static inline int
-iswgraph (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswgraph
+# else
+iswgraph
+# endif
+         (wint_t wc)
 {
   return wc >= '!' && wc <= '~';
 }
 
 static inline int
-iswlower (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswlower
+# else
+iswlower
+# endif
+         (wint_t wc)
 {
   return wc >= 'a' && wc <= 'z';
 }
 
 static inline int
-iswprint (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswprint
+# else
+iswprint
+# endif
+         (wint_t wc)
 {
   return wc >= ' ' && wc <= '~';
 }
 
 static inline int
-iswpunct (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswpunct
+# else
+iswpunct
+# endif
+         (wint_t wc)
 {
   return (wc >= '!' && wc <= '~'
           && !((wc >= '0' && wc <= '9')
@@ -167,33 +215,58 @@
 }
 
 static inline int
-iswspace (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswspace
+# else
+iswspace
+# endif
+         (wint_t wc)
 {
   return (wc == ' ' || wc == '\t'
           || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
 }
 
 static inline int
-iswupper (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswupper
+# else
+iswupper
+# endif
+         (wint_t wc)
 {
   return wc >= 'A' && wc <= 'Z';
 }
 
 static inline int
-iswxdigit (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_iswxdigit
+# else
+iswxdigit
+# endif
+          (wint_t wc)
 {
   return ((wc >= '0' && wc <= '9')
           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
 }
 
 static inline wint_t
-towlower (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_towlower
+# else
+towlower
+# endif
+         (wint_t wc)
 {
   return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
 }
 
 static inline wint_t
-towupper (wint_t wc)
+# if @REPLACE_ISWCNTRL@
+rpl_towupper
+# else
+towupper
+# endif
+         (wint_t wc)
 {
   return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
 }
@@ -220,20 +293,71 @@
 {
   return (wint_t) (wchar_t) towlower (wc);
 }
-# define towlower rpl_towlower
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#  define towlower rpl_towlower
+# endif
 
 static inline wint_t
 rpl_towupper (wint_t wc)
 {
   return (wint_t) (wchar_t) towupper (wc);
 }
-# define towupper rpl_towupper
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#  define towupper rpl_towupper
+# endif
 
 #endif /* __MINGW32__ */
 
-#ifdef __cplusplus
-}
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
 #endif
+_GL_CXXALIASWARN (iswalnum);
+_GL_CXXALIASWARN (iswalpha);
+_GL_CXXALIASWARN (iswblank);
+_GL_CXXALIASWARN (iswcntrl);
+_GL_CXXALIASWARN (iswdigit);
+_GL_CXXALIASWARN (iswgraph);
+_GL_CXXALIASWARN (iswlower);
+_GL_CXXALIASWARN (iswprint);
+_GL_CXXALIASWARN (iswpunct);
+_GL_CXXALIASWARN (iswspace);
+_GL_CXXALIASWARN (iswupper);
+_GL_CXXALIASWARN (iswxdigit);
+
+#if @REPLACE_ISWCNTRL@ || defined __MINGW32__
+_GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
+#endif
+_GL_CXXALIASWARN (towlower);
+_GL_CXXALIASWARN (towupper);
+
 
 #endif /* _GL_WCTYPE_H */
 #endif /* _GL_WCTYPE_H */
--- a/m4/wctype_h.m4
+++ b/m4/wctype_h.m4
@@ -1,4 +1,4 @@
-# wctype_h.m4 serial 4
+# wctype_h.m4 serial 5
 
 dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
 
@@ -31,7 +31,6 @@
   fi
   AC_SUBST([HAVE_WINT_T])
 
-  WCTYPE_H=wctype.h
   if test $ac_cv_header_wctype_h = yes; then
     if test $ac_cv_func_iswcntrl = yes; then
       dnl Linux libc5 has an iswprint function that returns 0 for all arguments.
@@ -53,27 +52,13 @@
               [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no])
             ])
         ])
-      if test $gl_cv_func_iswcntrl_works = yes; then
-        case "$host_os" in
-          mingw*)
-            dnl On mingw, towlower and towupper return random high 16 bits.
-            ;;
-          *)
-            dnl iswcntrl works. towlower and towupper work as well.
-            WCTYPE_H=
-            ;;
-        esac
-      fi
     fi
-    dnl Compute NEXT_WCTYPE_H even if WCTYPE_H is empty,
-    dnl for the benefit of builds from non-distclean directories.
     gl_CHECK_NEXT_HEADERS([wctype.h])
     HAVE_WCTYPE_H=1
   else
     HAVE_WCTYPE_H=0
   fi
   AC_SUBST([HAVE_WCTYPE_H])
-  AC_SUBST([WCTYPE_H])
 
   if test "$gl_cv_func_iswcntrl_works" = no; then
     REPLACE_ISWCNTRL=1
--- a/modules/wctype
+++ b/modules/wctype
@@ -8,16 +8,18 @@
 
 Depends-on:
 include_next
+c++defs
+warn-on-use
 
 configure.ac:
 gl_WCTYPE_H
 
 Makefile.am:
-BUILT_SOURCES += $(WCTYPE_H)
+BUILT_SOURCES += wctype.h
 
 # We need the following in order to create <wctype.h> when the system
 # doesn't have one that works with the given compiler.
-wctype.h: wctype.in.h
+wctype.h: wctype.in.h $(CXXDEFS_H) $(WARN_ON_USE_H)
 	$(AM_V_GEN)rm -f $@-t $@ && \
 	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
 	  sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
@@ -27,6 +29,8 @@
 	      -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
 	      -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
 	      -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
+	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
 	      < $(srcdir)/wctype.in.h; \
 	} > $@-t && \
 	mv $@-t $@