1de4a1d01951937632098a6cda45859afa587a06fsewardj/* <ctype.h> replacement macros.
2de4a1d01951937632098a6cda45859afa587a06fsewardj
3de4a1d01951937632098a6cda45859afa587a06fsewardj   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
4de4a1d01951937632098a6cda45859afa587a06fsewardj   Contributed by Zack Weinberg <zackw@stanford.edu>.
5de4a1d01951937632098a6cda45859afa587a06fsewardj
6de4a1d01951937632098a6cda45859afa587a06fsewardjThis file is part of the libiberty library.
7de4a1d01951937632098a6cda45859afa587a06fsewardjLibiberty is free software; you can redistribute it and/or
8de4a1d01951937632098a6cda45859afa587a06fsewardjmodify it under the terms of the GNU Library General Public
9de4a1d01951937632098a6cda45859afa587a06fsewardjLicense as published by the Free Software Foundation; either
10de4a1d01951937632098a6cda45859afa587a06fsewardjversion 2 of the License, or (at your option) any later version.
11de4a1d01951937632098a6cda45859afa587a06fsewardj
12de4a1d01951937632098a6cda45859afa587a06fsewardjLibiberty is distributed in the hope that it will be useful,
13de4a1d01951937632098a6cda45859afa587a06fsewardjbut WITHOUT ANY WARRANTY; without even the implied warranty of
14de4a1d01951937632098a6cda45859afa587a06fsewardjMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15de4a1d01951937632098a6cda45859afa587a06fsewardjLibrary General Public License for more details.
16de4a1d01951937632098a6cda45859afa587a06fsewardj
17de4a1d01951937632098a6cda45859afa587a06fsewardjYou should have received a copy of the GNU Library General Public
18de4a1d01951937632098a6cda45859afa587a06fsewardjLicense along with libiberty; see the file COPYING.LIB.  If
194f2683ace412ca2c8266f2dd860dee4461df3cafsewardjnot, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
204f2683ace412ca2c8266f2dd860dee4461df3cafsewardjBoston, MA 02110-1301, USA.  */
21de4a1d01951937632098a6cda45859afa587a06fsewardj
22de4a1d01951937632098a6cda45859afa587a06fsewardj/* This is a compatible replacement of the standard C library's <ctype.h>
23de4a1d01951937632098a6cda45859afa587a06fsewardj   with the following properties:
24de4a1d01951937632098a6cda45859afa587a06fsewardj
25de4a1d01951937632098a6cda45859afa587a06fsewardj   - Implements all isxxx() macros required by C99.
26de4a1d01951937632098a6cda45859afa587a06fsewardj   - Also implements some character classes useful when
27de4a1d01951937632098a6cda45859afa587a06fsewardj     parsing C-like languages.
28de4a1d01951937632098a6cda45859afa587a06fsewardj   - Does not change behavior depending on the current locale.
29de4a1d01951937632098a6cda45859afa587a06fsewardj   - Behaves properly for all values in the range of a signed or
30de4a1d01951937632098a6cda45859afa587a06fsewardj     unsigned char.
31de4a1d01951937632098a6cda45859afa587a06fsewardj
32de4a1d01951937632098a6cda45859afa587a06fsewardj   To avoid conflicts, this header defines the isxxx functions in upper
33de4a1d01951937632098a6cda45859afa587a06fsewardj   case, e.g. ISALPHA not isalpha.  */
34de4a1d01951937632098a6cda45859afa587a06fsewardj
35de4a1d01951937632098a6cda45859afa587a06fsewardj#ifndef SAFE_CTYPE_H
36de4a1d01951937632098a6cda45859afa587a06fsewardj#define SAFE_CTYPE_H
37de4a1d01951937632098a6cda45859afa587a06fsewardj
384f2683ace412ca2c8266f2dd860dee4461df3cafsewardj/* Determine host character set.  */
394f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define HOST_CHARSET_UNKNOWN 0
404f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define HOST_CHARSET_ASCII   1
414f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define HOST_CHARSET_EBCDIC  2
424f2683ace412ca2c8266f2dd860dee4461df3cafsewardj
434f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#if  '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \
444f2683ace412ca2c8266f2dd860dee4461df3cafsewardj   && 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21
454f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#  define HOST_CHARSET HOST_CHARSET_ASCII
46de4a1d01951937632098a6cda45859afa587a06fsewardj#else
474f2683ace412ca2c8266f2dd860dee4461df3cafsewardj# if '\n' == 0x15 && ' ' == 0x40 && '0' == 0xF0 \
484f2683ace412ca2c8266f2dd860dee4461df3cafsewardj   && 'A' == 0xC1 && 'a' == 0x81 && '!' == 0x5A
494f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#  define HOST_CHARSET HOST_CHARSET_EBCDIC
504f2683ace412ca2c8266f2dd860dee4461df3cafsewardj# else
514f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#  define HOST_CHARSET HOST_CHARSET_UNKNOWN
524f2683ace412ca2c8266f2dd860dee4461df3cafsewardj# endif
534f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#endif
54de4a1d01951937632098a6cda45859afa587a06fsewardj
55de4a1d01951937632098a6cda45859afa587a06fsewardj/* Categories.  */
56de4a1d01951937632098a6cda45859afa587a06fsewardj
57de4a1d01951937632098a6cda45859afa587a06fsewardjenum {
58de4a1d01951937632098a6cda45859afa587a06fsewardj  /* In C99 */
59de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isblank  = 0x0001,	/* space \t */
60de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_iscntrl  = 0x0002,	/* nonprinting characters */
61de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isdigit  = 0x0004,	/* 0-9 */
62de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_islower  = 0x0008,	/* a-z */
63de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isprint  = 0x0010,	/* any printing character including ' ' */
64de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_ispunct  = 0x0020,	/* all punctuation */
65de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isspace  = 0x0040,	/* space \t \n \r \f \v */
66de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isupper  = 0x0080,	/* A-Z */
67de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isxdigit = 0x0100,	/* 0-9A-Fa-f */
68de4a1d01951937632098a6cda45859afa587a06fsewardj
69de4a1d01951937632098a6cda45859afa587a06fsewardj  /* Extra categories useful to cpplib.  */
70de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isidst	= 0x0200,	/* A-Za-z_ */
71de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isvsp    = 0x0400,	/* \n \r */
72de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isnvsp   = 0x0800,	/* space \t \f \v \0 */
73de4a1d01951937632098a6cda45859afa587a06fsewardj
74de4a1d01951937632098a6cda45859afa587a06fsewardj  /* Combinations of the above.  */
75de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isalpha  = _sch_isupper|_sch_islower,	/* A-Za-z */
76de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isalnum  = _sch_isalpha|_sch_isdigit,	/* A-Za-z0-9 */
77de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isidnum  = _sch_isidst|_sch_isdigit,	/* A-Za-z0-9_ */
78de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isgraph  = _sch_isalnum|_sch_ispunct,	/* isprint and not space */
79de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_iscppsp  = _sch_isvsp|_sch_isnvsp,	/* isspace + \0 */
80de4a1d01951937632098a6cda45859afa587a06fsewardj  _sch_isbasic  = _sch_isprint|_sch_iscppsp     /* basic charset of ISO C
81de4a1d01951937632098a6cda45859afa587a06fsewardj						   (plus ` and @)  */
82de4a1d01951937632098a6cda45859afa587a06fsewardj};
83de4a1d01951937632098a6cda45859afa587a06fsewardj
84de4a1d01951937632098a6cda45859afa587a06fsewardj/* Character classification.  */
85de4a1d01951937632098a6cda45859afa587a06fsewardjextern const unsigned short _sch_istable[256];
86de4a1d01951937632098a6cda45859afa587a06fsewardj
87de4a1d01951937632098a6cda45859afa587a06fsewardj#define _sch_test(c, bit) (_sch_istable[(c) & 0xff] & (unsigned short)(bit))
88de4a1d01951937632098a6cda45859afa587a06fsewardj
89de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISALPHA(c)  _sch_test(c, _sch_isalpha)
90de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISALNUM(c)  _sch_test(c, _sch_isalnum)
91de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISBLANK(c)  _sch_test(c, _sch_isblank)
92de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISCNTRL(c)  _sch_test(c, _sch_iscntrl)
93de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISDIGIT(c)  _sch_test(c, _sch_isdigit)
94de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISGRAPH(c)  _sch_test(c, _sch_isgraph)
95de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISLOWER(c)  _sch_test(c, _sch_islower)
96de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISPRINT(c)  _sch_test(c, _sch_isprint)
97de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISPUNCT(c)  _sch_test(c, _sch_ispunct)
98de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISSPACE(c)  _sch_test(c, _sch_isspace)
99de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISUPPER(c)  _sch_test(c, _sch_isupper)
100de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISXDIGIT(c) _sch_test(c, _sch_isxdigit)
101de4a1d01951937632098a6cda45859afa587a06fsewardj
102de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISIDNUM(c)	_sch_test(c, _sch_isidnum)
103de4a1d01951937632098a6cda45859afa587a06fsewardj#define ISIDST(c)	_sch_test(c, _sch_isidst)
104de4a1d01951937632098a6cda45859afa587a06fsewardj#define IS_ISOBASIC(c)	_sch_test(c, _sch_isbasic)
105de4a1d01951937632098a6cda45859afa587a06fsewardj#define IS_VSPACE(c)	_sch_test(c, _sch_isvsp)
106de4a1d01951937632098a6cda45859afa587a06fsewardj#define IS_NVSPACE(c)	_sch_test(c, _sch_isnvsp)
107de4a1d01951937632098a6cda45859afa587a06fsewardj#define IS_SPACE_OR_NUL(c)	_sch_test(c, _sch_iscppsp)
108de4a1d01951937632098a6cda45859afa587a06fsewardj
109de4a1d01951937632098a6cda45859afa587a06fsewardj/* Character transformation.  */
110de4a1d01951937632098a6cda45859afa587a06fsewardjextern const unsigned char  _sch_toupper[256];
111de4a1d01951937632098a6cda45859afa587a06fsewardjextern const unsigned char  _sch_tolower[256];
112de4a1d01951937632098a6cda45859afa587a06fsewardj#define TOUPPER(c) _sch_toupper[(c) & 0xff]
113de4a1d01951937632098a6cda45859afa587a06fsewardj#define TOLOWER(c) _sch_tolower[(c) & 0xff]
114de4a1d01951937632098a6cda45859afa587a06fsewardj
1154f2683ace412ca2c8266f2dd860dee4461df3cafsewardj/* Prevent the users of safe-ctype.h from accidently using the routines
1164f2683ace412ca2c8266f2dd860dee4461df3cafsewardj   from ctype.h.  Initially, the approach was to produce an error when
1174f2683ace412ca2c8266f2dd860dee4461df3cafsewardj   detecting that ctype.h has been included.  But this was causing
1184f2683ace412ca2c8266f2dd860dee4461df3cafsewardj   trouble as ctype.h might get indirectly included as a result of
1194f2683ace412ca2c8266f2dd860dee4461df3cafsewardj   including another system header (for instance gnulib's stdint.h).
1204f2683ace412ca2c8266f2dd860dee4461df3cafsewardj   So we include ctype.h here and then immediately redefine its macros.  */
1214f2683ace412ca2c8266f2dd860dee4461df3cafsewardj
1224f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#if 0 /* in valgrind */
1234f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#include <ctype.h>
1244f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#endif /* ! in valgrind */
1254f2683ace412ca2c8266f2dd860dee4461df3cafsewardj
1264f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isalpha
1274f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isalpha(c) do_not_use_isalpha_with_safe_ctype
1284f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isalnum
1294f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isalnum(c) do_not_use_isalnum_with_safe_ctype
1304f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef iscntrl
1314f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define iscntrl(c) do_not_use_iscntrl_with_safe_ctype
1324f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isdigit
1334f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isdigit(c) do_not_use_isdigit_with_safe_ctype
1344f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isgraph
1354f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isgraph(c) do_not_use_isgraph_with_safe_ctype
1364f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef islower
1374f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define islower(c) do_not_use_islower_with_safe_ctype
1384f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isprint
1394f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isprint(c) do_not_use_isprint_with_safe_ctype
1404f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef ispunct
1414f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define ispunct(c) do_not_use_ispunct_with_safe_ctype
1424f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isspace
1434f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isspace(c) do_not_use_isspace_with_safe_ctype
1444f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isupper
1454f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isupper(c) do_not_use_isupper_with_safe_ctype
1464f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef isxdigit
1474f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define isxdigit(c) do_not_use_isxdigit_with_safe_ctype
1484f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef toupper
1494f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define toupper(c) do_not_use_toupper_with_safe_ctype
1504f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#undef tolower
1514f2683ace412ca2c8266f2dd860dee4461df3cafsewardj#define tolower(c) do_not_use_tolower_with_safe_ctype
1524f2683ace412ca2c8266f2dd860dee4461df3cafsewardj
153de4a1d01951937632098a6cda45859afa587a06fsewardj#endif /* SAFE_CTYPE_H */
154