1 /* <ctype.h> replacement macros.
3 Copyright (C) 2000 Free Software Foundation, Inc.
4 Contributed by Zack Weinberg <zackw@stanford.edu>.
6 This file is part of the libiberty library.
7 Libiberty is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
12 Libiberty is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
17 You should have received a copy of the GNU Library General Public
18 License along with libiberty; see the file COPYING.LIB. If
19 not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* This is a compatible replacement of the standard C library's <ctype.h>
23 with the following properties:
25 - Implements all isxxx() macros required by C99.
26 - Also implements some character classes useful when
27 parsing C-like languages.
28 - Does not change behavior depending on the current locale.
29 - Behaves properly for all values in the range of a signed or
33 #include <safe-ctype.h>
34 #include <stdio.h> /* for EOF */
37 #define bl _sch_isblank
38 #define cn _sch_iscntrl
39 #define di _sch_isdigit
40 #define is _sch_isidst
41 #define lo _sch_islower
42 #define nv _sch_isnvsp
43 #define pn _sch_ispunct
44 #define pr _sch_isprint
45 #define sp _sch_isspace
46 #define up _sch_isupper
48 #define xd _sch_isxdigit
51 #define L (const unsigned short) (lo|is |pr) /* lower case letter */
52 #define XL (const unsigned short) (lo|is|xd|pr) /* lowercase hex digit */
53 #define U (const unsigned short) (up|is |pr) /* upper case letter */
54 #define XU (const unsigned short) (up|is|xd|pr) /* uppercase hex digit */
55 #define D (const unsigned short) (di |xd|pr) /* decimal digit */
56 #define P (const unsigned short) (pn |pr) /* punctuation */
57 #define _ (const unsigned short) (pn|is |pr) /* underscore */
59 #define C (const unsigned short) ( cn) /* control character */
60 #define Z (const unsigned short) (nv |cn) /* NUL */
61 #define M (const unsigned short) (nv|sp |cn) /* cursor movement: \f \v */
62 #define V (const unsigned short) (vs|sp |cn) /* vertical space: \r \n */
63 #define T (const unsigned short) (nv|sp|bl|cn) /* tab */
64 #define S (const unsigned short) (nv|sp|bl|pr) /* space */
67 #if '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \
68 && 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21 \
71 const unsigned short _sch_istable
[256] =
73 Z
, C
, C
, C
, C
, C
, C
, C
, /* NUL SOH STX ETX EOT ENQ ACK BEL */
74 C
, T
, V
, M
, M
, V
, C
, C
, /* BS HT LF VT FF CR SO SI */
75 C
, C
, C
, C
, C
, C
, C
, C
, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
76 C
, C
, C
, C
, C
, C
, C
, C
, /* CAN EM SUB ESC FS GS RS US */
77 S
, P
, P
, P
, P
, P
, P
, P
, /* SP ! " # $ % & ' */
78 P
, P
, P
, P
, P
, P
, P
, P
, /* ( ) * + , - . / */
79 D
, D
, D
, D
, D
, D
, D
, D
, /* 0 1 2 3 4 5 6 7 */
80 D
, D
, P
, P
, P
, P
, P
, P
, /* 8 9 : ; < = > ? */
81 P
, XU
, XU
, XU
, XU
, XU
, XU
, U
, /* @ A B C D E F G */
82 U
, U
, U
, U
, U
, U
, U
, U
, /* H I J K L M N O */
83 U
, U
, U
, U
, U
, U
, U
, U
, /* P Q R S T U V W */
84 U
, U
, U
, P
, P
, P
, P
, _
, /* X Y Z [ \ ] ^ _ */
85 P
, XL
, XL
, XL
, XL
, XL
, XL
, L
, /* ` a b c d e f g */
86 L
, L
, L
, L
, L
, L
, L
, L
, /* h i j k l m n o */
87 L
, L
, L
, L
, L
, L
, L
, L
, /* p q r s t u v w */
88 L
, L
, L
, P
, P
, P
, P
, C
, /* x y z { | } ~ DEL */
90 /* high half of unsigned char is locale-specific, so all tests are
91 false in "C" locale */
92 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
93 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
94 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
95 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
98 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
99 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
100 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103 const unsigned char _sch_tolower
[256] =
105 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
106 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
107 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
108 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
111 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
112 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
114 91, 92, 93, 94, 95, 96,
116 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
117 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
121 128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
122 144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
123 160,161,162,163, 164,165,166,167, 168,169,170,171, 172,173,174,175,
124 176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,190,191,
126 192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207,
127 208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
128 224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
129 240,241,242,243, 244,245,246,247, 248,249,250,251, 252,253,254,255,
132 const unsigned char _sch_toupper
[256] =
134 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
135 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
136 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
137 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
140 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
141 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
143 91, 92, 93, 94, 95, 96,
145 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
146 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
150 128,129,130,131, 132,133,134,135, 136,137,138,139, 140,141,142,143,
151 144,145,146,147, 148,149,150,151, 152,153,154,155, 156,157,158,159,
152 160,161,162,163, 164,165,166,167, 168,169,170,171, 172,173,174,175,
153 176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,190,191,
155 192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207,
156 208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223,
157 224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239,
158 240,241,242,243, 244,245,246,247, 248,249,250,251, 252,253,254,255,
162 #error "Unsupported host character set"
163 #endif /* not ASCII */