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