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