1/* $OpenBSD: check_isw.c,v 1.2 2017/07/27 15:08:37 bluhm 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
28int bad = 0;
29
30void
31check_bool(int v1, int v2, char msg)
32{
33	if (!v1 != !v2) {
34		printf("%c", msg);
35		bad++;
36	}
37}
38
39void
40check_value(int v1, int v2, char msg)
41{
42	if (v1 != v2) {
43		printf("%c", msg);
44		bad++;
45	}
46}
47
48void
49test1()
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
75void
76test2()
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
141int
142main()
143{
144	test1();
145	test2();
146	return bad !=0;
147}
148