Blame include/safe-ctype.h

Packit bbfece
/* <ctype.h> replacement macros.
Packit bbfece
Packit bbfece
   Copyright (C) 2000-2018 Free Software Foundation, Inc.
Packit bbfece
   Contributed by Zack Weinberg <zackw@stanford.edu>.
Packit bbfece
Packit bbfece
This file is part of the libiberty library.
Packit bbfece
Libiberty is free software; you can redistribute it and/or
Packit bbfece
modify it under the terms of the GNU Library General Public
Packit bbfece
License as published by the Free Software Foundation; either
Packit bbfece
version 2 of the License, or (at your option) any later version.
Packit bbfece
Packit bbfece
Libiberty is distributed in the hope that it will be useful,
Packit bbfece
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit bbfece
Library General Public License for more details.
Packit bbfece
Packit bbfece
You should have received a copy of the GNU Library General Public
Packit bbfece
License along with libiberty; see the file COPYING.LIB.  If
Packit bbfece
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
Packit bbfece
Boston, MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
/* This is a compatible replacement of the standard C library's <ctype.h>
Packit bbfece
   with the following properties:
Packit bbfece
Packit bbfece
   - Implements all isxxx() macros required by C99.
Packit bbfece
   - Also implements some character classes useful when
Packit bbfece
     parsing C-like languages.
Packit bbfece
   - Does not change behavior depending on the current locale.
Packit bbfece
   - Behaves properly for all values in the range of a signed or
Packit bbfece
     unsigned char.
Packit bbfece
Packit bbfece
   To avoid conflicts, this header defines the isxxx functions in upper
Packit bbfece
   case, e.g. ISALPHA not isalpha.  */
Packit bbfece
Packit bbfece
#ifndef SAFE_CTYPE_H
Packit bbfece
#define SAFE_CTYPE_H
Packit bbfece
Packit bbfece
/* Determine host character set.  */
Packit bbfece
#define HOST_CHARSET_UNKNOWN 0
Packit bbfece
#define HOST_CHARSET_ASCII   1
Packit bbfece
#define HOST_CHARSET_EBCDIC  2
Packit bbfece
Packit bbfece
#if  '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \
Packit bbfece
   && 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21
Packit bbfece
#  define HOST_CHARSET HOST_CHARSET_ASCII
Packit bbfece
#else
Packit bbfece
# if '\n' == 0x15 && ' ' == 0x40 && '0' == 0xF0 \
Packit bbfece
   && 'A' == 0xC1 && 'a' == 0x81 && '!' == 0x5A
Packit bbfece
#  define HOST_CHARSET HOST_CHARSET_EBCDIC
Packit bbfece
# else
Packit bbfece
#  define HOST_CHARSET HOST_CHARSET_UNKNOWN
Packit bbfece
# endif
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* Categories.  */
Packit bbfece
Packit bbfece
enum {
Packit bbfece
  /* In C99 */
Packit bbfece
  _sch_isblank  = 0x0001,	/* space \t */
Packit bbfece
  _sch_iscntrl  = 0x0002,	/* nonprinting characters */
Packit bbfece
  _sch_isdigit  = 0x0004,	/* 0-9 */
Packit bbfece
  _sch_islower  = 0x0008,	/* a-z */
Packit bbfece
  _sch_isprint  = 0x0010,	/* any printing character including ' ' */
Packit bbfece
  _sch_ispunct  = 0x0020,	/* all punctuation */
Packit bbfece
  _sch_isspace  = 0x0040,	/* space \t \n \r \f \v */
Packit bbfece
  _sch_isupper  = 0x0080,	/* A-Z */
Packit bbfece
  _sch_isxdigit = 0x0100,	/* 0-9A-Fa-f */
Packit bbfece
Packit bbfece
  /* Extra categories useful to cpplib.  */
Packit bbfece
  _sch_isidst	= 0x0200,	/* A-Za-z_ */
Packit bbfece
  _sch_isvsp    = 0x0400,	/* \n \r */
Packit bbfece
  _sch_isnvsp   = 0x0800,	/* space \t \f \v \0 */
Packit bbfece
Packit bbfece
  /* Combinations of the above.  */
Packit bbfece
  _sch_isalpha  = _sch_isupper|_sch_islower,	/* A-Za-z */
Packit bbfece
  _sch_isalnum  = _sch_isalpha|_sch_isdigit,	/* A-Za-z0-9 */
Packit bbfece
  _sch_isidnum  = _sch_isidst|_sch_isdigit,	/* A-Za-z0-9_ */
Packit bbfece
  _sch_isgraph  = _sch_isalnum|_sch_ispunct,	/* isprint and not space */
Packit bbfece
  _sch_iscppsp  = _sch_isvsp|_sch_isnvsp,	/* isspace + \0 */
Packit bbfece
  _sch_isbasic  = _sch_isprint|_sch_iscppsp     /* basic charset of ISO C
Packit bbfece
						   (plus ` and @)  */
Packit bbfece
};
Packit bbfece
Packit bbfece
/* Character classification.  */
Packit bbfece
extern const unsigned short _sch_istable[256];
Packit bbfece
Packit bbfece
#define _sch_test(c, bit) (_sch_istable[(c) & 0xff] & (unsigned short)(bit))
Packit bbfece
Packit bbfece
#define ISALPHA(c)  _sch_test(c, _sch_isalpha)
Packit bbfece
#define ISALNUM(c)  _sch_test(c, _sch_isalnum)
Packit bbfece
#define ISBLANK(c)  _sch_test(c, _sch_isblank)
Packit bbfece
#define ISCNTRL(c)  _sch_test(c, _sch_iscntrl)
Packit bbfece
#define ISDIGIT(c)  _sch_test(c, _sch_isdigit)
Packit bbfece
#define ISGRAPH(c)  _sch_test(c, _sch_isgraph)
Packit bbfece
#define ISLOWER(c)  _sch_test(c, _sch_islower)
Packit bbfece
#define ISPRINT(c)  _sch_test(c, _sch_isprint)
Packit bbfece
#define ISPUNCT(c)  _sch_test(c, _sch_ispunct)
Packit bbfece
#define ISSPACE(c)  _sch_test(c, _sch_isspace)
Packit bbfece
#define ISUPPER(c)  _sch_test(c, _sch_isupper)
Packit bbfece
#define ISXDIGIT(c) _sch_test(c, _sch_isxdigit)
Packit bbfece
Packit bbfece
#define ISIDNUM(c)	_sch_test(c, _sch_isidnum)
Packit bbfece
#define ISIDST(c)	_sch_test(c, _sch_isidst)
Packit bbfece
#define IS_ISOBASIC(c)	_sch_test(c, _sch_isbasic)
Packit bbfece
#define IS_VSPACE(c)	_sch_test(c, _sch_isvsp)
Packit bbfece
#define IS_NVSPACE(c)	_sch_test(c, _sch_isnvsp)
Packit bbfece
#define IS_SPACE_OR_NUL(c)	_sch_test(c, _sch_iscppsp)
Packit bbfece
Packit bbfece
/* Character transformation.  */
Packit bbfece
extern const unsigned char  _sch_toupper[256];
Packit bbfece
extern const unsigned char  _sch_tolower[256];
Packit bbfece
#define TOUPPER(c) _sch_toupper[(c) & 0xff]
Packit bbfece
#define TOLOWER(c) _sch_tolower[(c) & 0xff]
Packit bbfece
Packit bbfece
/* Prevent the users of safe-ctype.h from accidently using the routines
Packit bbfece
   from ctype.h.  Initially, the approach was to produce an error when
Packit bbfece
   detecting that ctype.h has been included.  But this was causing
Packit bbfece
   trouble as ctype.h might get indirectly included as a result of
Packit bbfece
   including another system header (for instance gnulib's stdint.h).
Packit bbfece
   So we include ctype.h here and then immediately redefine its macros.  */
Packit bbfece
Packit bbfece
#include <ctype.h>
Packit bbfece
#undef isalpha
Packit bbfece
#define isalpha(c) do_not_use_isalpha_with_safe_ctype
Packit bbfece
#undef isalnum
Packit bbfece
#define isalnum(c) do_not_use_isalnum_with_safe_ctype
Packit bbfece
#undef iscntrl
Packit bbfece
#define iscntrl(c) do_not_use_iscntrl_with_safe_ctype
Packit bbfece
#undef isdigit
Packit bbfece
#define isdigit(c) do_not_use_isdigit_with_safe_ctype
Packit bbfece
#undef isgraph
Packit bbfece
#define isgraph(c) do_not_use_isgraph_with_safe_ctype
Packit bbfece
#undef islower
Packit bbfece
#define islower(c) do_not_use_islower_with_safe_ctype
Packit bbfece
#undef isprint
Packit bbfece
#define isprint(c) do_not_use_isprint_with_safe_ctype
Packit bbfece
#undef ispunct
Packit bbfece
#define ispunct(c) do_not_use_ispunct_with_safe_ctype
Packit bbfece
#undef isspace
Packit bbfece
#define isspace(c) do_not_use_isspace_with_safe_ctype
Packit bbfece
#undef isupper
Packit bbfece
#define isupper(c) do_not_use_isupper_with_safe_ctype
Packit bbfece
#undef isxdigit
Packit bbfece
#define isxdigit(c) do_not_use_isxdigit_with_safe_ctype
Packit bbfece
#undef toupper
Packit bbfece
#define toupper(c) do_not_use_toupper_with_safe_ctype
Packit bbfece
#undef tolower
Packit bbfece
#define tolower(c) do_not_use_tolower_with_safe_ctype
Packit bbfece
Packit bbfece
#endif /* SAFE_CTYPE_H */