diff options
author | Zack Weinberg <zackw@panix.com> | 2016-11-20 23:00:02 -0500 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-06-08 13:58:17 -0400 |
commit | 199fc19d3aaaf57944ef036e15904febe877fc93 (patch) | |
tree | 5056d2447de58c0bb197d87740098220f556b242 | |
parent | 4615f5aefeaa45345484a9ce8e3d0ea977c80d80 (diff) | |
download | glibc-199fc19d3aaaf57944ef036e15904febe877fc93.zip glibc-199fc19d3aaaf57944ef036e15904febe877fc93.tar.gz glibc-199fc19d3aaaf57944ef036e15904febe877fc93.tar.bz2 |
Remove __need macros from stdio.h and wchar.h.
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.
34 files changed, 357 insertions, 382 deletions
@@ -1,3 +1,28 @@ +2017-06-08 Zack Weinberg <zackw@panix.com> + + * 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. + 2017-06-08 H.J. Lu <hongjiu.lu@intel.com> * string/test-memrchr.c (test_main): Add tests for len == 0 @@ -49,8 +49,7 @@ struct group #ifdef __USE_MISC -# define __need_FILE -# include <stdio.h> +# include <bits/types/FILE.h> #endif diff --git a/gshadow/gshadow.h b/gshadow/gshadow.h index a93b3bd..70ab83d 100644 --- a/gshadow/gshadow.h +++ b/gshadow/gshadow.h @@ -21,11 +21,9 @@ #define _GSHADOW_H 1 #include <features.h> - #include <paths.h> +#include <bits/types/FILE.h> -#define __need_FILE -#include <stdio.h> #define __need_size_t #include <stddef.h> diff --git a/hurd/hurd.h b/hurd/hurd.h index e51d3c5..3caa69f 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 <stdio.h> +#include <bits/types/FILE.h> /* Calls to get and set basic ports. */ diff --git a/iconv/gconv.h b/iconv/gconv.h index 71d91a0..db678db 100644 --- a/iconv/gconv.h +++ b/iconv/gconv.h @@ -23,9 +23,9 @@ #define _GCONV_H 1 #include <features.h> -#define __need_mbstate_t -#define __need_wint_t -#include <wchar.h> +#include <bits/types/__mbstate_t.h> +#include <bits/types/wint_t.h> + #define __need_size_t #define __need_wchar_t #include <stddef.h> diff --git a/include/bits/types/FILE.h b/include/bits/types/FILE.h new file mode 100644 index 0000000..09b599b --- /dev/null +++ b/include/bits/types/FILE.h @@ -0,0 +1 @@ +#include <libio/bits/types/FILE.h> diff --git a/include/bits/types/__FILE.h b/include/bits/types/__FILE.h new file mode 100644 index 0000000..236f60b --- /dev/null +++ b/include/bits/types/__FILE.h @@ -0,0 +1 @@ +#include <libio/bits/types/__FILE.h> diff --git a/include/bits/types/__mbstate_t.h b/include/bits/types/__mbstate_t.h new file mode 100644 index 0000000..13e764e --- /dev/null +++ b/include/bits/types/__mbstate_t.h @@ -0,0 +1 @@ +#include <wcsmbs/bits/types/__mbstate_t.h> diff --git a/include/bits/types/mbstate_t.h b/include/bits/types/mbstate_t.h new file mode 100644 index 0000000..99ec08a --- /dev/null +++ b/include/bits/types/mbstate_t.h @@ -0,0 +1 @@ +#include <wcsmbs/bits/types/mbstate_t.h> diff --git a/include/bits/types/wint_t.h b/include/bits/types/wint_t.h new file mode 100644 index 0000000..f1e373d --- /dev/null +++ b/include/bits/types/wint_t.h @@ -0,0 +1 @@ +#include <wcsmbs/bits/types/wint_t.h> diff --git a/include/bits/wctype-wchar.h b/include/bits/wctype-wchar.h new file mode 100644 index 0000000..8273cd7 --- /dev/null +++ b/include/bits/wctype-wchar.h @@ -0,0 +1 @@ +#include <wctype/bits/wctype-wchar.h> diff --git a/include/stdio.h b/include/stdio.h index ed6593b..f68f633 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 <libio/stdio.h> -# else -# include <libio/stdio.h> +# include <libio/stdio.h> +# 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 <stddef.h> + +# include <bits/types/wint_t.h> + /* 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 a773d56..cf76709 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -1,8 +1,6 @@ #ifndef _WCHAR_H -#include <wcsmbs/wchar.h> - +# include <wcsmbs/wchar.h> # ifndef _ISOMAC -# ifdef _WCHAR_H extern __typeof (wcscasecmp_l) __wcscasecmp_l; extern __typeof (wcsncasecmp_l) __wcsncasecmp_l; @@ -219,10 +217,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 a71b103..5fd3f86 100644 --- a/include/wctype.h +++ b/include/wctype.h @@ -1,30 +1,7 @@ #ifndef _WCTYPE_H +#include <wctype/wctype.h> #ifndef _ISOMAC -/* We try to get wint_t from <stddef.h>, but not all GCC versions define it - there. So define it ourselves if it remains undefined. */ -# define __need_wint_t -# include <stddef.h> -# 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 <wctype/wctype.h> -#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 be252f7..a002a33 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 0000000..f268263 --- /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 0000000..06dd79b --- /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 422f39d..47490c8 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 <bits/libc-header-start.h> +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include <bits/libc-header-start.h> __BEGIN_DECLS -# define __need_size_t -# define __need_NULL -# include <stddef.h> +#define __need_size_t +#define __need_NULL +#include <stddef.h> -# include <bits/types.h> -# define __need_FILE -# define __need___FILE -#endif /* Don't need FILE. */ +#include <bits/types.h> +#include <bits/types/__FILE.h> +#include <bits/types/FILE.h> - -#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 <libio.h> @@ -895,5 +868,3 @@ extern void funlockfile (FILE *__stream) __THROW; __END_DECLS #endif /* <stdio.h> included. */ - -#endif /* !_STDIO_H */ diff --git a/mach/mach.h b/mach/mach.h index 3ceb7b6..42605af 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 <stdio.h> below. */ #include <features.h> - /* Get the basic types used by Mach. */ #include <mach/mach_types.h> @@ -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 <stdio.h> +#include <bits/types/FILE.h> /* 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 039a454..e54e165 100644 --- a/misc/mntent.h +++ b/misc/mntent.h @@ -20,10 +20,8 @@ #define _MNTENT_H 1 #include <features.h> -#define __need_FILE -#include <stdio.h> #include <paths.h> - +#include <bits/types/FILE.h> /* File listing canonical interesting mount points. */ #define MNTTAB _PATH_MNTTAB /* Deprecated alias. */ @@ -59,8 +59,7 @@ struct passwd #ifdef __USE_MISC -# define __need_FILE -# include <stdio.h> +# include <bits/types/FILE.h> #endif diff --git a/shadow/shadow.h b/shadow/shadow.h index 855fe63..f55c946 100644 --- a/shadow/shadow.h +++ b/shadow/shadow.h @@ -24,11 +24,11 @@ #include <paths.h> -#define __need_FILE -#include <stdio.h> #define __need_size_t #include <stddef.h> +#include <bits/types/FILE.h> + /* Paths to the user database files. */ #define SHADOW _PATH_SHADOW diff --git a/stdio-common/printf.h b/stdio-common/printf.h index 6b207d2..9402564 100644 --- a/stdio-common/printf.h +++ b/stdio-common/printf.h @@ -22,11 +22,12 @@ __BEGIN_DECLS -#define __need_FILE -#include <stdio.h> +#include <bits/types/FILE.h> + #define __need_size_t #define __need_wchar_t #include <stddef.h> + #include <stdarg.h> diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h index f44a3d4..c49eed3 100644 --- a/sysdeps/generic/_G_config.h +++ b/sysdeps/generic/_G_config.h @@ -13,11 +13,12 @@ #endif #define __need_NULL #include <stddef.h> -#define __need_mbstate_t + +#include <bits/types/__mbstate_t.h> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T -# define __need_wint_t +# include <bits/types/wint_t.h> #endif -#include <wchar.h> + typedef struct { __off_t __pos; diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h index abec245..3bc6cfd 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 <stddef.h> -#define __need_mbstate_t + +#include <bits/types/__mbstate_t.h> #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T -# define __need_wint_t +# include <bits/types/wint_t.h> #endif -#include <wchar.h> + typedef struct { __off_t __pos; diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile index d6b214b..08b1de1 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 0000000..1d8a4e2 --- /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 0000000..8d1baa5 --- /dev/null +++ b/wcsmbs/bits/types/mbstate_t.h @@ -0,0 +1,8 @@ +#ifndef __mbstate_t_defined +#define __mbstate_t_defined 1 + +#include <bits/types/__mbstate_t.h> + +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 0000000..fbd63db --- /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 a656982..f937519 100644 --- a/wcsmbs/uchar.h +++ b/wcsmbs/uchar.h @@ -27,15 +27,8 @@ #define __need_size_t #include <stddef.h> -#define __need_mbstate_t -#include <wchar.h> - -#ifndef __mbstate_t_defined -/* Public type. */ -typedef __mbstate_t mbstate_t; -# define __mbstate_t_defined 1 -#endif +#include <bits/types/mbstate_t.h> #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 79be9fc..d389428 100644 --- a/wcsmbs/wchar.h +++ b/wcsmbs/wchar.h @@ -21,82 +21,32 @@ */ #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 <bits/libc-header-start.h> -#endif +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include <bits/libc-header-start.h> -#ifdef _WCHAR_H -/* Get FILE definition. */ -# define __need___FILE -# if defined __USE_UNIX98 || defined __USE_XOPEN2K -# define __need_FILE -# endif -# include <stdio.h> -/* Get va_list definition. */ -# define __need___va_list -# include <stdarg.h> +#define __need_size_t +#define __need_wchar_t +#define __need_NULL +#include <stddef.h> -# include <bits/wchar.h> +#define __need___va_list +#include <stdarg.h> -/* Get size_t, wchar_t, wint_t and NULL from <stddef.h>. */ -# 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 <stddef.h> - -/* We try to get wint_t from <stddef.h>, 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 +#include <bits/wchar.h> +#include <bits/types/wint_t.h> +#include <bits/types/mbstate_t.h> +#include <bits/types/__FILE.h> -/* 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 __USE_UNIX98 || defined __USE_XOPEN2K +# include <bits/types/FILE.h> #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; +/* Tell the caller that we provide correct C++ prototypes. */ +#if defined __cplusplus && __GNUC_PREREQ (4, 4) +# define __CORRECT_ISO_CPP_WCHAR_H_PROTO #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 <inttypes.h>. */ @@ -108,13 +58,18 @@ typedef __mbstate_t mbstate_t; # define WEOF (0xffffffffu) #endif -/* For XPG4 compliance we have to define the stuff from <wctype.h> here - as well. */ -#if defined __USE_XOPEN && !defined __USE_UNIX98 -# include <wctype.h> +/* All versions of XPG prior to the publication of ISO C99 required + the bulk of <wctype.h>'s declarations to appear in this header + (because <wctype.h> 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 <bits/wctype-wchar.h> #endif - __BEGIN_DECLS /* This incomplete type is defined in <time.h> 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 <wctype.h> 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 <wctype.h> -#endif - /* Define some macros helping to catch buffer overflows. */ #if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function # include <bits/wchar2.h> @@ -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 18756c3..2cb2a6d 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 0000000..df5fd03 --- /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 + <http://www.gnu.org/licenses/>. */ + +/* + * ISO C99 Standard: 7.25 + * Wide character classification and mapping utilities <wctype.h> + */ + +#ifndef _BITS_WCTYPE_WCHAR_H +#define _BITS_WCTYPE_WCHAR_H 1 + +#if !defined _WCTYPE_H && !defined _WCHAR_H +#error "Never include <bits/wctype-wchar.h> directly; include <wctype.h> or <wchar.h> instead." +#endif + +#include <bits/types.h> +#include <bits/types/wint_t.h> + +/* The definitions in this header are specified to appear in <wctype.h> + in ISO C99, but in <wchar.h> 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 <endian.h> +# 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 73165bb..962aef1 100644 --- a/wctype/wctype.h +++ b/wctype/wctype.h @@ -21,186 +21,32 @@ */ #ifndef _WCTYPE_H +#define _WCTYPE_H 1 #include <features.h> #include <bits/types.h> - -#ifndef __need_iswxxx -# define _WCTYPE_H 1 - -/* Get wint_t from <wchar.h>. */ -# define __need_wint_t -# include <wchar.h> +#include <bits/types/wint_t.h> /* 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 <wcsmbs.h> 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 <endian.h> -# 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 +/* Some definitions from this header also appear in <wchar.h> in + Unix98 mode. */ +#include <bits/wctype-wchar.h> /* - * 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. + * Extensible wide-character mapping functions: 7.15.3.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. - */ +__BEGIN_DECLS /* 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 - <wchar.h> header. */ -#ifdef _WCTYPE_H - -/* - * Extensible wide-character mapping functions: 7.15.3.2. - */ - -__BEGIN_DECLS - /* 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 */ |