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.
This commit is contained in:
Zack Weinberg 2016-11-20 23:00:02 -05:00
parent 4615f5aefe
commit 199fc19d3a
34 changed files with 362 additions and 387 deletions

View File

@ -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

View File

@ -49,8 +49,7 @@ struct group
#ifdef __USE_MISC
# define __need_FILE
# include <stdio.h>
# include <bits/types/FILE.h>
#endif

View File

@ -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>

View File

@ -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. */

View File

@ -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>

View File

@ -0,0 +1 @@
#include <libio/bits/types/FILE.h>

View File

@ -0,0 +1 @@
#include <libio/bits/types/__FILE.h>

View File

@ -0,0 +1 @@
#include <wcsmbs/bits/types/__mbstate_t.h>

View File

@ -0,0 +1 @@
#include <wcsmbs/bits/types/mbstate_t.h>

View File

@ -0,0 +1 @@
#include <wcsmbs/bits/types/wint_t.h>

View File

@ -0,0 +1 @@
#include <wctype/bits/wctype-wchar.h>

View File

@ -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>
# 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 */

View File

@ -1,8 +1,6 @@
#ifndef _WCHAR_H
# include <wcsmbs/wchar.h>
# ifndef _ISOMAC
# ifdef _WCHAR_H
extern __typeof (wcscasecmp_l) __wcscasecmp_l;
extern __typeof (wcsncasecmp_l) __wcsncasecmp_l;
@ -220,9 +218,3 @@ extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,
# 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

View File

@ -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);

View File

@ -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 \

9
libio/bits/types/FILE.h Normal file
View File

@ -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

View File

@ -0,0 +1,7 @@
#ifndef ____FILE_defined
#define ____FILE_defined 1
struct _IO_FILE;
typedef struct _IO_FILE __FILE;
#endif

View File

@ -21,9 +21,8 @@
*/
#ifndef _STDIO_H
#if !defined __need_FILE && !defined __need___FILE
#define _STDIO_H 1
#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
#include <bits/libc-header-start.h>
@ -34,35 +33,9 @@ __BEGIN_DECLS
#include <stddef.h>
#include <bits/types.h>
# define __need_FILE
# define __need___FILE
#endif /* Don't need FILE. */
#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 */

View File

@ -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);

View File

@ -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. */

View File

@ -59,8 +59,7 @@ struct passwd
#ifdef __USE_MISC
# define __need_FILE
# include <stdio.h>
# include <bits/types/FILE.h>
#endif

View File

@ -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

View File

@ -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>

View File

@ -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;

View File

@ -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;

View File

@ -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 \

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -21,82 +21,32 @@
*/
#ifndef _WCHAR_H
#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
#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_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>
/* 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;
#if defined __USE_UNIX98 || defined __USE_XOPEN2K
# include <bits/types/FILE.h>
#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
/* 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

View File

@ -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

173
wctype/bits/wctype-wchar.h Normal file
View File

@ -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. */

View File

@ -21,179 +21,21 @@
*/
#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
#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
/*
* 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
<wchar.h> header. */
#ifdef _WCTYPE_H
/* Some definitions from this header also appear in <wchar.h> in
Unix98 mode. */
#include <bits/wctype-wchar.h>
/*
* 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 */