xref: /freebsd/contrib/netbsd-tests/lib/libc/gen/t_vis.c (revision 57718be8fa0bd5edc11ab9a72e68cc71982939a6)
1*57718be8SEnji Cooper /*	$NetBSD: t_vis.c,v 1.7 2014/09/08 19:01:03 christos Exp $	*/
2*57718be8SEnji Cooper 
3*57718be8SEnji Cooper /*-
4*57718be8SEnji Cooper  * Copyright (c) 2002 The NetBSD Foundation, Inc.
5*57718be8SEnji Cooper  * All rights reserved.
6*57718be8SEnji Cooper  *
7*57718be8SEnji Cooper  * This code was contributed to The NetBSD Foundation by Christos Zoulas.
8*57718be8SEnji Cooper  *
9*57718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
10*57718be8SEnji Cooper  * modification, are permitted provided that the following conditions
11*57718be8SEnji Cooper  * are met:
12*57718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
13*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
14*57718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
15*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
16*57718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
17*57718be8SEnji Cooper  *
18*57718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19*57718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20*57718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21*57718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22*57718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*57718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*57718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*57718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*57718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*57718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*57718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
29*57718be8SEnji Cooper  */
30*57718be8SEnji Cooper 
31*57718be8SEnji Cooper #include <atf-c.h>
32*57718be8SEnji Cooper 
33*57718be8SEnji Cooper #include <string.h>
34*57718be8SEnji Cooper #include <stdlib.h>
35*57718be8SEnji Cooper #include <err.h>
36*57718be8SEnji Cooper #include <vis.h>
37*57718be8SEnji Cooper 
38*57718be8SEnji Cooper static int styles[] = {
39*57718be8SEnji Cooper 	VIS_OCTAL,
40*57718be8SEnji Cooper 	VIS_CSTYLE,
41*57718be8SEnji Cooper 	VIS_SP,
42*57718be8SEnji Cooper 	VIS_TAB,
43*57718be8SEnji Cooper 	VIS_NL,
44*57718be8SEnji Cooper 	VIS_WHITE,
45*57718be8SEnji Cooper 	VIS_SAFE,
46*57718be8SEnji Cooper #if 0	/* Not reversible */
47*57718be8SEnji Cooper 	VIS_NOSLASH,
48*57718be8SEnji Cooper #endif
49*57718be8SEnji Cooper 	VIS_HTTP1808,
50*57718be8SEnji Cooper 	VIS_MIMESTYLE,
51*57718be8SEnji Cooper #if 0	/* Not supported by vis(3) */
52*57718be8SEnji Cooper 	VIS_HTTP1866,
53*57718be8SEnji Cooper #endif
54*57718be8SEnji Cooper };
55*57718be8SEnji Cooper 
56*57718be8SEnji Cooper #define SIZE	256
57*57718be8SEnji Cooper 
58*57718be8SEnji Cooper ATF_TC(strvis_basic);
59*57718be8SEnji Cooper ATF_TC_HEAD(strvis_basic, tc)
60*57718be8SEnji Cooper {
61*57718be8SEnji Cooper 
62*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test strvis(3)");
63*57718be8SEnji Cooper }
64*57718be8SEnji Cooper 
65*57718be8SEnji Cooper ATF_TC_BODY(strvis_basic, tc)
66*57718be8SEnji Cooper {
67*57718be8SEnji Cooper 	char *srcbuf, *dstbuf, *visbuf;
68*57718be8SEnji Cooper 	unsigned int i, j;
69*57718be8SEnji Cooper 
70*57718be8SEnji Cooper 	ATF_REQUIRE((dstbuf = malloc(SIZE)) != NULL);
71*57718be8SEnji Cooper 	ATF_REQUIRE((srcbuf = malloc(SIZE)) != NULL);
72*57718be8SEnji Cooper 	ATF_REQUIRE((visbuf = malloc(SIZE * 4 + 1)) != NULL);
73*57718be8SEnji Cooper 
74*57718be8SEnji Cooper 	for (i = 0; i < SIZE; i++)
75*57718be8SEnji Cooper 		srcbuf[i] = (char)i;
76*57718be8SEnji Cooper 
77*57718be8SEnji Cooper 	for (i = 0; i < __arraycount(styles); i++) {
78*57718be8SEnji Cooper 		ATF_REQUIRE(strsvisx(visbuf, srcbuf, SIZE, styles[i], "") > 0);
79*57718be8SEnji Cooper 		memset(dstbuf, 0, SIZE);
80*57718be8SEnji Cooper 		ATF_REQUIRE(strunvisx(dstbuf, visbuf,
81*57718be8SEnji Cooper 		    styles[i] & (VIS_HTTP1808|VIS_MIMESTYLE)) > 0);
82*57718be8SEnji Cooper 		for (j = 0; j < SIZE; j++)
83*57718be8SEnji Cooper 			if (dstbuf[j] != (char)j)
84*57718be8SEnji Cooper 				atf_tc_fail_nonfatal("Failed for style %x, "
85*57718be8SEnji Cooper 				    "char %d [%d]", styles[i], j, dstbuf[j]);
86*57718be8SEnji Cooper 	}
87*57718be8SEnji Cooper 	free(dstbuf);
88*57718be8SEnji Cooper 	free(srcbuf);
89*57718be8SEnji Cooper 	free(visbuf);
90*57718be8SEnji Cooper }
91*57718be8SEnji Cooper 
92*57718be8SEnji Cooper ATF_TC(strvis_null);
93*57718be8SEnji Cooper ATF_TC_HEAD(strvis_null, tc)
94*57718be8SEnji Cooper {
95*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test strvis(3) NULL");
96*57718be8SEnji Cooper }
97*57718be8SEnji Cooper 
98*57718be8SEnji Cooper ATF_TC_BODY(strvis_null, tc)
99*57718be8SEnji Cooper {
100*57718be8SEnji Cooper 	char dst[] = "fail";
101*57718be8SEnji Cooper 	strvis(dst, NULL, VIS_SAFE);
102*57718be8SEnji Cooper 	ATF_REQUIRE(dst[0] == '\0' && dst[1] == 'a');
103*57718be8SEnji Cooper }
104*57718be8SEnji Cooper 
105*57718be8SEnji Cooper ATF_TC(strvis_empty);
106*57718be8SEnji Cooper ATF_TC_HEAD(strvis_empty, tc)
107*57718be8SEnji Cooper {
108*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test strvis(3) empty");
109*57718be8SEnji Cooper }
110*57718be8SEnji Cooper 
111*57718be8SEnji Cooper ATF_TC_BODY(strvis_empty, tc)
112*57718be8SEnji Cooper {
113*57718be8SEnji Cooper 	char dst[] = "fail";
114*57718be8SEnji Cooper 	strvis(dst, "", VIS_SAFE);
115*57718be8SEnji Cooper 	ATF_REQUIRE(dst[0] == '\0' && dst[1] == 'a');
116*57718be8SEnji Cooper }
117*57718be8SEnji Cooper 
118*57718be8SEnji Cooper ATF_TC(strunvis_hex);
119*57718be8SEnji Cooper ATF_TC_HEAD(strunvis_hex, tc)
120*57718be8SEnji Cooper {
121*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test strunvis(3) \\xXX");
122*57718be8SEnji Cooper }
123*57718be8SEnji Cooper 
124*57718be8SEnji Cooper ATF_TC_BODY(strunvis_hex, tc)
125*57718be8SEnji Cooper {
126*57718be8SEnji Cooper 	static const struct {
127*57718be8SEnji Cooper 		const char *e;
128*57718be8SEnji Cooper 		const char *d;
129*57718be8SEnji Cooper 		int error;
130*57718be8SEnji Cooper 	} ed[] = {
131*57718be8SEnji Cooper 		{ "\\xff", "\xff", 1 },
132*57718be8SEnji Cooper 		{ "\\x1", "\x1", 1 },
133*57718be8SEnji Cooper 		{ "\\x1\\x02", "\x1\x2", 2 },
134*57718be8SEnji Cooper 		{ "\\x1x", "\x1x", 2 },
135*57718be8SEnji Cooper 		{ "\\xx", "", -1 },
136*57718be8SEnji Cooper 	};
137*57718be8SEnji Cooper 	char uv[10];
138*57718be8SEnji Cooper 
139*57718be8SEnji Cooper 	for (size_t i = 0; i < __arraycount(ed); i++) {
140*57718be8SEnji Cooper 		ATF_REQUIRE(strunvis(uv, ed[i].e) == ed[i].error);
141*57718be8SEnji Cooper 		if (ed[i].error > 0)
142*57718be8SEnji Cooper 			ATF_REQUIRE(memcmp(ed[i].d, uv, ed[i].error) == 0);
143*57718be8SEnji Cooper 	}
144*57718be8SEnji Cooper }
145*57718be8SEnji Cooper 
146*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
147*57718be8SEnji Cooper {
148*57718be8SEnji Cooper 
149*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, strvis_basic);
150*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, strvis_null);
151*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, strvis_empty);
152*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, strunvis_hex);
153*57718be8SEnji Cooper 
154*57718be8SEnji Cooper 	return atf_no_error();
155*57718be8SEnji Cooper }
156