From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1088 invoked by alias); 17 Jul 2007 15:29:16 -0000 Received: (qmail 1071 invoked by uid 22791); 17 Jul 2007 15:29:16 -0000 X-Spam-Check-By: sourceware.org Received: from sunsite.ms.mff.cuni.cz (HELO sunsite.mff.cuni.cz) (195.113.15.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 17 Jul 2007 15:29:11 +0000 Received: from sunsite.mff.cuni.cz (localhost.localdomain [127.0.0.1]) by sunsite.mff.cuni.cz (8.13.8/8.13.8) with ESMTP id l6HFWad0026688; Tue, 17 Jul 2007 17:32:36 +0200 Received: (from jakub@localhost) by sunsite.mff.cuni.cz (8.13.8/8.13.8/Submit) id l6HFWZRc026687; Tue, 17 Jul 2007 17:32:35 +0200 Date: Tue, 17 Jul 2007 15:29:00 -0000 From: Jakub Jelinek To: Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Avoid defining wint_t and wchar_t in stdio.h Message-ID: <20070717153235.GV4603@sunsite.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.2i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2007-07/txt/msg00025.txt.bz2 Hi! ISO C99 doesn't allow stdio.h to define wchar_t or wint_t types as it does ATM. The fix is fairly easy: 1) we don't need gconv.h in stdio.h when not compiling glibc 2) we don't need wchar_t there either 3) wint_t was needed for __mbstate_t definition (but we can use there __WINT_TYPE__ directly for GCC 3.0 and later) and for 3 prototypes which are only used inside of glibc itself or in _IO_putwc_unlocked and _IO_getwc_unlocked macros (but we have no putwc_unlocked or getwc_unlocked inlines, so hiding them is IMHO not a big deal) In addition to this, there were many different places that tried to define wint_t, I think it is preferrable to define these in one place only (__need_wint_t #include ). 2007-07-17 Jakub Jelinek * wcsmbs/wchar.h: Only define wint_t if __need_wint_t. Don't define wint_t when __need_mbstate_t unless it is necessary. (__mbstate_t): Use __WINT_TYPE__ rather than wint_t in the typedef if possible. * wctype/wctype.h (wint_t): Define by including wchar.h with __need_wint_t instead of including stddef.h with __need_wint_t and as fallback definining it ourselves. * iconv/gconv.h (__need_wint_t): Define before including wchar.h. * sysdeps/gnu/_G_config.h: Don't include gconv.h if not _LIBC or _GLIBCPP_USE_WCHAR_T. (__need_wchar_t): Don't define if not _LIBC or _GLIBCPP_USE_WCHAR_T. (__need_wint_t): Don't define before including stddef.h, define before including wchar.h only if _LIBC or _GLIBCPP_USE_WCHAR_T. (_G_iconv_t): Don't define if not _LIBC or _GLIBCPP_USE_WCHAR_T. * sysdeps/mach/hurd/_G_config.h: Likewise. * sysdeps/generic/_G_config.h: Likewise. * libio/libio.h (__wunderflow, __wuflow, __woverflow): Only prototype if _LIBC or _GLIBCPP_USE_WCHAR_T. (_IO_getwc_unlocked, _IO_putwc_unlocked): Only define if _LIBC or _GLIBCPP_USE_WCHAR_T. --- libc/wcsmbs/wchar.h.jj 2007-07-03 12:37:01.000000000 +0200 +++ libc/wcsmbs/wchar.h 2007-07-17 13:21:11.000000000 +0200 @@ -23,7 +23,7 @@ #ifndef _WCHAR_H -#ifndef __need_mbstate_t +#if !defined __need_mbstate_t && !defined __need_wint_t # define _WCHAR_H 1 # include #endif @@ -39,38 +39,40 @@ # define __need___va_list # include +# include + /* Get size_t, wchar_t, wint_t and NULL from . */ # define __need_size_t # define __need_wchar_t # define __need_NULL #endif -#define __need_wint_t -#include - -#include +#if defined _WCHAR_H || defined __need_wint_t || !defined __WINT_TYPE__ +# undef __need_wint_t +# define __need_wint_t +# include /* We try to get wint_t from , but not all GCC versions define it there. So define it ourselves if it remains undefined. */ -#ifndef _WINT_T +# ifndef _WINT_T /* Integral type unchanged by default argument promotions that can hold any value corresponding to members of the extended character set, as well as at least one value that does not correspond to any member of the extended character set. */ -# define _WINT_T +# define _WINT_T typedef unsigned int wint_t; -#else +# else /* Work around problems with the file which doesn't put wint_t in the std namespace. */ -# if defined __cplusplus && defined _GLIBCPP_USE_NAMESPACES \ - && defined __WINT_TYPE__ +# if defined __cplusplus && defined _GLIBCPP_USE_NAMESPACES \ + && defined __WINT_TYPE__ __BEGIN_NAMESPACE_STD typedef __WINT_TYPE__ wint_t; __END_NAMESPACE_STD +# endif # endif #endif - -#ifndef __mbstate_t_defined +#if (defined _WCHAR_H || defined __need_mbstate_t) && !defined __mbstate_t_defined # define __mbstate_t_defined 1 /* Conversion state information. */ typedef struct @@ -78,7 +80,11 @@ typedef struct int __count; union { +# ifdef __WINT_TYPE__ + __WINT_TYPE__ __wch; +# else wint_t __wch; +# endif char __wchb[4]; } __value; /* Value so far. */ } __mbstate_t; --- libc/wctype/wctype.h.jj 2005-09-17 17:45:42.000000000 +0200 +++ libc/wctype/wctype.h 2007-07-17 16:02:25.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2002, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1996-2002, 2005, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -29,22 +29,9 @@ #ifndef __need_iswxxx # define _WCTYPE_H 1 -/* We try to get wint_t from , but not all GCC versions define it - there. So define it ourselves if it remains undefined. */ +/* Get wint_t from . */ # define __need_wint_t -# include -# ifndef _WINT_T -/* Integral type unchanged by default argument promotions that can - hold any value corresponding to members of the extended character - set, as well as at least one value that does not correspond to any - member of the extended character set. */ -# define _WINT_T -typedef unsigned int wint_t; -# else -# ifdef __USE_ISOC99 -__USING_NAMESPACE_C99(wint_t) -# endif -# endif +# include /* Constant expression of type `wint_t' whose value does not correspond to any member of the extended character set. */ --- libc/iconv/gconv.h.jj 2002-12-02 22:44:26.000000000 +0100 +++ libc/iconv/gconv.h 2007-07-17 13:29:43.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-1999, 2000-2002 Free Software Foundation, Inc. +/* Copyright (C) 1997-1999, 2000-2002, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -25,6 +25,7 @@ #include #define __need_mbstate_t +#define __need_wint_t #include #define __need_size_t #define __need_wchar_t --- libc/sysdeps/mach/hurd/_G_config.h.jj 2004-11-09 00:15:46.000000000 +0100 +++ libc/sysdeps/mach/hurd/_G_config.h 2007-07-17 13:49:48.000000000 +0200 @@ -8,19 +8,15 @@ #include #define __need_size_t -#define __need_wchar_t -#define __need_wint_t +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# define __need_wchar_t +#endif #define __need_NULL #include -#ifndef _WINT_T -/* Integral type unchanged by default argument promotions that can - hold any value corresponding to members of the extended character - set, as well as at least one value that does not correspond to any - member of the extended character set. */ -# define _WINT_T -typedef unsigned int wint_t; -#endif #define __need_mbstate_t +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# define __need_wint_t +#endif #include #define _G_size_t size_t typedef struct @@ -41,7 +37,8 @@ typedef struct #define _G_wchar_t wchar_t #define _G_wint_t wint_t #define _G_stat64 stat64 -#include +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# include typedef union { struct __gconv_info __cd; @@ -51,6 +48,7 @@ typedef union struct __gconv_step_data __data; } __combined; } _G_iconv_t; +#endif typedef int _G_int16_t __attribute__ ((__mode__ (__HI__))); typedef int _G_int32_t __attribute__ ((__mode__ (__SI__))); --- libc/sysdeps/generic/_G_config.h.jj 1999-08-15 17:19:28.000000000 +0200 +++ libc/sysdeps/generic/_G_config.h 2007-07-17 13:49:17.000000000 +0200 @@ -8,19 +8,15 @@ #include #define __need_size_t -#define __need_wchar_t -#define __need_wint_t +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# define __need_wchar_t +#endif #define __need_NULL #include -#ifndef _WINT_T -/* Integral type unchanged by default argument promotions that can - hold any value corresponding to members of the extended character - set, as well as at least one value that does not correspond to any - member of the extended character set. */ -# define _WINT_T -typedef unsigned int wint_t; -#endif #define __need_mbstate_t +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# define __need_wint_t +#endif #include #define _G_size_t size_t typedef struct @@ -41,7 +37,8 @@ typedef struct #define _G_wchar_t wchar_t #define _G_wint_t wint_t #define _G_stat64 stat -#include +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# include typedef union { struct __gconv_info __cd; @@ -51,6 +48,7 @@ typedef union struct __gconv_step_data __data; } __combined; } _G_iconv_t; +#endif typedef int _G_int16_t __attribute__ ((__mode__ (__HI__))); typedef int _G_int32_t __attribute__ ((__mode__ (__SI__))); --- libc/sysdeps/gnu/_G_config.h.jj 2004-11-09 00:15:48.000000000 +0100 +++ libc/sysdeps/gnu/_G_config.h 2007-07-17 13:49:14.000000000 +0200 @@ -8,19 +8,15 @@ #include #define __need_size_t -#define __need_wchar_t -#define __need_wint_t +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# define __need_wchar_t +#endif #define __need_NULL #include -#ifndef _WINT_T -/* Integral type unchanged by default argument promotions that can - hold any value corresponding to members of the extended character - set, as well as at least one value that does not correspond to any - member of the extended character set. */ -# define _WINT_T -typedef unsigned int wint_t; -#endif #define __need_mbstate_t +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# define __need_wint_t +#endif #include #define _G_size_t size_t typedef struct @@ -41,7 +37,8 @@ typedef struct #define _G_wchar_t wchar_t #define _G_wint_t wint_t #define _G_stat64 stat64 -#include +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# include typedef union { struct __gconv_info __cd; @@ -51,6 +48,7 @@ typedef union struct __gconv_step_data __data; } __combined; } _G_iconv_t; +#endif typedef int _G_int16_t __attribute__ ((__mode__ (__HI__))); typedef int _G_int32_t __attribute__ ((__mode__ (__SI__))); --- libc/libio/libio.h.jj 2007-04-23 10:54:00.000000000 +0200 +++ libc/libio/libio.h 2007-07-17 13:40:23.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-1995,1997-2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1991-1995,1997-2006,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Per Bothner . @@ -413,9 +413,11 @@ extern "C" { extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T extern _IO_wint_t __wunderflow (_IO_FILE *); extern _IO_wint_t __wuflow (_IO_FILE *); extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); +#endif #if __GNUC__ >= 3 # define _IO_BE(expr, res) __builtin_expect ((expr), res) @@ -435,15 +437,17 @@ extern _IO_wint_t __woverflow (_IO_FILE ? __overflow (_fp, (unsigned char) (_ch)) \ : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch))) -#define _IO_getwc_unlocked(_fp) \ +#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T +# define _IO_getwc_unlocked(_fp) \ (_IO_BE ((_fp)->_wide_data->_IO_read_ptr >= (_fp)->_wide_data->_IO_read_end,\ 0) \ ? __wuflow (_fp) : (_IO_wint_t) *(_fp)->_wide_data->_IO_read_ptr++) -#define _IO_putwc_unlocked(_wch, _fp) \ +# define _IO_putwc_unlocked(_wch, _fp) \ (_IO_BE ((_fp)->_wide_data->_IO_write_ptr \ >= (_fp)->_wide_data->_IO_write_end, 0) \ ? __woverflow (_fp, _wch) \ : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++ = (_wch))) +#endif #define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0) #define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0) Jakub