xref: /netbsd-src/tests/kernel/gen_t_subr_prf (revision 76c7fc5f6b13ed0b1508e6b313e88e59977ed78e)
1#!/bin/sh
2
3cat << _EOF > $2
4#include <sys/types.h>
5#include <sys/time.h>
6#include <stdio.h>
7#include <stdarg.h>
8#include <stdint.h>
9#include <stdlib.h>
10#include <string.h>
11#include <sha2.h>
12
13#include <atf-c.h>
14
15/* Avoid SSP re-definitions */
16#undef snprintf
17#undef vsnprintf
18#undef sprintf
19#undef vsprintf
20#undef vasprintf
21
22#define KPRINTF_BUFSIZE 1024
23#undef putchar
24#define putchar xputchar
25
26#define kmem_alloc(n, f)	malloc(n)
27
28static int putchar(char c, int foo, void *b)
29{
30	return fputc(c, stderr);
31}
32
33#define TOBUFONLY 1
34static const char HEXDIGITS[] = "0123456789ABCDEF";
35static const char hexdigits[] = "0123456789abcdef";
36
37typedef int device_t;
38
39#if 0
40static SHA512_CTX kprnd_sha;
41#endif
42
43#define timespec timeval
44#define nanotime(ts) gettimeofday(ts, NULL)
45
46#define device_xname(a) ""
47int kprintf(const char *, int, void *, char *, va_list) __printflike(1, 0);
48void device_printf(device_t, const char *, ...) __printflike(2, 3);
49
50static void
51empty(void)
52{
53}
54
55static void (*v_flush)(void) = empty;
56
57ATF_TC(snprintf_print);
58ATF_TC_HEAD(snprintf_print, tc)
59{
60	atf_tc_set_md_var(tc, "descr", "checks snprintf print");
61}
62 
63ATF_TC_BODY(snprintf_print, tc)
64{
65	char buf[13];
66	int i;
67
68	memset(buf, 'x', sizeof(buf));
69	i = snprintf(buf, sizeof(buf), "number %d", 10);
70	ATF_CHECK_EQ(i, 9);
71	ATF_CHECK_STREQ(buf, "number 10");
72}
73
74ATF_TC(snprintf_print_overflow);
75ATF_TC_HEAD(snprintf_print_overflow, tc)
76{
77	atf_tc_set_md_var(tc, "descr", "checks snprintf print with overflow");
78}
79 
80ATF_TC_BODY(snprintf_print_overflow, tc)
81{
82	char buf[10];
83	int i;
84
85	memset(buf, 'x', sizeof(buf));
86	i = snprintf(buf, sizeof(buf), "fjsdfsdjfsdf %d\n", 10);
87	ATF_CHECK_EQ(i, 16);
88	ATF_CHECK_STREQ(buf, "fjsdfsdjf");
89}
90
91ATF_TC(snprintf_count);
92ATF_TC_HEAD(snprintf_count, tc)
93{
94	atf_tc_set_md_var(tc, "descr", "checks snprintf count");
95}
96 
97ATF_TC_BODY(snprintf_count, tc)
98{
99	int i;
100	
101	i = snprintf(NULL, 20, "number %d", 10);
102	ATF_CHECK_EQ(i, 9);
103}
104
105ATF_TC(snprintf_count_overflow);
106ATF_TC_HEAD(snprintf_count_overflow, tc)
107{
108	atf_tc_set_md_var(tc, "descr", "checks snprintf count with overflow");
109}
110 
111ATF_TC_BODY(snprintf_count_overflow, tc)
112{
113	int i;
114
115	i = snprintf(NULL, 10, "fjsdfsdjfsdf %d\n", 10);
116	ATF_CHECK_EQ(i, 16);
117}
118
119ATF_TC(vasprintf_print);
120ATF_TC_HEAD(vasprintf_print, tc)
121{
122	atf_tc_set_md_var(tc, "descr", "checks vasprintf works");
123}
124
125static int __printflike(2, 3)
126vasp_helper(char **buf, const char *fmt, ...)
127{
128	va_list ap;
129	int ret;
130
131	va_start(ap, fmt);
132	ret = vasprintf(buf, fmt, ap);
133	va_end(ap);
134	return ret;
135}
136
137ATF_TC_BODY(vasprintf_print, tc)
138{
139	int i;
140	char *buf;
141
142	buf = NULL;
143	i =  vasp_helper(&buf, "N=%d C=%c S=%s", 7, 'x', "abc");
144	ATF_CHECK_EQ(i, 13);
145	ATF_CHECK(buf != NULL);
146	ATF_CHECK_STREQ(buf, "N=7 C=x S=abc");
147	free(buf);
148}
149
150ATF_TP_ADD_TCS(tp)
151{
152	ATF_TP_ADD_TC(tp, snprintf_print);
153	ATF_TP_ADD_TC(tp, snprintf_print_overflow);
154	ATF_TP_ADD_TC(tp, snprintf_count);
155	ATF_TP_ADD_TC(tp, snprintf_count_overflow);
156	ATF_TP_ADD_TC(tp, vasprintf_print);
157
158	return atf_no_error();
159}
160_EOF
161
162awk '
163/^snprintf\(/ {
164	print prevline
165	out = 1
166}
167{
168	if (out) print
169	else prevline = $0
170}' $1 >>$2
171