From patchwork Mon Jun 5 13:45:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zack Weinberg X-Patchwork-Id: 20799 Received: (qmail 37359 invoked by alias); 5 Jun 2017 13:46:02 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 26045 invoked by uid 89); 5 Jun 2017 13:45:41 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=Printing, utilities, 2148, 71521 X-HELO: l2mail1.panix.com From: Zack Weinberg To: libc-alpha@sourceware.org Subject: [PATCH 2/5] Remove __need macros from stdio.h and wchar.h. Date: Mon, 5 Jun 2017 09:45:21 -0400 Message-Id: <20170605134524.6460-3-zackw@panix.com> In-Reply-To: <20170605134524.6460-1-zackw@panix.com> References: <20170605134524.6460-1-zackw@panix.com> MIME-Version: 1.0 wint_t is a little finicky because it might be defined by stddef.h, which belongs to the compiler. In addition to the _types_, a bunch of other declarations shared between wctype.h and wchar.h are factored out to their own header. * libio/bits/types/FILE.h, libio/bits/types/__FILE.h * wcsmbs/bits/types/mbstate_t.h, wcsmbs/bits/types/__mbstate_t.h * wcsmbs/bits/types/wint_t.h: New single-type definition files. * wctype/bits/wctype-wchar.h: New file holding declarations shared between wctype.h and wchar.h. * libio/Makefile, wcsmbs/Makefile, wctype/Makefile: Install them. * include/bits/types/FILE.h, include/bits/types/__FILE.h * include/bits/types/mbstate_t.h, include/bits/types/__mbstate_t.h * include/bits/types/wint_t.h, include/bits/wcsmbs-wchar.h: New wrappers. * include/stdio.h, include/wchar.h, include/wctype.h: No need to handle __need macros. * grp/grp.h, gshadow/gshadow.h, hurd/hurd.h, iconv/gconv.h * libio/stdio.h, mach/mach.h, misc/mntent.h, pwd/pwd.h * shadow/shadow.h, stdio-common/printf.h, wcsmbs/uchar.h * wcsmbs/wchar.h, wctype/wctype.h * sysdeps/generic/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h Use the new files instead of __need macros. --- grp/grp.h | 3 +- gshadow/gshadow.h | 4 +- hurd/hurd.h | 3 +- iconv/gconv.h | 6 +- include/bits/types/FILE.h | 1 + include/bits/types/__FILE.h | 1 + include/bits/types/__mbstate_t.h | 1 + include/bits/types/mbstate_t.h | 1 + include/bits/types/wint_t.h | 1 + include/bits/wctype-wchar.h | 1 + include/stdio.h | 16 ++-- include/wchar.h | 10 +- include/wctype.h | 29 +----- libio/Makefile | 3 +- libio/bits/types/FILE.h | 9 ++ libio/bits/types/__FILE.h | 7 ++ libio/stdio.h | 47 ++-------- mach/mach.h | 6 +- misc/mntent.h | 4 +- pwd/pwd.h | 3 +- shadow/shadow.h | 4 +- stdio-common/printf.h | 5 +- sysdeps/generic/_G_config.h | 7 +- sysdeps/unix/sysv/linux/_G_config.h | 7 +- wcsmbs/Makefile | 3 +- wcsmbs/bits/types/__mbstate_t.h | 23 +++++ wcsmbs/bits/types/mbstate_t.h | 8 ++ wcsmbs/bits/types/wint_t.h | 23 +++++ wcsmbs/uchar.h | 9 +- wcsmbs/wchar.h | 125 +++++++------------------ wctype/Makefile | 2 +- wctype/bits/wctype-wchar.h | 173 ++++++++++++++++++++++++++++++++++ wctype/wctype.h | 179 +++--------------------------------- 33 files changed, 337 insertions(+), 387 deletions(-) create mode 100644 include/bits/types/FILE.h create mode 100644 include/bits/types/__FILE.h create mode 100644 include/bits/types/__mbstate_t.h create mode 100644 include/bits/types/mbstate_t.h create mode 100644 include/bits/types/wint_t.h create mode 100644 include/bits/wctype-wchar.h create mode 100644 libio/bits/types/FILE.h create mode 100644 libio/bits/types/__FILE.h create mode 100644 wcsmbs/bits/types/__mbstate_t.h create mode 100644 wcsmbs/bits/types/mbstate_t.h create mode 100644 wcsmbs/bits/types/wint_t.h create mode 100644 wctype/bits/wctype-wchar.h diff --git a/grp/grp.h b/grp/grp.h index d829e4c626..0f833fff89 100644 --- a/grp/grp.h +++ b/grp/grp.h @@ -49,8 +49,7 @@ struct group #ifdef __USE_MISC -# define __need_FILE -# include +# include #endif diff --git a/gshadow/gshadow.h b/gshadow/gshadow.h index a93b3bd8b2..70ab83ddbd 100644 --- a/gshadow/gshadow.h +++ b/gshadow/gshadow.h @@ -21,11 +21,9 @@ #define _GSHADOW_H 1 #include - #include +#include -#define __need_FILE -#include #define __need_size_t #include diff --git a/hurd/hurd.h b/hurd/hurd.h index e51d3c58a7..3caa69fbdf 100644 --- a/hurd/hurd.h +++ b/hurd/hurd.h @@ -141,8 +141,7 @@ extern struct mutex _hurd_brk_lock; extern int _hurd_set_brk (vm_address_t newbrk); -#define __need_FILE -#include +#include /* Calls to get and set basic ports. */ diff --git a/iconv/gconv.h b/iconv/gconv.h index 71d91a0ef3..db678dba49 100644 --- a/iconv/gconv.h +++ b/iconv/gconv.h @@ -23,9 +23,9 @@ #define _GCONV_H 1 #include -#define __need_mbstate_t -#define __need_wint_t -#include +#include +#include + #define __need_size_t #define __need_wchar_t #include diff --git a/include/bits/types/FILE.h b/include/bits/types/FILE.h new file mode 100644 index 0000000000..09b599baa0 --- /dev/null +++ b/include/bits/types/FILE.h @@ -0,0 +1 @@ +#include diff --git a/include/bits/types/__FILE.h b/include/bits/types/__FILE.h new file mode 100644 index 0000000000..236f60bacd --- /dev/null +++ b/include/bits/types/__FILE.h @@ -0,0 +1 @@ +#include diff --git a/include/bits/types/__mbstate_t.h b/include/bits/types/__mbstate_t.h new file mode 100644 index 0000000000..13e764e8c9 --- /dev/null +++ b/include/bits/types/__mbstate_t.h @@ -0,0 +1 @@ +#include diff --git a/include/bits/types/mbstate_t.h b/include/bits/types/mbstate_t.h new file mode 100644 index 0000000000..99ec08a91a --- /dev/null +++ b/include/bits/types/mbstate_t.h @@ -0,0 +1 @@ +#include diff --git a/include/bits/types/wint_t.h b/include/bits/types/wint_t.h new file mode 100644 index 0000000000..f1e373d294 --- /dev/null +++ b/include/bits/types/wint_t.h @@ -0,0 +1 @@ +#include diff --git a/include/bits/wctype-wchar.h b/include/bits/wctype-wchar.h new file mode 100644 index 0000000000..8273cd743e --- /dev/null +++ b/include/bits/wctype-wchar.h @@ -0,0 +1 @@ +#include diff --git a/include/stdio.h b/include/stdio.h index ed6593ba50..f68f633bd6 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -1,8 +1,6 @@ #ifndef _STDIO_H -# if defined _ISOMAC || defined __need_FILE || defined __need___FILE -# include -# else -# include +# include +# ifndef _ISOMAC /* Now define the internal interfaces. */ @@ -71,11 +69,11 @@ libc_hidden_proto (__isoc99_vfscanf) extern FILE *__new_tmpfile (void); extern FILE *__old_tmpfile (void); - - # define __need_size_t -# define __need_wint_t # include + +# include + /* Generate a unique file name (and possibly open it). */ extern int __path_search (char *__tmpl, size_t __tmpl_len, const char *__dir, const char *__pfx, @@ -183,5 +181,5 @@ libc_hidden_proto (__obstack_vprintf_chk) extern FILE * __fmemopen (void *buf, size_t len, const char *mode); libc_hidden_proto (__fmemopen) -# endif -#endif +# endif /* not _ISOMAC */ +#endif /* stdio.h */ diff --git a/include/wchar.h b/include/wchar.h index e2579a176a..6a7af27c47 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -1,8 +1,6 @@ #ifndef _WCHAR_H -#include - +# include # ifndef _ISOMAC -# ifdef _WCHAR_H extern __typeof (wcscasecmp_l) __wcscasecmp_l; extern __typeof (wcsncasecmp_l) __wcsncasecmp_l; @@ -216,10 +214,4 @@ extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len, # define __mbsinit(state) ((state)->__count == 0) # endif -# endif #endif - -/* Undefine all __need_* constants in case we are included to get those - constants but the whole file was already read. */ -#undef __need_mbstate_t -#undef __need_wint_t diff --git a/include/wctype.h b/include/wctype.h index a71b10377b..5fd3f863ae 100644 --- a/include/wctype.h +++ b/include/wctype.h @@ -1,30 +1,7 @@ #ifndef _WCTYPE_H +#include #ifndef _ISOMAC -/* We try to get wint_t from , but not all GCC versions define it - there. So define it ourselves if it remains undefined. */ -# 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; -# endif - -/* Need to repeat these prototypes here, as wctype/wctype.h defines all - these as macros and thus we couldn't add libc_hidden_proto. */ - -extern int iswalpha (wint_t __wc); -extern int iswalnum (wint_t __wc); -extern int iswdigit (wint_t __wc); -extern int iswlower (wint_t __wc); -extern int iswspace (wint_t __wc); -extern int iswxdigit (wint_t __wc); -extern wint_t towlower (wint_t __wc); -extern wint_t towupper (wint_t __wc); libc_hidden_proto (iswalpha) libc_hidden_proto (iswalnum) @@ -34,11 +11,7 @@ libc_hidden_proto (iswspace) libc_hidden_proto (iswxdigit) libc_hidden_proto (towlower) libc_hidden_proto (towupper) -#endif -#include - -#ifndef _ISOMAC /* Internal interfaces. */ extern int __iswspace (wint_t __wc); extern int __iswctype (wint_t __wc, wctype_t __desc); diff --git a/libio/Makefile b/libio/Makefile index be252f740f..a002a3365c 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -23,7 +23,8 @@ subdir := libio include ../Makeconfig headers := stdio.h libio.h _G_config.h bits/stdio.h \ - bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h + bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h \ + bits/types/FILE.h bits/types/__FILE.h routines := \ filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen \ diff --git a/libio/bits/types/FILE.h b/libio/bits/types/FILE.h new file mode 100644 index 0000000000..f268263209 --- /dev/null +++ b/libio/bits/types/FILE.h @@ -0,0 +1,9 @@ +#ifndef __FILE_defined +#define __FILE_defined 1 + +struct _IO_FILE; + +/* The opaque type of streams. This is the definition used elsewhere. */ +typedef struct _IO_FILE FILE; + +#endif diff --git a/libio/bits/types/__FILE.h b/libio/bits/types/__FILE.h new file mode 100644 index 0000000000..06dd79bc83 --- /dev/null +++ b/libio/bits/types/__FILE.h @@ -0,0 +1,7 @@ +#ifndef ____FILE_defined +#define ____FILE_defined 1 + +struct _IO_FILE; +typedef struct _IO_FILE __FILE; + +#endif diff --git a/libio/stdio.h b/libio/stdio.h index 422f39daf5..47490c8299 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -21,48 +21,21 @@ */ #ifndef _STDIO_H +#define _STDIO_H 1 -#if !defined __need_FILE && !defined __need___FILE -# define _STDIO_H 1 -# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION -# include +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include __BEGIN_DECLS -# define __need_size_t -# define __need_NULL -# include +#define __need_size_t +#define __need_NULL +#include -# include -# define __need_FILE -# define __need___FILE -#endif /* Don't need FILE. */ +#include +#include +#include - -#if !defined __FILE_defined && defined __need_FILE - -/* Define outside of namespace so the C++ is happy. */ -struct _IO_FILE; - -/* The opaque type of streams. This is the definition used elsewhere. */ -typedef struct _IO_FILE FILE; - -# define __FILE_defined 1 -#endif /* FILE not defined. */ -#undef __need_FILE - - -#if !defined ____FILE_defined && defined __need___FILE - -/* The opaque type of streams. This is the definition used elsewhere. */ -typedef struct _IO_FILE __FILE; - -# define ____FILE_defined 1 -#endif /* __FILE not defined. */ -#undef __need___FILE - - -#ifdef _STDIO_H #define _STDIO_USES_IOSTREAM #include @@ -895,5 +868,3 @@ extern void funlockfile (FILE *__stream) __THROW; __END_DECLS #endif /* included. */ - -#endif /* !_STDIO_H */ diff --git a/mach/mach.h b/mach/mach.h index 3ceb7b6c8c..42605af865 100644 --- a/mach/mach.h +++ b/mach/mach.h @@ -20,10 +20,8 @@ #define _MACH_H 1 -/* We must include this before using __need_FILE with below. */ #include - /* Get the basic types used by Mach. */ #include @@ -79,9 +77,7 @@ extern void __mach_msg_destroy (mach_msg_header_t *msg), mach_msg_destroy (mach_msg_header_t *msg); - -#define __need_FILE -#include +#include /* Open a stream on a Mach device. */ extern FILE *mach_open_devstream (mach_port_t device_port, const char *mode); diff --git a/misc/mntent.h b/misc/mntent.h index 039a454512..e54e165637 100644 --- a/misc/mntent.h +++ b/misc/mntent.h @@ -20,10 +20,8 @@ #define _MNTENT_H 1 #include -#define __need_FILE -#include #include - +#include /* File listing canonical interesting mount points. */ #define MNTTAB _PATH_MNTTAB /* Deprecated alias. */ diff --git a/pwd/pwd.h b/pwd/pwd.h index fabd95044c..100f33eb4e 100644 --- a/pwd/pwd.h +++ b/pwd/pwd.h @@ -59,8 +59,7 @@ struct passwd #ifdef __USE_MISC -# define __need_FILE -# include +# include #endif diff --git a/shadow/shadow.h b/shadow/shadow.h index 855fe632a1..f55c946f59 100644 --- a/shadow/shadow.h +++ b/shadow/shadow.h @@ -24,11 +24,11 @@ #include -#define __need_FILE -#include #define __need_size_t #include +#include + /* Paths to the user database files. */ #define SHADOW _PATH_SHADOW diff --git a/stdio-common/printf.h b/stdio-common/printf.h index 5d82e8d01e..b90fae68f3 100644 --- a/stdio-common/printf.h +++ b/stdio-common/printf.h @@ -22,11 +22,12 @@ __BEGIN_DECLS -#define __need_FILE -#include +#include + #define __need_size_t #define __need_wchar_t #include + #include diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h index f44a3d4eee..c49eed395b 100644 --- a/sysdeps/generic/_G_config.h +++ b/sysdeps/generic/_G_config.h @@ -13,11 +13,12 @@ #endif #define __need_NULL #include -#define __need_mbstate_t + +#include #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T -# define __need_wint_t +# include #endif -#include + typedef struct { __off_t __pos; diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h index abec245606..3bc6cfd595 100644 --- a/sysdeps/unix/sysv/linux/_G_config.h +++ b/sysdeps/unix/sysv/linux/_G_config.h @@ -13,11 +13,12 @@ #endif #define __need_NULL #include -#define __need_mbstate_t + +#include #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T -# define __need_wint_t +# include #endif -#include + typedef struct { __off_t __pos; diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile index d6b214b2ab..08b1de11a8 100644 --- a/wcsmbs/Makefile +++ b/wcsmbs/Makefile @@ -22,7 +22,8 @@ subdir := wcsmbs include ../Makeconfig -headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h +headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h \ + bits/types/__mbstate_t.h bits/types/mbstate_t.h bits/types/wint_t.h routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \ diff --git a/wcsmbs/bits/types/__mbstate_t.h b/wcsmbs/bits/types/__mbstate_t.h new file mode 100644 index 0000000000..1d8a4e28d1 --- /dev/null +++ b/wcsmbs/bits/types/__mbstate_t.h @@ -0,0 +1,23 @@ +#ifndef ____mbstate_t_defined +#define ____mbstate_t_defined 1 + +/* 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. */ +#ifndef __WINT_TYPE__ +# define __WINT_TYPE__ unsigned int +#endif + +/* Conversion state information. */ +typedef struct +{ + int __count; + union + { + __WINT_TYPE__ __wch; + char __wchb[4]; + } __value; /* Value so far. */ +} __mbstate_t; + +#endif diff --git a/wcsmbs/bits/types/mbstate_t.h b/wcsmbs/bits/types/mbstate_t.h new file mode 100644 index 0000000000..8d1baa5c3b --- /dev/null +++ b/wcsmbs/bits/types/mbstate_t.h @@ -0,0 +1,8 @@ +#ifndef __mbstate_t_defined +#define __mbstate_t_defined 1 + +#include + +typedef __mbstate_t mbstate_t; + +#endif diff --git a/wcsmbs/bits/types/wint_t.h b/wcsmbs/bits/types/wint_t.h new file mode 100644 index 0000000000..fbd63dbc84 --- /dev/null +++ b/wcsmbs/bits/types/wint_t.h @@ -0,0 +1,23 @@ +#ifndef __wint_t_defined +#define __wint_t_defined 1 + +/* Some versions of stddef.h provide wint_t, even though neither the + C nor C++ standards, nor POSIX, specifies this. We assume that + stddef.h will define the macro _WINT_T if and only if it provides + wint_t, and conversely, that it will avoid providing wint_t if + _WINT_T is already defined. */ +#ifndef _WINT_T +#define _WINT_T 1 + +/* 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. */ +#ifndef __WINT_TYPE__ +# define __WINT_TYPE__ unsigned int +#endif + +typedef __WINT_TYPE__ wint_t; + +#endif /* _WINT_T */ +#endif /* bits/types/wint_t.h */ diff --git a/wcsmbs/uchar.h b/wcsmbs/uchar.h index a6569825fd..f937519cf4 100644 --- a/wcsmbs/uchar.h +++ b/wcsmbs/uchar.h @@ -27,15 +27,8 @@ #define __need_size_t #include -#define __need_mbstate_t -#include - -#ifndef __mbstate_t_defined -/* Public type. */ -typedef __mbstate_t mbstate_t; -# define __mbstate_t_defined 1 -#endif +#include #if defined __GNUC__ && !defined __USE_ISOCXX11 /* Define the 16-bit and 32-bit character types. Use the information diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h index 79be9fc41d..d389428daa 100644 --- a/wcsmbs/wchar.h +++ b/wcsmbs/wchar.h @@ -21,83 +21,33 @@ */ #ifndef _WCHAR_H +#define _WCHAR_H 1 -#if !defined __need_mbstate_t && !defined __need_wint_t -# define _WCHAR_H 1 -# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION -# include +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include + +#define __need_size_t +#define __need_wchar_t +#define __need_NULL +#include + +#define __need___va_list +#include + +#include +#include +#include +#include + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K +# include #endif -#ifdef _WCHAR_H -/* Get FILE definition. */ -# define __need___FILE -# if defined __USE_UNIX98 || defined __USE_XOPEN2K -# define __need_FILE -# endif -# include -/* Get va_list definition. */ -# 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 -#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 -/* 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 - /* Tell the caller that we provide correct C++ prototypes. */ -# if defined __cplusplus && __GNUC_PREREQ (4, 4) -# define __CORRECT_ISO_CPP_WCHAR_H_PROTO -# endif +#if defined __cplusplus && __GNUC_PREREQ (4, 4) +# define __CORRECT_ISO_CPP_WCHAR_H_PROTO #endif -#if (defined _WCHAR_H || defined __need_mbstate_t) && !defined ____mbstate_t_defined -# define ____mbstate_t_defined 1 -/* Conversion state information. */ -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; -#endif -#undef __need_mbstate_t - - -/* The rest of the file is only used if used if __need_mbstate_t is not - defined. */ -#ifdef _WCHAR_H - -# ifndef __mbstate_t_defined -/* Public type. */ -typedef __mbstate_t mbstate_t; -# define __mbstate_t_defined 1 -# endif - #ifndef WCHAR_MIN /* These constants might also be defined in . */ # define WCHAR_MIN __WCHAR_MIN @@ -108,13 +58,18 @@ typedef __mbstate_t mbstate_t; # define WEOF (0xffffffffu) #endif -/* For XPG4 compliance we have to define the stuff from here - as well. */ -#if defined __USE_XOPEN && !defined __USE_UNIX98 -# include +/* All versions of XPG prior to the publication of ISO C99 required + the bulk of 's declarations to appear in this header + (because did not exist prior to C99). In POSIX.1-2001 + those declarations were marked as XSI extensions; in -2008 they + were additionally marked as obsolescent. _GNU_SOURCE mode + anticipates the removal of these declarations in the next revision + of POSIX. */ +#if (defined __USE_XOPEN && !defined __USE_GNU \ + && !(defined __USE_XOPEN2K && !defined __USE_XOPEN2KXSI)) +# include #endif - __BEGIN_DECLS /* This incomplete type is defined in but needed here because @@ -823,17 +778,6 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize, __locale_t __loc) __THROW; # endif -/* The X/Open standard demands that most of the functions defined in - the header must also appear here. This is probably - because some X/Open members wrote their implementation before the - ISO C standard was published and introduced the better solution. - We have to provide these definitions for compliance reasons but we - do this nonsense only if really necessary. */ -#if defined __USE_UNIX98 && !defined __USE_GNU -# define __need_iswxxx -# include -#endif - /* Define some macros helping to catch buffer overflows. */ #if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function # include @@ -845,11 +789,4 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize, __END_DECLS -#endif /* _WCHAR_H defined */ - #endif /* wchar.h */ - -/* Undefine all __need_* constants in case we are included to get those - constants but the whole file was already read. */ -#undef __need_mbstate_t -#undef __need_wint_t diff --git a/wctype/Makefile b/wctype/Makefile index 18756c38e6..2cb2a6dc86 100644 --- a/wctype/Makefile +++ b/wctype/Makefile @@ -22,7 +22,7 @@ subdir := wctype include ../Makeconfig -headers := wctype.h +headers := wctype.h bits/wctype-wchar.h routines := wcfuncs wctype iswctype wctrans towctrans \ wcfuncs_l wctype_l iswctype_l wctrans_l towctrans_l diff --git a/wctype/bits/wctype-wchar.h b/wctype/bits/wctype-wchar.h new file mode 100644 index 0000000000..df5fd0396f --- /dev/null +++ b/wctype/bits/wctype-wchar.h @@ -0,0 +1,173 @@ +/* Copyright (C) 1996-2016 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* + * ISO C99 Standard: 7.25 + * Wide character classification and mapping utilities + */ + +#ifndef _BITS_WCTYPE_WCHAR_H +#define _BITS_WCTYPE_WCHAR_H 1 + +#if !defined _WCTYPE_H && !defined _WCHAR_H +#error "Never include directly; include or instead." +#endif + +#include +#include + +/* The definitions in this header are specified to appear in + in ISO C99, but in in Unix98. _GNU_SOURCE follows C99. */ + +/* Scalar type that can hold values which represent locale-specific + character classifications. */ +typedef unsigned long int wctype_t; + +# ifndef _ISwbit +/* The characteristics are stored always in network byte order (big + endian). We define the bit value interpretations here dependent on the + machine's byte order. */ + +# include +# if __BYTE_ORDER == __BIG_ENDIAN +# define _ISwbit(bit) (1 << (bit)) +# else /* __BYTE_ORDER == __LITTLE_ENDIAN */ +# define _ISwbit(bit) \ + ((bit) < 8 ? (int) ((1UL << (bit)) << 24) \ + : ((bit) < 16 ? (int) ((1UL << (bit)) << 8) \ + : ((bit) < 24 ? (int) ((1UL << (bit)) >> 8) \ + : (int) ((1UL << (bit)) >> 24)))) +# endif + +enum +{ + __ISwupper = 0, /* UPPERCASE. */ + __ISwlower = 1, /* lowercase. */ + __ISwalpha = 2, /* Alphabetic. */ + __ISwdigit = 3, /* Numeric. */ + __ISwxdigit = 4, /* Hexadecimal numeric. */ + __ISwspace = 5, /* Whitespace. */ + __ISwprint = 6, /* Printing. */ + __ISwgraph = 7, /* Graphical. */ + __ISwblank = 8, /* Blank (usually SPC and TAB). */ + __ISwcntrl = 9, /* Control character. */ + __ISwpunct = 10, /* Punctuation. */ + __ISwalnum = 11, /* Alphanumeric. */ + + _ISwupper = _ISwbit (__ISwupper), /* UPPERCASE. */ + _ISwlower = _ISwbit (__ISwlower), /* lowercase. */ + _ISwalpha = _ISwbit (__ISwalpha), /* Alphabetic. */ + _ISwdigit = _ISwbit (__ISwdigit), /* Numeric. */ + _ISwxdigit = _ISwbit (__ISwxdigit), /* Hexadecimal numeric. */ + _ISwspace = _ISwbit (__ISwspace), /* Whitespace. */ + _ISwprint = _ISwbit (__ISwprint), /* Printing. */ + _ISwgraph = _ISwbit (__ISwgraph), /* Graphical. */ + _ISwblank = _ISwbit (__ISwblank), /* Blank (usually SPC and TAB). */ + _ISwcntrl = _ISwbit (__ISwcntrl), /* Control character. */ + _ISwpunct = _ISwbit (__ISwpunct), /* Punctuation. */ + _ISwalnum = _ISwbit (__ISwalnum) /* Alphanumeric. */ +}; +# endif /* Not _ISwbit */ + + +__BEGIN_DECLS + +/* + * Wide-character classification functions: 7.15.2.1. + */ + +/* Test for any wide character for which `iswalpha' or `iswdigit' is + true. */ +extern int iswalnum (wint_t __wc) __THROW; + +/* Test for any wide character for which `iswupper' or 'iswlower' is + true, or any wide character that is one of a locale-specific set of + wide-characters for which none of `iswcntrl', `iswdigit', + `iswpunct', or `iswspace' is true. */ +extern int iswalpha (wint_t __wc) __THROW; + +/* Test for any control wide character. */ +extern int iswcntrl (wint_t __wc) __THROW; + +/* Test for any wide character that corresponds to a decimal-digit + character. */ +extern int iswdigit (wint_t __wc) __THROW; + +/* Test for any wide character for which `iswprint' is true and + `iswspace' is false. */ +extern int iswgraph (wint_t __wc) __THROW; + +/* Test for any wide character that corresponds to a lowercase letter + or is one of a locale-specific set of wide characters for which + none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */ +extern int iswlower (wint_t __wc) __THROW; + +/* Test for any printing wide character. */ +extern int iswprint (wint_t __wc) __THROW; + +/* Test for any printing wide character that is one of a + locale-specific et of wide characters for which neither `iswspace' + nor `iswalnum' is true. */ +extern int iswpunct (wint_t __wc) __THROW; + +/* Test for any wide character that corresponds to a locale-specific + set of wide characters for which none of `iswalnum', `iswgraph', or + `iswpunct' is true. */ +extern int iswspace (wint_t __wc) __THROW; + +/* Test for any wide character that corresponds to an uppercase letter + or is one of a locale-specific set of wide character for which none + of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */ +extern int iswupper (wint_t __wc) __THROW; + +/* Test for any wide character that corresponds to a hexadecimal-digit + character equivalent to that performed be the functions described + in the previous subclause. */ +extern int iswxdigit (wint_t __wc) __THROW; + +/* Test for any wide character that corresponds to a standard blank + wide character or a locale-specific set of wide characters for + which `iswalnum' is false. */ +# ifdef __USE_ISOC99 +extern int iswblank (wint_t __wc) __THROW; +# endif + +/* + * Extensible wide-character classification functions: 7.15.2.2. + */ + +/* Construct value that describes a class of wide characters identified + by the string argument PROPERTY. */ +extern wctype_t wctype (const char *__property) __THROW; + +/* Determine whether the wide-character WC has the property described by + DESC. */ +extern int iswctype (wint_t __wc, wctype_t __desc) __THROW; + +/* + * Wide-character case-mapping functions: 7.15.3.1. + */ + +/* Converts an uppercase letter to the corresponding lowercase letter. */ +extern wint_t towlower (wint_t __wc) __THROW; + +/* Converts an lowercase letter to the corresponding uppercase letter. */ +extern wint_t towupper (wint_t __wc) __THROW; + +__END_DECLS + +#endif /* bits/wctype-wchar.h. */ diff --git a/wctype/wctype.h b/wctype/wctype.h index 73165bbda2..962aef1de6 100644 --- a/wctype/wctype.h +++ b/wctype/wctype.h @@ -21,179 +21,21 @@ */ #ifndef _WCTYPE_H +#define _WCTYPE_H 1 #include #include - -#ifndef __need_iswxxx -# define _WCTYPE_H 1 - -/* Get wint_t from . */ -# define __need_wint_t -# include +#include /* Constant expression of type `wint_t' whose value does not correspond to any member of the extended character set. */ -# ifndef WEOF -# define WEOF (0xffffffffu) -# endif +#ifndef WEOF +# define WEOF (0xffffffffu) #endif -#undef __need_iswxxx - -/* The following part is also used in the header when compiled - in the Unix98 compatibility mode. */ -#ifndef __iswxxx_defined -# define __iswxxx_defined 1 - -/* Scalar type that can hold values which represent locale-specific - character classifications. */ -typedef unsigned long int wctype_t; - -# ifndef _ISwbit -/* The characteristics are stored always in network byte order (big - endian). We define the bit value interpretations here dependent on the - machine's byte order. */ - -# include -# if __BYTE_ORDER == __BIG_ENDIAN -# define _ISwbit(bit) (1 << (bit)) -# else /* __BYTE_ORDER == __LITTLE_ENDIAN */ -# define _ISwbit(bit) \ - ((bit) < 8 ? (int) ((1UL << (bit)) << 24) \ - : ((bit) < 16 ? (int) ((1UL << (bit)) << 8) \ - : ((bit) < 24 ? (int) ((1UL << (bit)) >> 8) \ - : (int) ((1UL << (bit)) >> 24)))) -# endif - -enum -{ - __ISwupper = 0, /* UPPERCASE. */ - __ISwlower = 1, /* lowercase. */ - __ISwalpha = 2, /* Alphabetic. */ - __ISwdigit = 3, /* Numeric. */ - __ISwxdigit = 4, /* Hexadecimal numeric. */ - __ISwspace = 5, /* Whitespace. */ - __ISwprint = 6, /* Printing. */ - __ISwgraph = 7, /* Graphical. */ - __ISwblank = 8, /* Blank (usually SPC and TAB). */ - __ISwcntrl = 9, /* Control character. */ - __ISwpunct = 10, /* Punctuation. */ - __ISwalnum = 11, /* Alphanumeric. */ - - _ISwupper = _ISwbit (__ISwupper), /* UPPERCASE. */ - _ISwlower = _ISwbit (__ISwlower), /* lowercase. */ - _ISwalpha = _ISwbit (__ISwalpha), /* Alphabetic. */ - _ISwdigit = _ISwbit (__ISwdigit), /* Numeric. */ - _ISwxdigit = _ISwbit (__ISwxdigit), /* Hexadecimal numeric. */ - _ISwspace = _ISwbit (__ISwspace), /* Whitespace. */ - _ISwprint = _ISwbit (__ISwprint), /* Printing. */ - _ISwgraph = _ISwbit (__ISwgraph), /* Graphical. */ - _ISwblank = _ISwbit (__ISwblank), /* Blank (usually SPC and TAB). */ - _ISwcntrl = _ISwbit (__ISwcntrl), /* Control character. */ - _ISwpunct = _ISwbit (__ISwpunct), /* Punctuation. */ - _ISwalnum = _ISwbit (__ISwalnum) /* Alphanumeric. */ -}; -# endif /* Not _ISwbit */ - - -__BEGIN_DECLS - -/* - * Wide-character classification functions: 7.15.2.1. - */ - -/* Test for any wide character for which `iswalpha' or `iswdigit' is - true. */ -extern int iswalnum (wint_t __wc) __THROW; - -/* Test for any wide character for which `iswupper' or 'iswlower' is - true, or any wide character that is one of a locale-specific set of - wide-characters for which none of `iswcntrl', `iswdigit', - `iswpunct', or `iswspace' is true. */ -extern int iswalpha (wint_t __wc) __THROW; - -/* Test for any control wide character. */ -extern int iswcntrl (wint_t __wc) __THROW; - -/* Test for any wide character that corresponds to a decimal-digit - character. */ -extern int iswdigit (wint_t __wc) __THROW; - -/* Test for any wide character for which `iswprint' is true and - `iswspace' is false. */ -extern int iswgraph (wint_t __wc) __THROW; - -/* Test for any wide character that corresponds to a lowercase letter - or is one of a locale-specific set of wide characters for which - none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */ -extern int iswlower (wint_t __wc) __THROW; - -/* Test for any printing wide character. */ -extern int iswprint (wint_t __wc) __THROW; - -/* Test for any printing wide character that is one of a - locale-specific et of wide characters for which neither `iswspace' - nor `iswalnum' is true. */ -extern int iswpunct (wint_t __wc) __THROW; - -/* Test for any wide character that corresponds to a locale-specific - set of wide characters for which none of `iswalnum', `iswgraph', or - `iswpunct' is true. */ -extern int iswspace (wint_t __wc) __THROW; - -/* Test for any wide character that corresponds to an uppercase letter - or is one of a locale-specific set of wide character for which none - of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */ -extern int iswupper (wint_t __wc) __THROW; - -/* Test for any wide character that corresponds to a hexadecimal-digit - character equivalent to that performed be the functions described - in the previous subclause. */ -extern int iswxdigit (wint_t __wc) __THROW; - -/* Test for any wide character that corresponds to a standard blank - wide character or a locale-specific set of wide characters for - which `iswalnum' is false. */ -# ifdef __USE_ISOC99 -extern int iswblank (wint_t __wc) __THROW; -# endif - -/* - * Extensible wide-character classification functions: 7.15.2.2. - */ - -/* Construct value that describes a class of wide characters identified - by the string argument PROPERTY. */ -extern wctype_t wctype (const char *__property) __THROW; - -/* Determine whether the wide-character WC has the property described by - DESC. */ -extern int iswctype (wint_t __wc, wctype_t __desc) __THROW; - - -/* - * Wide-character case-mapping functions: 7.15.3.1. - */ - -/* Scalar type that can hold values which represent locale-specific - character mappings. */ -typedef const __int32_t *wctrans_t; - -/* Converts an uppercase letter to the corresponding lowercase letter. */ -extern wint_t towlower (wint_t __wc) __THROW; - -/* Converts an lowercase letter to the corresponding uppercase letter. */ -extern wint_t towupper (wint_t __wc) __THROW; - -__END_DECLS - -#endif /* need iswxxx. */ - - -/* The remaining definitions and declarations must not appear in the - header. */ -#ifdef _WCTYPE_H +/* Some definitions from this header also appear in in + Unix98 mode. */ +#include /* * Extensible wide-character mapping functions: 7.15.3.2. @@ -201,6 +43,10 @@ __END_DECLS __BEGIN_DECLS +/* Scalar type that can hold values which represent locale-specific + character mappings. */ +typedef const __int32_t *wctrans_t; + /* Construct value that describes a mapping between wide characters identified by the string argument PROPERTY. */ extern wctrans_t wctrans (const char *__property) __THROW; @@ -276,7 +122,6 @@ extern wctype_t wctype_l (const char *__property, __locale_t __locale) extern int iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale) __THROW; - /* * Wide-character case-mapping functions. */ @@ -300,6 +145,4 @@ extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc, __END_DECLS -#endif /* __WCTYPE_H defined. */ - #endif /* wctype.h */