This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 5/5] The bits/types/*.h treatment for stdio and wchar.


The replacement of __need macros with small headers in bits/types/
that define one type each was well-received when I did it for the
time.h types, so I thought I'd do some more.  I can't promise to
finish this in time for the 2.25 freeze -- if you want to see a
complete transition for that release, please pitch in!  It's not hard.

This patch covers [__]FILE, [__]mbstate_t, and wint_t.  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, and
the logic for when they should appear in wchar.h has been adjusted to
match the history recorded in POSIX.1-2008 [pre-1999 editions of SUS
required these functions to appear in wchar.h; pre-2001 editions of
POSIX do not have them at all; in POSIX.1-2001 they are XSI-only; in
POSIX.1-2008 they are XSI-only and deprecated].

zw

	* 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                     |  12 +--
 include/wchar.h                     |  10 +-
 include/wctype.h                    |  29 +-----
 libio/Makefile                      |   3 +-
 libio/bits/types/FILE.h             |  16 ++++
 libio/bits/types/__FILE.h           |   7 ++
 libio/stdio.h                       |  54 ++---------
 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     |  19 ++++
 wcsmbs/bits/types/mbstate_t.h       |  14 +++
 wcsmbs/bits/types/wint_t.h          |  27 ++++++
 wcsmbs/uchar.h                      |  12 +--
 wcsmbs/wchar.h                      | 140 ++++++---------------------
 wctype/Makefile                     |   2 +-
 wctype/bits/wctype-wchar.h          | 180 +++++++++++++++++++++++++++++++++++
 wctype/wctype.h                     | 183 ++----------------------------------
 33 files changed, 354 insertions(+), 415 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 e904ee2..a044876 100644
--- a/grp/grp.h
+++ b/grp/grp.h
@@ -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 2afd8bd..2e251ba 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 ec07827..f61569c 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 a870280..2afc778 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 5965439..d8ae761 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -1,8 +1,6 @@
 #ifndef _STDIO_H
-# if defined __need_FILE || defined __need___FILE || defined _ISOMAC
-#  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,
diff --git a/include/wchar.h b/include/wchar.h
index e2579a1..6a7af27 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;
@@ -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 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 0c7751c..b73d18a 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..a4a2740
--- /dev/null
+++ b/libio/bits/types/FILE.h
@@ -0,0 +1,16 @@
+#ifndef __FILE_defined
+#define __FILE_defined 1
+
+struct _IO_FILE;
+
+__BEGIN_NAMESPACE_STD
+/* The opaque type of streams.  This is the definition used elsewhere.  */
+typedef struct _IO_FILE FILE;
+__END_NAMESPACE_STD
+#if defined __USE_LARGEFILE64 || defined __USE_POSIX \
+    || defined __USE_ISOC99 || defined __USE_XOPEN \
+    || defined __USE_POSIX2
+__USING_NAMESPACE_STD(FILE)
+#endif
+
+#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 792604f..f252dc6 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -21,55 +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;
-
-__BEGIN_NAMESPACE_STD
-/* The opaque type of streams.  This is the definition used elsewhere.  */
-typedef struct _IO_FILE FILE;
-__END_NAMESPACE_STD
-#if defined __USE_LARGEFILE64 || defined __USE_POSIX \
-    || defined __USE_ISOC99 || defined __USE_XOPEN \
-    || defined __USE_POSIX2
-__USING_NAMESPACE_STD(FILE)
-#endif
-
-# 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>
@@ -942,5 +908,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 c7e7c8c..18979e9 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 43c083b..336789d 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.  */
diff --git a/pwd/pwd.h b/pwd/pwd.h
index 07455e7..55300f5 100644
--- a/pwd/pwd.h
+++ b/pwd/pwd.h
@@ -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 010949f..14dbb1c 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 d731216..e5073fe 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 9384a10..956abb9 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..8eb9537
--- /dev/null
+++ b/wcsmbs/bits/types/__mbstate_t.h
@@ -0,0 +1,19 @@
+#ifndef ____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
diff --git a/wcsmbs/bits/types/mbstate_t.h b/wcsmbs/bits/types/mbstate_t.h
new file mode 100644
index 0000000..858db38
--- /dev/null
+++ b/wcsmbs/bits/types/mbstate_t.h
@@ -0,0 +1,14 @@
+#ifndef __mbstate_t_defined
+#define __mbstate_t_defined 1
+
+#include <bits/types/__mbstate_t.h>
+
+__BEGIN_NAMESPACE_C99
+typedef __mbstate_t mbstate_t;
+__END_NAMESPACE_C99
+
+#ifdef __USE_GNU
+__USING_NAMESPACE_C99(mbstate_t)
+#endif
+
+#endif
diff --git a/wcsmbs/bits/types/wint_t.h b/wcsmbs/bits/types/wint_t.h
new file mode 100644
index 0000000..26649c0
--- /dev/null
+++ b/wcsmbs/bits/types/wint_t.h
@@ -0,0 +1,27 @@
+#ifndef _BITS_TYPES_WINT_T_H
+#define _BITS_TYPES_WINT_T_H 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
+
+/* GCC's stddef.h may or may not define wint_t.  If it does, it defines
+   _WINT_T to indicate that it has.  */
+#ifndef _WINT_T
+# define _WINT_T 1
+typedef __WINT_TYPE__ wint_t;
+#endif
+
+/* GCC's stddef.h may or may not know to put wint_t in namespace std in C++.
+   Fortunately, redundant using-declarations are harmless.  */
+#if defined __cplusplus && defined _GLIBCPP_USE_NAMESPACES
+__BEGIN_NAMESPACE_STD
+using ::wint_t;
+__END_NAMESPACE_STD
+#endif
+
+#endif
diff --git a/wcsmbs/uchar.h b/wcsmbs/uchar.h
index ce92b25..11d7198 100644
--- a/wcsmbs/uchar.h
+++ b/wcsmbs/uchar.h
@@ -27,17 +27,7 @@
 
 #define __need_size_t
 #include <stddef.h>
-#define __need_mbstate_t
-#include <wchar.h>
-
-#ifndef __mbstate_t_defined
-__BEGIN_NAMESPACE_C99
-/* Public type.  */
-typedef __mbstate_t mbstate_t;
-__END_NAMESPACE_C99
-# 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 9686fcd..dceafd7 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -21,96 +21,31 @@
  */
 
 #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>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
+
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#include <stddef.h>
+
+#define __need___va_list
+#include <stdarg.h>
+
+#include <bits/wchar.h>
+#include <bits/types/wint_t.h>
+#include <bits/types/mbstate_t.h>
+#include <bits/types/__FILE.h>
+
+#if defined __USE_UNIX98 || defined __USE_XOPEN2K
+# include <bits/types/FILE.h>
 #endif
 
-#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>
-
-# include <bits/wchar.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;
-# else
-/* Work around problems with the <stddef.h> file which doesn't put
-   wint_t in the std namespace.  */
-#  if defined __cplusplus && defined _GLIBCPP_USE_NAMESPACES \
-      && defined __WINT_TYPE__
-__BEGIN_NAMESPACE_STD
-typedef __WINT_TYPE__ wint_t;
-__END_NAMESPACE_STD
-#  endif
-# 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
-#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
-__BEGIN_NAMESPACE_C99
-/* Public type.  */
-typedef __mbstate_t mbstate_t;
-__END_NAMESPACE_C99
-#  define __mbstate_t_defined 1
-# endif
-
-#ifdef __USE_GNU
-__USING_NAMESPACE_C99(mbstate_t)
+#if defined __cplusplus && __GNUC_PREREQ (4, 4)
+# define __CORRECT_ISO_CPP_WCHAR_H_PROTO
 #endif
 
 #ifndef WCHAR_MIN
@@ -123,13 +58,18 @@ __USING_NAMESPACE_C99(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
 
 __BEGIN_NAMESPACE_STD
@@ -874,17 +814,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>
@@ -896,11 +825,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 f4a9aa6..081cf2c 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..ba1f42c
--- /dev/null
+++ b/wctype/bits/wctype-wchar.h
@@ -0,0 +1,180 @@
+/* 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.  */
+
+__BEGIN_NAMESPACE_C99
+/* Scalar type that can hold values which represent locale-specific
+   character classifications.  */
+typedef unsigned long int wctype_t;
+__END_NAMESPACE_C99
+
+# 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
+
+__BEGIN_NAMESPACE_C99
+/*
+ * 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;
+__END_NAMESPACE_C99
+
+
+/*
+ * Wide-character case-mapping functions: 7.15.3.1.
+ */
+
+__BEGIN_NAMESPACE_C99
+/* 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_NAMESPACE_C99
+
+__END_DECLS
+
+#endif /* bits/wctype-wchar.h.  */
diff --git a/wctype/wctype.h b/wctype/wctype.h
index acbd8df..437c203 100644
--- a/wctype/wctype.h
+++ b/wctype/wctype.h
@@ -21,165 +21,28 @@
  */
 
 #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
 
+/* Some definitions from this header also appear in <wchar.h> in
+   Unix98 mode.  */
+#include <bits/wctype-wchar.h>
 
-/* 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
-
-__BEGIN_NAMESPACE_C99
-/* Scalar type that can hold values which represent locale-specific
-   character classifications.  */
-typedef unsigned long int wctype_t;
-__END_NAMESPACE_C99
-
-# 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  */
-
+/*
+ * Extensible wide-character mapping functions: 7.15.3.2.
+ */
 
 __BEGIN_DECLS
 
-__BEGIN_NAMESPACE_C99
-/*
- * 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;
-__END_NAMESPACE_C99
-
-
-/*
- * Wide-character case-mapping functions: 7.15.3.1.
- */
-
 __BEGIN_NAMESPACE_C99
 /* Scalar type that can hold values which represent locale-specific
    character mappings.  */
@@ -189,29 +52,6 @@ __END_NAMESPACE_C99
 __USING_NAMESPACE_C99(wctrans_t)
 #endif
 
-__BEGIN_NAMESPACE_C99
-/* 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_NAMESPACE_C99
-
-__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
-
 __BEGIN_NAMESPACE_C99
 /* Construct value that describes a mapping between wide characters
    identified by the string argument PROPERTY.  */
@@ -289,7 +129,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.
  */
@@ -313,6 +152,4 @@ extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc,
 
 __END_DECLS
 
-#endif	/* __WCTYPE_H defined.  */
-
 #endif /* wctype.h  */
-- 
2.10.2


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]