1// 2002-05-10 ghazi
2
3// Copyright (C) 2002-2015 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3.  If not see
18// <http://www.gnu.org/licenses/>.
19
20
21// { dg-do run }
22
23#include <locale>
24#include <testsuite_hooks.h>
25
26typedef char char_type;
27typedef std::char_traits<char_type> traits_type;
28class gnu_ctype: public std::ctype<char_type> { };
29
30// These two macros take a ctype mask, a string and a pointer within
31// the string that the scan function should return, usually either the
32// first or last character if the string contains identical values as
33// below.
34#define VERIFY_SCAN_IS(MASK, STRING, EXPECTED) \
35  VERIFY(gctype.scan_is((MASK), (STRING), \
36			(STRING) + traits_type::length(STRING)) == (EXPECTED))
37#define VERIFY_SCAN_NOT(MASK, STRING, EXPECTED) \
38  VERIFY(gctype.scan_not((MASK), (STRING), \
39			 (STRING) + traits_type::length(STRING)) == (EXPECTED))
40
41// Sanity check scan_is() and scan_not().
42void test01()
43{
44  bool test __attribute__((unused)) = true;
45
46  const char_type *const ca = "aaaaa";
47  const char_type *const cz = "zzzzz";
48  const char_type *const cA = "AAAAA";
49  const char_type *const cZ = "ZZZZZ";
50  const char_type *const c0 = "00000";
51  const char_type *const c9 = "99999";
52  const char_type *const cs = "     ";
53  const char_type *const xf = "fffff";
54  const char_type *const xF = "FFFFF";
55  const char_type *const p1 = "!!!!!";
56  const char_type *const p2 = "/////";
57
58  gnu_ctype gctype;
59
60  // 'a'
61  VERIFY_SCAN_IS (std::ctype_base::alnum, ca, ca);
62  VERIFY_SCAN_IS (std::ctype_base::alpha, ca, ca);
63  VERIFY_SCAN_IS (std::ctype_base::cntrl, ca, ca+5);
64  VERIFY_SCAN_IS (std::ctype_base::digit, ca, ca+5);
65  VERIFY_SCAN_IS (std::ctype_base::graph, ca, ca);
66  VERIFY_SCAN_IS (std::ctype_base::lower, ca, ca);
67  VERIFY_SCAN_IS (std::ctype_base::print, ca, ca);
68  VERIFY_SCAN_IS (std::ctype_base::punct, ca, ca+5);
69  VERIFY_SCAN_IS (std::ctype_base::space, ca, ca+5);
70  VERIFY_SCAN_IS (std::ctype_base::upper, ca, ca+5);
71  VERIFY_SCAN_IS (std::ctype_base::xdigit, ca, ca);
72
73  VERIFY_SCAN_NOT (std::ctype_base::alnum, ca, ca+5);
74  VERIFY_SCAN_NOT (std::ctype_base::alpha, ca, ca+5);
75  VERIFY_SCAN_NOT (std::ctype_base::cntrl, ca, ca);
76  VERIFY_SCAN_NOT (std::ctype_base::digit, ca, ca);
77  VERIFY_SCAN_NOT (std::ctype_base::graph, ca, ca+5);
78  VERIFY_SCAN_NOT (std::ctype_base::lower, ca, ca+5);
79  VERIFY_SCAN_NOT (std::ctype_base::print, ca, ca+5);
80  VERIFY_SCAN_NOT (std::ctype_base::punct, ca, ca);
81  VERIFY_SCAN_NOT (std::ctype_base::space, ca, ca);
82  VERIFY_SCAN_NOT (std::ctype_base::upper, ca, ca);
83  VERIFY_SCAN_NOT (std::ctype_base::xdigit, ca, ca+5);
84
85  // 'z'
86  VERIFY_SCAN_IS (std::ctype_base::alnum, cz, cz);
87  VERIFY_SCAN_IS (std::ctype_base::alpha, cz, cz);
88  VERIFY_SCAN_IS (std::ctype_base::cntrl, cz, cz+5);
89  VERIFY_SCAN_IS (std::ctype_base::digit, cz, cz+5);
90  VERIFY_SCAN_IS (std::ctype_base::graph, cz, cz);
91  VERIFY_SCAN_IS (std::ctype_base::lower, cz, cz);
92  VERIFY_SCAN_IS (std::ctype_base::print, cz, cz);
93  VERIFY_SCAN_IS (std::ctype_base::punct, cz, cz+5);
94  VERIFY_SCAN_IS (std::ctype_base::space, cz, cz+5);
95  VERIFY_SCAN_IS (std::ctype_base::upper, cz, cz+5);
96  VERIFY_SCAN_IS (std::ctype_base::xdigit, cz, cz+5);
97
98  VERIFY_SCAN_NOT (std::ctype_base::alnum, cz, cz+5);
99  VERIFY_SCAN_NOT (std::ctype_base::alpha, cz, cz+5);
100  VERIFY_SCAN_NOT (std::ctype_base::cntrl, cz, cz);
101  VERIFY_SCAN_NOT (std::ctype_base::digit, cz, cz);
102  VERIFY_SCAN_NOT (std::ctype_base::graph, cz, cz+5);
103  VERIFY_SCAN_NOT (std::ctype_base::lower, cz, cz+5);
104  VERIFY_SCAN_NOT (std::ctype_base::print, cz, cz+5);
105  VERIFY_SCAN_NOT (std::ctype_base::punct, cz, cz);
106  VERIFY_SCAN_NOT (std::ctype_base::space, cz, cz);
107  VERIFY_SCAN_NOT (std::ctype_base::upper, cz, cz);
108  VERIFY_SCAN_NOT (std::ctype_base::xdigit, cz, cz);
109
110  // 'A'
111  VERIFY_SCAN_IS (std::ctype_base::alnum, cA, cA);
112  VERIFY_SCAN_IS (std::ctype_base::alpha, cA, cA);
113  VERIFY_SCAN_IS (std::ctype_base::cntrl, cA, cA+5);
114  VERIFY_SCAN_IS (std::ctype_base::digit, cA, cA+5);
115  VERIFY_SCAN_IS (std::ctype_base::graph, cA, cA);
116  VERIFY_SCAN_IS (std::ctype_base::lower, cA, cA+5);
117  VERIFY_SCAN_IS (std::ctype_base::print, cA, cA);
118  VERIFY_SCAN_IS (std::ctype_base::punct, cA, cA+5);
119  VERIFY_SCAN_IS (std::ctype_base::space, cA, cA+5);
120  VERIFY_SCAN_IS (std::ctype_base::upper, cA, cA);
121  VERIFY_SCAN_IS (std::ctype_base::xdigit, cA, cA);
122
123  VERIFY_SCAN_NOT (std::ctype_base::alnum, cA, cA+5);
124  VERIFY_SCAN_NOT (std::ctype_base::alpha, cA, cA+5);
125  VERIFY_SCAN_NOT (std::ctype_base::cntrl, cA, cA);
126  VERIFY_SCAN_NOT (std::ctype_base::digit, cA, cA);
127  VERIFY_SCAN_NOT (std::ctype_base::graph, cA, cA+5);
128  VERIFY_SCAN_NOT (std::ctype_base::lower, cA, cA);
129  VERIFY_SCAN_NOT (std::ctype_base::print, cA, cA+5);
130  VERIFY_SCAN_NOT (std::ctype_base::punct, cA, cA);
131  VERIFY_SCAN_NOT (std::ctype_base::space, cA, cA);
132  VERIFY_SCAN_NOT (std::ctype_base::upper, cA, cA+5);
133  VERIFY_SCAN_NOT (std::ctype_base::xdigit, cA, cA+5);
134
135  // 'Z'
136  VERIFY_SCAN_IS (std::ctype_base::alnum, cZ, cZ);
137  VERIFY_SCAN_IS (std::ctype_base::alpha, cZ, cZ);
138  VERIFY_SCAN_IS (std::ctype_base::cntrl, cZ, cZ+5);
139  VERIFY_SCAN_IS (std::ctype_base::digit, cZ, cZ+5);
140  VERIFY_SCAN_IS (std::ctype_base::graph, cZ, cZ);
141  VERIFY_SCAN_IS (std::ctype_base::lower, cZ, cZ+5);
142  VERIFY_SCAN_IS (std::ctype_base::print, cZ, cZ);
143  VERIFY_SCAN_IS (std::ctype_base::punct, cZ, cZ+5);
144  VERIFY_SCAN_IS (std::ctype_base::space, cZ, cZ+5);
145  VERIFY_SCAN_IS (std::ctype_base::upper, cZ, cZ);
146  VERIFY_SCAN_IS (std::ctype_base::xdigit, cZ, cZ+5);
147
148  VERIFY_SCAN_NOT (std::ctype_base::alnum, cZ, cZ+5);
149  VERIFY_SCAN_NOT (std::ctype_base::alpha, cZ, cZ+5);
150  VERIFY_SCAN_NOT (std::ctype_base::cntrl, cZ, cZ);
151  VERIFY_SCAN_NOT (std::ctype_base::digit, cZ, cZ);
152  VERIFY_SCAN_NOT (std::ctype_base::graph, cZ, cZ+5);
153  VERIFY_SCAN_NOT (std::ctype_base::lower, cZ, cZ);
154  VERIFY_SCAN_NOT (std::ctype_base::print, cZ, cZ+5);
155  VERIFY_SCAN_NOT (std::ctype_base::punct, cZ, cZ);
156  VERIFY_SCAN_NOT (std::ctype_base::space, cZ, cZ);
157  VERIFY_SCAN_NOT (std::ctype_base::upper, cZ, cZ+5);
158  VERIFY_SCAN_NOT (std::ctype_base::xdigit, cZ, cZ);
159
160  // '0'
161  VERIFY_SCAN_IS (std::ctype_base::alnum, c0, c0);
162  VERIFY_SCAN_IS (std::ctype_base::alpha, c0, c0+5);
163  VERIFY_SCAN_IS (std::ctype_base::cntrl, c0, c0+5);
164  VERIFY_SCAN_IS (std::ctype_base::digit, c0, c0);
165  VERIFY_SCAN_IS (std::ctype_base::graph, c0, c0);
166  VERIFY_SCAN_IS (std::ctype_base::lower, c0, c0+5);
167  VERIFY_SCAN_IS (std::ctype_base::print, c0, c0);
168  VERIFY_SCAN_IS (std::ctype_base::punct, c0, c0+5);
169  VERIFY_SCAN_IS (std::ctype_base::space, c0, c0+5);
170  VERIFY_SCAN_IS (std::ctype_base::upper, c0, c0+5);
171  VERIFY_SCAN_IS (std::ctype_base::xdigit, c0, c0);
172
173  VERIFY_SCAN_NOT (std::ctype_base::alnum, c0, c0+5);
174  VERIFY_SCAN_NOT (std::ctype_base::alpha, c0, c0);
175  VERIFY_SCAN_NOT (std::ctype_base::cntrl, c0, c0);
176  VERIFY_SCAN_NOT (std::ctype_base::digit, c0, c0+5);
177  VERIFY_SCAN_NOT (std::ctype_base::graph, c0, c0+5);
178  VERIFY_SCAN_NOT (std::ctype_base::lower, c0, c0);
179  VERIFY_SCAN_NOT (std::ctype_base::print, c0, c0+5);
180  VERIFY_SCAN_NOT (std::ctype_base::punct, c0, c0);
181  VERIFY_SCAN_NOT (std::ctype_base::space, c0, c0);
182  VERIFY_SCAN_NOT (std::ctype_base::upper, c0, c0);
183  VERIFY_SCAN_NOT (std::ctype_base::xdigit, c0, c0+5);
184
185  // '9'
186  VERIFY_SCAN_IS (std::ctype_base::alnum, c9, c9);
187  VERIFY_SCAN_IS (std::ctype_base::alpha, c9, c9+5);
188  VERIFY_SCAN_IS (std::ctype_base::cntrl, c9, c9+5);
189  VERIFY_SCAN_IS (std::ctype_base::digit, c9, c9);
190  VERIFY_SCAN_IS (std::ctype_base::graph, c9, c9);
191  VERIFY_SCAN_IS (std::ctype_base::lower, c9, c9+5);
192  VERIFY_SCAN_IS (std::ctype_base::print, c9, c9);
193  VERIFY_SCAN_IS (std::ctype_base::punct, c9, c9+5);
194  VERIFY_SCAN_IS (std::ctype_base::space, c9, c9+5);
195  VERIFY_SCAN_IS (std::ctype_base::upper, c9, c9+5);
196  VERIFY_SCAN_IS (std::ctype_base::xdigit, c9, c9);
197
198  VERIFY_SCAN_NOT (std::ctype_base::alnum, c9, c9+5);
199  VERIFY_SCAN_NOT (std::ctype_base::alpha, c9, c9);
200  VERIFY_SCAN_NOT (std::ctype_base::cntrl, c9, c9);
201  VERIFY_SCAN_NOT (std::ctype_base::digit, c9, c9+5);
202  VERIFY_SCAN_NOT (std::ctype_base::graph, c9, c9+5);
203  VERIFY_SCAN_NOT (std::ctype_base::lower, c9, c9);
204  VERIFY_SCAN_NOT (std::ctype_base::print, c9, c9+5);
205  VERIFY_SCAN_NOT (std::ctype_base::punct, c9, c9);
206  VERIFY_SCAN_NOT (std::ctype_base::space, c9, c9);
207  VERIFY_SCAN_NOT (std::ctype_base::upper, c9, c9);
208  VERIFY_SCAN_NOT (std::ctype_base::xdigit, c9, c9+5);
209
210  // ' '
211  VERIFY_SCAN_IS (std::ctype_base::alnum, cs, cs+5);
212  VERIFY_SCAN_IS (std::ctype_base::alpha, cs, cs+5);
213  VERIFY_SCAN_IS (std::ctype_base::cntrl, cs, cs+5);
214  VERIFY_SCAN_IS (std::ctype_base::digit, cs, cs+5);
215  VERIFY_SCAN_IS (std::ctype_base::graph, cs, cs+5);
216  VERIFY_SCAN_IS (std::ctype_base::lower, cs, cs+5);
217  VERIFY_SCAN_IS (std::ctype_base::print, cs, cs);
218  VERIFY_SCAN_IS (std::ctype_base::punct, cs, cs+5);
219  VERIFY_SCAN_IS (std::ctype_base::space, cs, cs);
220  VERIFY_SCAN_IS (std::ctype_base::upper, cs, cs+5);
221  VERIFY_SCAN_IS (std::ctype_base::xdigit, cs, cs+5);
222
223  VERIFY_SCAN_NOT (std::ctype_base::alnum, cs, cs);
224  VERIFY_SCAN_NOT (std::ctype_base::alpha, cs, cs);
225  VERIFY_SCAN_NOT (std::ctype_base::cntrl, cs, cs);
226  VERIFY_SCAN_NOT (std::ctype_base::digit, cs, cs);
227  VERIFY_SCAN_NOT (std::ctype_base::graph, cs, cs);
228  VERIFY_SCAN_NOT (std::ctype_base::lower, cs, cs);
229  VERIFY_SCAN_NOT (std::ctype_base::print, cs, cs+5);
230  VERIFY_SCAN_NOT (std::ctype_base::punct, cs, cs);
231  VERIFY_SCAN_NOT (std::ctype_base::space, cs, cs+5);
232  VERIFY_SCAN_NOT (std::ctype_base::upper, cs, cs);
233  VERIFY_SCAN_NOT (std::ctype_base::xdigit, cs, cs);
234
235  // 'f'
236  VERIFY_SCAN_IS (std::ctype_base::alnum, xf, xf);
237  VERIFY_SCAN_IS (std::ctype_base::alpha, xf, xf);
238  VERIFY_SCAN_IS (std::ctype_base::cntrl, xf, xf+5);
239  VERIFY_SCAN_IS (std::ctype_base::digit, xf, xf+5);
240  VERIFY_SCAN_IS (std::ctype_base::graph, xf, xf);
241  VERIFY_SCAN_IS (std::ctype_base::lower, xf, xf);
242  VERIFY_SCAN_IS (std::ctype_base::print, xf, xf);
243  VERIFY_SCAN_IS (std::ctype_base::punct, xf, xf+5);
244  VERIFY_SCAN_IS (std::ctype_base::space, xf, xf+5);
245  VERIFY_SCAN_IS (std::ctype_base::upper, xf, xf+5);
246  VERIFY_SCAN_IS (std::ctype_base::xdigit, xf, xf);
247
248  VERIFY_SCAN_NOT (std::ctype_base::alnum, xf, xf+5);
249  VERIFY_SCAN_NOT (std::ctype_base::alpha, xf, xf+5);
250  VERIFY_SCAN_NOT (std::ctype_base::cntrl, xf, xf);
251  VERIFY_SCAN_NOT (std::ctype_base::digit, xf, xf);
252  VERIFY_SCAN_NOT (std::ctype_base::graph, xf, xf+5);
253  VERIFY_SCAN_NOT (std::ctype_base::lower, xf, xf+5);
254  VERIFY_SCAN_NOT (std::ctype_base::print, xf, xf+5);
255  VERIFY_SCAN_NOT (std::ctype_base::punct, xf, xf);
256  VERIFY_SCAN_NOT (std::ctype_base::space, xf, xf);
257  VERIFY_SCAN_NOT (std::ctype_base::upper, xf, xf);
258  VERIFY_SCAN_NOT (std::ctype_base::xdigit, xf, xf+5);
259
260  // 'F'
261  VERIFY_SCAN_IS (std::ctype_base::alnum, xF, xF);
262  VERIFY_SCAN_IS (std::ctype_base::alpha, xF, xF);
263  VERIFY_SCAN_IS (std::ctype_base::cntrl, xF, xF+5);
264  VERIFY_SCAN_IS (std::ctype_base::digit, xF, xF+5);
265  VERIFY_SCAN_IS (std::ctype_base::graph, xF, xF);
266  VERIFY_SCAN_IS (std::ctype_base::lower, xF, xF+5);
267  VERIFY_SCAN_IS (std::ctype_base::print, xF, xF);
268  VERIFY_SCAN_IS (std::ctype_base::punct, xF, xF+5);
269  VERIFY_SCAN_IS (std::ctype_base::space, xF, xF+5);
270  VERIFY_SCAN_IS (std::ctype_base::upper, xF, xF);
271  VERIFY_SCAN_IS (std::ctype_base::xdigit, xF, xF);
272
273  VERIFY_SCAN_NOT (std::ctype_base::alnum, xF, xF+5);
274  VERIFY_SCAN_NOT (std::ctype_base::alpha, xF, xF+5);
275  VERIFY_SCAN_NOT (std::ctype_base::cntrl, xF, xF);
276  VERIFY_SCAN_NOT (std::ctype_base::digit, xF, xF);
277  VERIFY_SCAN_NOT (std::ctype_base::graph, xF, xF+5);
278  VERIFY_SCAN_NOT (std::ctype_base::lower, xF, xF);
279  VERIFY_SCAN_NOT (std::ctype_base::print, xF, xF+5);
280  VERIFY_SCAN_NOT (std::ctype_base::punct, xF, xF);
281  VERIFY_SCAN_NOT (std::ctype_base::space, xF, xF);
282  VERIFY_SCAN_NOT (std::ctype_base::upper, xF, xF+5);
283  VERIFY_SCAN_NOT (std::ctype_base::xdigit, xF, xF+5);
284
285  // '!'
286  VERIFY_SCAN_IS (std::ctype_base::alnum, p1, p1+5);
287  VERIFY_SCAN_IS (std::ctype_base::alpha, p1, p1+5);
288  VERIFY_SCAN_IS (std::ctype_base::cntrl, p1, p1+5);
289  VERIFY_SCAN_IS (std::ctype_base::digit, p1, p1+5);
290  VERIFY_SCAN_IS (std::ctype_base::graph, p1, p1);
291  VERIFY_SCAN_IS (std::ctype_base::lower, p1, p1+5);
292  VERIFY_SCAN_IS (std::ctype_base::print, p1, p1);
293  VERIFY_SCAN_IS (std::ctype_base::punct, p1, p1);
294  VERIFY_SCAN_IS (std::ctype_base::space, p1, p1+5);
295  VERIFY_SCAN_IS (std::ctype_base::upper, p1, p1+5);
296  VERIFY_SCAN_IS (std::ctype_base::xdigit, p1, p1+5);
297
298  VERIFY_SCAN_NOT (std::ctype_base::alnum, p1, p1);
299  VERIFY_SCAN_NOT (std::ctype_base::alpha, p1, p1);
300  VERIFY_SCAN_NOT (std::ctype_base::cntrl, p1, p1);
301  VERIFY_SCAN_NOT (std::ctype_base::digit, p1, p1);
302  VERIFY_SCAN_NOT (std::ctype_base::lower, p1, p1);
303  VERIFY_SCAN_NOT (std::ctype_base::print, p1, p1+5);
304  VERIFY_SCAN_NOT (std::ctype_base::punct, p1, p1+5);
305  VERIFY_SCAN_NOT (std::ctype_base::space, p1, p1);
306  VERIFY_SCAN_NOT (std::ctype_base::upper, p1, p1);
307  VERIFY_SCAN_NOT (std::ctype_base::xdigit, p1, p1);
308
309  // '/'
310  VERIFY_SCAN_IS (std::ctype_base::alnum, p2, p2+5);
311  VERIFY_SCAN_IS (std::ctype_base::alpha, p2, p2+5);
312  VERIFY_SCAN_IS (std::ctype_base::cntrl, p2, p2+5);
313  VERIFY_SCAN_IS (std::ctype_base::digit, p2, p2+5);
314  VERIFY_SCAN_IS (std::ctype_base::graph, p2, p2);
315  VERIFY_SCAN_IS (std::ctype_base::lower, p2, p2+5);
316  VERIFY_SCAN_IS (std::ctype_base::print, p2, p2);
317  VERIFY_SCAN_IS (std::ctype_base::punct, p2, p2);
318  VERIFY_SCAN_IS (std::ctype_base::space, p2, p2+5);
319  VERIFY_SCAN_IS (std::ctype_base::upper, p2, p2+5);
320  VERIFY_SCAN_IS (std::ctype_base::xdigit, p2, p2+5);
321
322  VERIFY_SCAN_NOT (std::ctype_base::alnum, p2, p2);
323  VERIFY_SCAN_NOT (std::ctype_base::alpha, p2, p2);
324  VERIFY_SCAN_NOT (std::ctype_base::cntrl, p2, p2);
325  VERIFY_SCAN_NOT (std::ctype_base::digit, p2, p2);
326  VERIFY_SCAN_NOT (std::ctype_base::graph, p2, p2+5);
327  VERIFY_SCAN_NOT (std::ctype_base::lower, p2, p2);
328  VERIFY_SCAN_NOT (std::ctype_base::print, p2, p2+5);
329  VERIFY_SCAN_NOT (std::ctype_base::punct, p2, p2+5);
330  VERIFY_SCAN_NOT (std::ctype_base::space, p2, p2);
331  VERIFY_SCAN_NOT (std::ctype_base::upper, p2, p2);
332  VERIFY_SCAN_NOT (std::ctype_base::xdigit, p2, p2);
333}
334
335int main()
336{
337  test01();
338  return 0;
339}
340