1 // 2002-05-10 ghazi
2 
3 // Copyright (C) 2002-2018 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 
26 typedef char char_type;
27 typedef std::char_traits<char_type> traits_type;
28 class 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().
test01()42 void test01()
43 {
44   const char_type *const ca = "aaaaa";
45   const char_type *const cz = "zzzzz";
46   const char_type *const cA = "AAAAA";
47   const char_type *const cZ = "ZZZZZ";
48   const char_type *const c0 = "00000";
49   const char_type *const c9 = "99999";
50   const char_type *const cs = "     ";
51   const char_type *const xf = "fffff";
52   const char_type *const xF = "FFFFF";
53   const char_type *const p1 = "!!!!!";
54   const char_type *const p2 = "/////";
55 
56   gnu_ctype gctype;
57 
58   // 'a'
59   VERIFY_SCAN_IS (std::ctype_base::alnum, ca, ca);
60   VERIFY_SCAN_IS (std::ctype_base::alpha, ca, ca);
61   VERIFY_SCAN_IS (std::ctype_base::cntrl, ca, ca+5);
62   VERIFY_SCAN_IS (std::ctype_base::digit, ca, ca+5);
63   VERIFY_SCAN_IS (std::ctype_base::graph, ca, ca);
64   VERIFY_SCAN_IS (std::ctype_base::lower, ca, ca);
65   VERIFY_SCAN_IS (std::ctype_base::print, ca, ca);
66   VERIFY_SCAN_IS (std::ctype_base::punct, ca, ca+5);
67   VERIFY_SCAN_IS (std::ctype_base::space, ca, ca+5);
68   VERIFY_SCAN_IS (std::ctype_base::upper, ca, ca+5);
69   VERIFY_SCAN_IS (std::ctype_base::xdigit, ca, ca);
70 
71   VERIFY_SCAN_NOT (std::ctype_base::alnum, ca, ca+5);
72   VERIFY_SCAN_NOT (std::ctype_base::alpha, ca, ca+5);
73   VERIFY_SCAN_NOT (std::ctype_base::cntrl, ca, ca);
74   VERIFY_SCAN_NOT (std::ctype_base::digit, ca, ca);
75   VERIFY_SCAN_NOT (std::ctype_base::graph, ca, ca+5);
76   VERIFY_SCAN_NOT (std::ctype_base::lower, ca, ca+5);
77   VERIFY_SCAN_NOT (std::ctype_base::print, ca, ca+5);
78   VERIFY_SCAN_NOT (std::ctype_base::punct, ca, ca);
79   VERIFY_SCAN_NOT (std::ctype_base::space, ca, ca);
80   VERIFY_SCAN_NOT (std::ctype_base::upper, ca, ca);
81   VERIFY_SCAN_NOT (std::ctype_base::xdigit, ca, ca+5);
82 
83   // 'z'
84   VERIFY_SCAN_IS (std::ctype_base::alnum, cz, cz);
85   VERIFY_SCAN_IS (std::ctype_base::alpha, cz, cz);
86   VERIFY_SCAN_IS (std::ctype_base::cntrl, cz, cz+5);
87   VERIFY_SCAN_IS (std::ctype_base::digit, cz, cz+5);
88   VERIFY_SCAN_IS (std::ctype_base::graph, cz, cz);
89   VERIFY_SCAN_IS (std::ctype_base::lower, cz, cz);
90   VERIFY_SCAN_IS (std::ctype_base::print, cz, cz);
91   VERIFY_SCAN_IS (std::ctype_base::punct, cz, cz+5);
92   VERIFY_SCAN_IS (std::ctype_base::space, cz, cz+5);
93   VERIFY_SCAN_IS (std::ctype_base::upper, cz, cz+5);
94   VERIFY_SCAN_IS (std::ctype_base::xdigit, cz, cz+5);
95 
96   VERIFY_SCAN_NOT (std::ctype_base::alnum, cz, cz+5);
97   VERIFY_SCAN_NOT (std::ctype_base::alpha, cz, cz+5);
98   VERIFY_SCAN_NOT (std::ctype_base::cntrl, cz, cz);
99   VERIFY_SCAN_NOT (std::ctype_base::digit, cz, cz);
100   VERIFY_SCAN_NOT (std::ctype_base::graph, cz, cz+5);
101   VERIFY_SCAN_NOT (std::ctype_base::lower, cz, cz+5);
102   VERIFY_SCAN_NOT (std::ctype_base::print, cz, cz+5);
103   VERIFY_SCAN_NOT (std::ctype_base::punct, cz, cz);
104   VERIFY_SCAN_NOT (std::ctype_base::space, cz, cz);
105   VERIFY_SCAN_NOT (std::ctype_base::upper, cz, cz);
106   VERIFY_SCAN_NOT (std::ctype_base::xdigit, cz, cz);
107 
108   // 'A'
109   VERIFY_SCAN_IS (std::ctype_base::alnum, cA, cA);
110   VERIFY_SCAN_IS (std::ctype_base::alpha, cA, cA);
111   VERIFY_SCAN_IS (std::ctype_base::cntrl, cA, cA+5);
112   VERIFY_SCAN_IS (std::ctype_base::digit, cA, cA+5);
113   VERIFY_SCAN_IS (std::ctype_base::graph, cA, cA);
114   VERIFY_SCAN_IS (std::ctype_base::lower, cA, cA+5);
115   VERIFY_SCAN_IS (std::ctype_base::print, cA, cA);
116   VERIFY_SCAN_IS (std::ctype_base::punct, cA, cA+5);
117   VERIFY_SCAN_IS (std::ctype_base::space, cA, cA+5);
118   VERIFY_SCAN_IS (std::ctype_base::upper, cA, cA);
119   VERIFY_SCAN_IS (std::ctype_base::xdigit, cA, cA);
120 
121   VERIFY_SCAN_NOT (std::ctype_base::alnum, cA, cA+5);
122   VERIFY_SCAN_NOT (std::ctype_base::alpha, cA, cA+5);
123   VERIFY_SCAN_NOT (std::ctype_base::cntrl, cA, cA);
124   VERIFY_SCAN_NOT (std::ctype_base::digit, cA, cA);
125   VERIFY_SCAN_NOT (std::ctype_base::graph, cA, cA+5);
126   VERIFY_SCAN_NOT (std::ctype_base::lower, cA, cA);
127   VERIFY_SCAN_NOT (std::ctype_base::print, cA, cA+5);
128   VERIFY_SCAN_NOT (std::ctype_base::punct, cA, cA);
129   VERIFY_SCAN_NOT (std::ctype_base::space, cA, cA);
130   VERIFY_SCAN_NOT (std::ctype_base::upper, cA, cA+5);
131   VERIFY_SCAN_NOT (std::ctype_base::xdigit, cA, cA+5);
132 
133   // 'Z'
134   VERIFY_SCAN_IS (std::ctype_base::alnum, cZ, cZ);
135   VERIFY_SCAN_IS (std::ctype_base::alpha, cZ, cZ);
136   VERIFY_SCAN_IS (std::ctype_base::cntrl, cZ, cZ+5);
137   VERIFY_SCAN_IS (std::ctype_base::digit, cZ, cZ+5);
138   VERIFY_SCAN_IS (std::ctype_base::graph, cZ, cZ);
139   VERIFY_SCAN_IS (std::ctype_base::lower, cZ, cZ+5);
140   VERIFY_SCAN_IS (std::ctype_base::print, cZ, cZ);
141   VERIFY_SCAN_IS (std::ctype_base::punct, cZ, cZ+5);
142   VERIFY_SCAN_IS (std::ctype_base::space, cZ, cZ+5);
143   VERIFY_SCAN_IS (std::ctype_base::upper, cZ, cZ);
144   VERIFY_SCAN_IS (std::ctype_base::xdigit, cZ, cZ+5);
145 
146   VERIFY_SCAN_NOT (std::ctype_base::alnum, cZ, cZ+5);
147   VERIFY_SCAN_NOT (std::ctype_base::alpha, cZ, cZ+5);
148   VERIFY_SCAN_NOT (std::ctype_base::cntrl, cZ, cZ);
149   VERIFY_SCAN_NOT (std::ctype_base::digit, cZ, cZ);
150   VERIFY_SCAN_NOT (std::ctype_base::graph, cZ, cZ+5);
151   VERIFY_SCAN_NOT (std::ctype_base::lower, cZ, cZ);
152   VERIFY_SCAN_NOT (std::ctype_base::print, cZ, cZ+5);
153   VERIFY_SCAN_NOT (std::ctype_base::punct, cZ, cZ);
154   VERIFY_SCAN_NOT (std::ctype_base::space, cZ, cZ);
155   VERIFY_SCAN_NOT (std::ctype_base::upper, cZ, cZ+5);
156   VERIFY_SCAN_NOT (std::ctype_base::xdigit, cZ, cZ);
157 
158   // '0'
159   VERIFY_SCAN_IS (std::ctype_base::alnum, c0, c0);
160   VERIFY_SCAN_IS (std::ctype_base::alpha, c0, c0+5);
161   VERIFY_SCAN_IS (std::ctype_base::cntrl, c0, c0+5);
162   VERIFY_SCAN_IS (std::ctype_base::digit, c0, c0);
163   VERIFY_SCAN_IS (std::ctype_base::graph, c0, c0);
164   VERIFY_SCAN_IS (std::ctype_base::lower, c0, c0+5);
165   VERIFY_SCAN_IS (std::ctype_base::print, c0, c0);
166   VERIFY_SCAN_IS (std::ctype_base::punct, c0, c0+5);
167   VERIFY_SCAN_IS (std::ctype_base::space, c0, c0+5);
168   VERIFY_SCAN_IS (std::ctype_base::upper, c0, c0+5);
169   VERIFY_SCAN_IS (std::ctype_base::xdigit, c0, c0);
170 
171   VERIFY_SCAN_NOT (std::ctype_base::alnum, c0, c0+5);
172   VERIFY_SCAN_NOT (std::ctype_base::alpha, c0, c0);
173   VERIFY_SCAN_NOT (std::ctype_base::cntrl, c0, c0);
174   VERIFY_SCAN_NOT (std::ctype_base::digit, c0, c0+5);
175   VERIFY_SCAN_NOT (std::ctype_base::graph, c0, c0+5);
176   VERIFY_SCAN_NOT (std::ctype_base::lower, c0, c0);
177   VERIFY_SCAN_NOT (std::ctype_base::print, c0, c0+5);
178   VERIFY_SCAN_NOT (std::ctype_base::punct, c0, c0);
179   VERIFY_SCAN_NOT (std::ctype_base::space, c0, c0);
180   VERIFY_SCAN_NOT (std::ctype_base::upper, c0, c0);
181   VERIFY_SCAN_NOT (std::ctype_base::xdigit, c0, c0+5);
182 
183   // '9'
184   VERIFY_SCAN_IS (std::ctype_base::alnum, c9, c9);
185   VERIFY_SCAN_IS (std::ctype_base::alpha, c9, c9+5);
186   VERIFY_SCAN_IS (std::ctype_base::cntrl, c9, c9+5);
187   VERIFY_SCAN_IS (std::ctype_base::digit, c9, c9);
188   VERIFY_SCAN_IS (std::ctype_base::graph, c9, c9);
189   VERIFY_SCAN_IS (std::ctype_base::lower, c9, c9+5);
190   VERIFY_SCAN_IS (std::ctype_base::print, c9, c9);
191   VERIFY_SCAN_IS (std::ctype_base::punct, c9, c9+5);
192   VERIFY_SCAN_IS (std::ctype_base::space, c9, c9+5);
193   VERIFY_SCAN_IS (std::ctype_base::upper, c9, c9+5);
194   VERIFY_SCAN_IS (std::ctype_base::xdigit, c9, c9);
195 
196   VERIFY_SCAN_NOT (std::ctype_base::alnum, c9, c9+5);
197   VERIFY_SCAN_NOT (std::ctype_base::alpha, c9, c9);
198   VERIFY_SCAN_NOT (std::ctype_base::cntrl, c9, c9);
199   VERIFY_SCAN_NOT (std::ctype_base::digit, c9, c9+5);
200   VERIFY_SCAN_NOT (std::ctype_base::graph, c9, c9+5);
201   VERIFY_SCAN_NOT (std::ctype_base::lower, c9, c9);
202   VERIFY_SCAN_NOT (std::ctype_base::print, c9, c9+5);
203   VERIFY_SCAN_NOT (std::ctype_base::punct, c9, c9);
204   VERIFY_SCAN_NOT (std::ctype_base::space, c9, c9);
205   VERIFY_SCAN_NOT (std::ctype_base::upper, c9, c9);
206   VERIFY_SCAN_NOT (std::ctype_base::xdigit, c9, c9+5);
207 
208   // ' '
209   VERIFY_SCAN_IS (std::ctype_base::alnum, cs, cs+5);
210   VERIFY_SCAN_IS (std::ctype_base::alpha, cs, cs+5);
211   VERIFY_SCAN_IS (std::ctype_base::cntrl, cs, cs+5);
212   VERIFY_SCAN_IS (std::ctype_base::digit, cs, cs+5);
213   VERIFY_SCAN_IS (std::ctype_base::graph, cs, cs+5);
214   VERIFY_SCAN_IS (std::ctype_base::lower, cs, cs+5);
215   VERIFY_SCAN_IS (std::ctype_base::print, cs, cs);
216   VERIFY_SCAN_IS (std::ctype_base::punct, cs, cs+5);
217   VERIFY_SCAN_IS (std::ctype_base::space, cs, cs);
218   VERIFY_SCAN_IS (std::ctype_base::upper, cs, cs+5);
219   VERIFY_SCAN_IS (std::ctype_base::xdigit, cs, cs+5);
220 
221   VERIFY_SCAN_NOT (std::ctype_base::alnum, cs, cs);
222   VERIFY_SCAN_NOT (std::ctype_base::alpha, cs, cs);
223   VERIFY_SCAN_NOT (std::ctype_base::cntrl, cs, cs);
224   VERIFY_SCAN_NOT (std::ctype_base::digit, cs, cs);
225   VERIFY_SCAN_NOT (std::ctype_base::graph, cs, cs);
226   VERIFY_SCAN_NOT (std::ctype_base::lower, cs, cs);
227   VERIFY_SCAN_NOT (std::ctype_base::print, cs, cs+5);
228   VERIFY_SCAN_NOT (std::ctype_base::punct, cs, cs);
229   VERIFY_SCAN_NOT (std::ctype_base::space, cs, cs+5);
230   VERIFY_SCAN_NOT (std::ctype_base::upper, cs, cs);
231   VERIFY_SCAN_NOT (std::ctype_base::xdigit, cs, cs);
232 
233   // 'f'
234   VERIFY_SCAN_IS (std::ctype_base::alnum, xf, xf);
235   VERIFY_SCAN_IS (std::ctype_base::alpha, xf, xf);
236   VERIFY_SCAN_IS (std::ctype_base::cntrl, xf, xf+5);
237   VERIFY_SCAN_IS (std::ctype_base::digit, xf, xf+5);
238   VERIFY_SCAN_IS (std::ctype_base::graph, xf, xf);
239   VERIFY_SCAN_IS (std::ctype_base::lower, xf, xf);
240   VERIFY_SCAN_IS (std::ctype_base::print, xf, xf);
241   VERIFY_SCAN_IS (std::ctype_base::punct, xf, xf+5);
242   VERIFY_SCAN_IS (std::ctype_base::space, xf, xf+5);
243   VERIFY_SCAN_IS (std::ctype_base::upper, xf, xf+5);
244   VERIFY_SCAN_IS (std::ctype_base::xdigit, xf, xf);
245 
246   VERIFY_SCAN_NOT (std::ctype_base::alnum, xf, xf+5);
247   VERIFY_SCAN_NOT (std::ctype_base::alpha, xf, xf+5);
248   VERIFY_SCAN_NOT (std::ctype_base::cntrl, xf, xf);
249   VERIFY_SCAN_NOT (std::ctype_base::digit, xf, xf);
250   VERIFY_SCAN_NOT (std::ctype_base::graph, xf, xf+5);
251   VERIFY_SCAN_NOT (std::ctype_base::lower, xf, xf+5);
252   VERIFY_SCAN_NOT (std::ctype_base::print, xf, xf+5);
253   VERIFY_SCAN_NOT (std::ctype_base::punct, xf, xf);
254   VERIFY_SCAN_NOT (std::ctype_base::space, xf, xf);
255   VERIFY_SCAN_NOT (std::ctype_base::upper, xf, xf);
256   VERIFY_SCAN_NOT (std::ctype_base::xdigit, xf, xf+5);
257 
258   // 'F'
259   VERIFY_SCAN_IS (std::ctype_base::alnum, xF, xF);
260   VERIFY_SCAN_IS (std::ctype_base::alpha, xF, xF);
261   VERIFY_SCAN_IS (std::ctype_base::cntrl, xF, xF+5);
262   VERIFY_SCAN_IS (std::ctype_base::digit, xF, xF+5);
263   VERIFY_SCAN_IS (std::ctype_base::graph, xF, xF);
264   VERIFY_SCAN_IS (std::ctype_base::lower, xF, xF+5);
265   VERIFY_SCAN_IS (std::ctype_base::print, xF, xF);
266   VERIFY_SCAN_IS (std::ctype_base::punct, xF, xF+5);
267   VERIFY_SCAN_IS (std::ctype_base::space, xF, xF+5);
268   VERIFY_SCAN_IS (std::ctype_base::upper, xF, xF);
269   VERIFY_SCAN_IS (std::ctype_base::xdigit, xF, xF);
270 
271   VERIFY_SCAN_NOT (std::ctype_base::alnum, xF, xF+5);
272   VERIFY_SCAN_NOT (std::ctype_base::alpha, xF, xF+5);
273   VERIFY_SCAN_NOT (std::ctype_base::cntrl, xF, xF);
274   VERIFY_SCAN_NOT (std::ctype_base::digit, xF, xF);
275   VERIFY_SCAN_NOT (std::ctype_base::graph, xF, xF+5);
276   VERIFY_SCAN_NOT (std::ctype_base::lower, xF, xF);
277   VERIFY_SCAN_NOT (std::ctype_base::print, xF, xF+5);
278   VERIFY_SCAN_NOT (std::ctype_base::punct, xF, xF);
279   VERIFY_SCAN_NOT (std::ctype_base::space, xF, xF);
280   VERIFY_SCAN_NOT (std::ctype_base::upper, xF, xF+5);
281   VERIFY_SCAN_NOT (std::ctype_base::xdigit, xF, xF+5);
282 
283   // '!'
284   VERIFY_SCAN_IS (std::ctype_base::alnum, p1, p1+5);
285   VERIFY_SCAN_IS (std::ctype_base::alpha, p1, p1+5);
286   VERIFY_SCAN_IS (std::ctype_base::cntrl, p1, p1+5);
287   VERIFY_SCAN_IS (std::ctype_base::digit, p1, p1+5);
288   VERIFY_SCAN_IS (std::ctype_base::graph, p1, p1);
289   VERIFY_SCAN_IS (std::ctype_base::lower, p1, p1+5);
290   VERIFY_SCAN_IS (std::ctype_base::print, p1, p1);
291   VERIFY_SCAN_IS (std::ctype_base::punct, p1, p1);
292   VERIFY_SCAN_IS (std::ctype_base::space, p1, p1+5);
293   VERIFY_SCAN_IS (std::ctype_base::upper, p1, p1+5);
294   VERIFY_SCAN_IS (std::ctype_base::xdigit, p1, p1+5);
295 
296   VERIFY_SCAN_NOT (std::ctype_base::alnum, p1, p1);
297   VERIFY_SCAN_NOT (std::ctype_base::alpha, p1, p1);
298   VERIFY_SCAN_NOT (std::ctype_base::cntrl, p1, p1);
299   VERIFY_SCAN_NOT (std::ctype_base::digit, p1, p1);
300   VERIFY_SCAN_NOT (std::ctype_base::lower, p1, p1);
301   VERIFY_SCAN_NOT (std::ctype_base::print, p1, p1+5);
302   VERIFY_SCAN_NOT (std::ctype_base::punct, p1, p1+5);
303   VERIFY_SCAN_NOT (std::ctype_base::space, p1, p1);
304   VERIFY_SCAN_NOT (std::ctype_base::upper, p1, p1);
305   VERIFY_SCAN_NOT (std::ctype_base::xdigit, p1, p1);
306 
307   // '/'
308   VERIFY_SCAN_IS (std::ctype_base::alnum, p2, p2+5);
309   VERIFY_SCAN_IS (std::ctype_base::alpha, p2, p2+5);
310   VERIFY_SCAN_IS (std::ctype_base::cntrl, p2, p2+5);
311   VERIFY_SCAN_IS (std::ctype_base::digit, p2, p2+5);
312   VERIFY_SCAN_IS (std::ctype_base::graph, p2, p2);
313   VERIFY_SCAN_IS (std::ctype_base::lower, p2, p2+5);
314   VERIFY_SCAN_IS (std::ctype_base::print, p2, p2);
315   VERIFY_SCAN_IS (std::ctype_base::punct, p2, p2);
316   VERIFY_SCAN_IS (std::ctype_base::space, p2, p2+5);
317   VERIFY_SCAN_IS (std::ctype_base::upper, p2, p2+5);
318   VERIFY_SCAN_IS (std::ctype_base::xdigit, p2, p2+5);
319 
320   VERIFY_SCAN_NOT (std::ctype_base::alnum, p2, p2);
321   VERIFY_SCAN_NOT (std::ctype_base::alpha, p2, p2);
322   VERIFY_SCAN_NOT (std::ctype_base::cntrl, p2, p2);
323   VERIFY_SCAN_NOT (std::ctype_base::digit, p2, p2);
324   VERIFY_SCAN_NOT (std::ctype_base::graph, p2, p2+5);
325   VERIFY_SCAN_NOT (std::ctype_base::lower, p2, p2);
326   VERIFY_SCAN_NOT (std::ctype_base::print, p2, p2+5);
327   VERIFY_SCAN_NOT (std::ctype_base::punct, p2, p2+5);
328   VERIFY_SCAN_NOT (std::ctype_base::space, p2, p2);
329   VERIFY_SCAN_NOT (std::ctype_base::upper, p2, p2);
330   VERIFY_SCAN_NOT (std::ctype_base::xdigit, p2, p2);
331 }
332 
main()333 int main()
334 {
335   test01();
336   return 0;
337 }
338