7ce604e75880a2f633f644413ab1d627c74fd5c1
[kopensolaris-gnu/glibc.git] / ctype / ctype.h
1 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 /*
20  *      ANSI Standard 4.3: CHARACTER HANDLING   <ctype.h>
21  */
22
23 #ifndef _CTYPE_H
24
25 #define _CTYPE_H        1
26 #include <features.h>
27
28 __BEGIN_DECLS
29
30 /* These are all the characteristics of characters.  All the
31    interdependencies (such as that an alphabetic is an uppercase or a
32    lowercase) are here.  If there get to be more than
33    (sizeof (unsigned short int) * CHAR_BIT) distinct characteristics,
34    many things must be changed that use `unsigned short int's.  */
35 enum
36 {
37   _ISupper = 1 << 0,            /* UPPERCASE.  */
38   _ISlower = 1 << 1,            /* lowercase.  */
39   _IScntrl = 1 << 2,            /* Control character.  */
40   _ISdigit = 1 << 3,            /* Numeric.  */
41   _ISspace = 1 << 4,            /* Whitespace.  */
42   _IShex = 1 << 5,              /* A - F, a - f.  */
43   _ISpunct = 1 << 6,            /* Punctuation.  */
44   _NOgraph = 1 << 7,            /* Printing but nongraphical.  */
45   _ISblank = 1 << 8,            /* Blank (usually SPC and TAB).  */
46   _ISalpha = _ISupper | _ISlower,       /* Alphabetic.  */
47   _ISalnum = _ISalpha | _ISdigit,       /* Alphanumeric.  */
48   _ISxdigit = _ISdigit | _IShex,/* Hexadecimal numeric.  */
49   _ISgraph = _ISalnum | _ISpunct,       /* Graphical.  */
50   _ISprint = _ISgraph | _NOgraph/* Printing.  */
51 };
52
53 /* These are defined in localeinfo.c.
54    The declarations here must match those in localeinfo.h.  */
55 extern __const unsigned short int *__ctype_b;   /* Characteristics.  */
56 extern __const unsigned char *__ctype_tolower;  /* Case conversions.  */
57 extern __const unsigned char *__ctype_toupper;  /* Case conversions.  */
58
59 #define __isctype(c, type)      (__ctype_b[c] & (unsigned short int) type)
60
61 #define __isascii(c)    (((c) & (1 << 7)) == 0)
62 #define __toascii(c)    ((c) & 0x7f)
63
64 #define __tolower(c)    __ctype_tolower[c]
65 #define __toupper(c)    __ctype_toupper[c]
66
67 /* @ This line MUST be broken!  m4 will not change it otherwise. @ */
68 #define __exctype(name) \
69   extern int name __P ((int))
70
71 /* The following names are all functions:
72      int isCHARACTERISTIC(int c);
73    which return nonzero iff C has CHARACTERISTIC.
74    For the meaning of the characteristic names, see the `enum' above.  */
75 __exctype (isalnum);
76 __exctype (isalpha);
77 __exctype (iscntrl);
78 __exctype (isdigit);
79 __exctype (islower);
80 __exctype (isgraph);
81 __exctype (isprint);
82 __exctype (ispunct);
83 __exctype (isspace);
84 __exctype (isupper);
85 __exctype (isxdigit);
86
87 #ifdef  __USE_GNU
88 __exctype (isblank);
89 #endif
90
91
92 /* Return the lowercase version of C.  */
93 extern int tolower __P ((int __c));
94
95 /* Return the uppercase version of C.  */
96 extern int toupper __P ((int __c));
97
98
99 #if defined(__USE_SVID) || defined(__USE_MISC)
100
101 /* Return nonzero iff C is in the ASCII set
102    (i.e., is no more than 7 bits wide).  */
103 extern int isascii __P ((int __c));
104
105 /* Return the part of C that is in the ASCII set
106    (i.e., the low-order 7 bits of C).  */
107 extern int toascii __P ((int __c));
108
109 #endif /* Use SVID or use misc.  */
110
111 #ifdef  __USE_SVID
112 /* These are the same as `toupper' and and `tolower'.  */
113 __exctype (_toupper);
114 __exctype (_tolower);
115 #endif
116
117 #ifndef __NO_CTYPE
118 #define isalnum(c)      __isctype((c), _ISalnum)
119 #define isalpha(c)      __isctype((c), _ISalpha)
120 #define iscntrl(c)      __isctype((c), _IScntrl)
121 #define isdigit(c)      __isctype((c), _ISdigit)
122 #define islower(c)      __isctype((c), _ISlower)
123 #define isgraph(c)      __isctype((c), _ISgraph)
124 #define isprint(c)      __isctype((c), _ISprint)
125 #define ispunct(c)      __isctype((c), _ISpunct)
126 #define isspace(c)      __isctype((c), _ISspace)
127 #define isupper(c)      __isctype((c), _ISupper)
128 #define isxdigit(c)     __isctype((c), _ISxdigit)
129
130 #ifdef  __USE_GNU
131 #define isblank(c)      __isctype((c), _ISblank)
132 #endif
133
134 #ifdef  __GNUC__
135 extern __inline int
136 tolower (int __c)
137 {
138   if ((unsigned char) __c != __c)
139     return __c;
140   else
141     return __tolower (__c);
142 }
143
144 extern __inline int
145 toupper (int __c)
146 {
147   if ((unsigned char) __c != __c)
148     return __c;
149   else
150     return __toupper (__c);
151 }
152 #endif  /* GCC.  */
153
154 #if defined(__USE_SVID) || defined(__USE_MISC)
155 #define isascii(c)      __isascii(c)
156 #define toascii(c)      __toascii(c)
157 #endif
158
159 #endif /* Not __NO_CTYPE.  */
160
161 __END_DECLS
162
163 #endif /* ctype.h  */