1 /* $OpenBSD: check_isw.c,v 1.1 2005/08/11 21:57:02 espie Exp $ */
2 /*
3  * Copyright (c) 2005 Marc Espie <espie@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /* This checks consistency of the isw* functions with the default <ctype>
19  * functions.
20  */
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <ctype.h>
25 #include <wchar.h>
26 #include <wctype.h>
27 
28 int bad = 0;
29 
30 void
31 check_bool(int v1, int v2, char msg)
32 {
33 	if (!v1 != !v2) {
34 		printf("%c", msg);
35 		bad++;
36 	}
37 }
38 
39 void
40 check_value(int v1, int v2, char msg)
41 {
42 	if (v1 != v2) {
43 		printf("%c", msg);
44 		bad++;
45 	}
46 }
47 
48 void
49 test1()
50 {
51 	int i;
52 
53 	for (i = 0; i < 256; i++) {
54 		printf(" %02x: ", i);
55 		check_bool(isalnum(i), iswalnum(i), '1');
56 		check_bool(isalpha(i), iswalpha(i), '2');
57 		check_bool(isblank(i), iswblank(i), '3');
58 		check_bool(iscntrl(i), iswcntrl(i), '4');
59 		check_bool(isdigit(i), iswdigit(i), '5');
60 		check_bool(isgraph(i), iswgraph(i), '6');
61 		check_bool(islower(i), iswlower(i), '6');
62 		check_bool(isprint(i), iswprint(i), '7');
63 		check_bool(ispunct(i), iswpunct(i), '8');
64 		check_bool(isspace(i), iswspace(i), '9');
65 		check_bool(isupper(i), iswupper(i), 'a');
66 		check_bool(isxdigit(i), iswxdigit(i), 'b');
67 		check_value(tolower(i), towlower(i), 'c');
68 		check_value(toupper(i), towupper(i), 'd');
69 		if (i % 8 == 7)
70 			printf("\n");
71 	}
72 	printf("%\n");
73 }
74 
75 void
76 test2()
77 {
78 	unsigned char *s;
79 	unsigned char *buf;
80 	int i, j;
81 	size_t n;
82 	wchar_t c, d;
83 	mbstate_t state;
84 
85 	s = malloc(256);
86 	if (!s) {
87 		bad++;
88 		return;
89 	}
90 	buf = malloc(MB_CUR_MAX);
91 	if (!buf) {
92 		bad++;
93 		free(s);
94 		return;
95 	}
96 	for (i = 0; i < 256; i++)
97 		s[i] = i+1;
98 
99 	j = 0;
100 	mbrtowc(NULL, NULL, 1, &state);
101 	printf(" %02x: ", 0);
102 
103 	while ((n = mbrtowc(&c, s+j, 256-j, &state)) == 1) {
104 		printf(" %02x: ", s[j]);
105 		check_bool(isalnum(s[j]), iswalnum(c), '1');
106 		check_bool(isalpha(s[j]), iswalpha(c), '2');
107 		check_bool(isblank(s[j]), iswblank(c), '3');
108 		check_bool(iscntrl(s[j]), iswcntrl(c), '4');
109 		check_bool(isdigit(s[j]), iswdigit(c), '5');
110 		check_bool(isgraph(s[j]), iswgraph(c), '6');
111 		check_bool(islower(s[j]), iswlower(c), '6');
112 		check_bool(isprint(s[j]), iswprint(c), '7');
113 		check_bool(ispunct(s[j]), iswpunct(c), '8');
114 		check_bool(isspace(s[j]), iswspace(c), '9');
115 		check_bool(isupper(s[j]), iswupper(c), 'a');
116 		check_bool(isxdigit(s[j]), iswxdigit(c), 'b');
117 		d = towlower(c);
118 		if (wctomb(buf, d) == 1) {
119 			check_value(tolower(s[j]), buf[0], 'c');
120 		} else {
121 			bad++;
122 		}
123 		d = towupper(c);
124 		if (wctomb(buf, d) == 1) {
125 			check_value(toupper(s[j]), buf[0], 'c');
126 		} else {
127 			bad++;
128 		}
129 		if (s[j] % 8 == 7)
130 			printf("\n");
131 		j++;
132 	}
133 	if (n != 0 || j != 255) {
134 		bad++;
135 	}
136 	free(s);
137 	free(buf);
138 }
139 
140 
141 int
142 main()
143 {
144 	test1();
145 	test2();
146 	return bad !=0;
147 }
148