xref: /openbsd-src/regress/lib/libpthread/stdarg/stdarg.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: stdarg.c,v 1.1.1.1 2001/08/15 14:37:16 fgsch Exp $	*/
2 /* David Leonard <d@openbsd.org>, 2001. Public Domain. */
3 
4 /*
5  * Test <stdarg.h>
6  */
7 
8 #include <pthread.h>
9 #include <stdio.h>
10 #include <stdarg.h>
11 #include "test.h"
12 
13 #define EQ(v,exp) _CHECK(v, == exp, NULL)
14 
15 int thing;
16 
17 int
18 test1(char *fmt, ...)
19 {
20 	va_list	ap;
21 
22 	char	ch;
23 	int	i;
24 	char	c;
25 	long	l;
26 	void 	*p;
27 	char 	*ofmt = fmt;
28 
29 	va_start(ap, fmt);
30 	for (; *fmt; fmt++)
31 	    switch ((ch =*fmt)) {
32 	    case 'i':
33 		i = va_arg(ap, int);
34 		EQ(i, 1234);
35 		break;
36 	    case 'c':
37 		c = va_arg(ap, char);
38 		EQ(c, 'x');
39 		break;
40 	    case 'l':
41 		l = va_arg(ap, long);
42 		EQ(l, 123456789L);
43 		break;
44 	    case 'p':
45 		p = va_arg(ap, void *);
46 		EQ(p, &thing);
47 		break;
48 	    default:
49 		fprintf(stderr, "unexpected character 0x%02x `%c' in %s(%p) at %p\n",
50 			ch, ch, ofmt, ofmt, fmt);
51 		ASSERT(0);
52 	    }
53 	va_end(ap);
54 	return 9;
55 }
56 
57 void *
58 run_test(arg)
59 	void *arg;
60 {
61 	char *msg = (char *)arg;
62 	int i;
63 
64 	SET_NAME(msg);
65 
66 	puts(msg);
67 	for (i = 0; i < 1000000; i++) {
68 		ASSERT(test1("iclp", 1234, 'x', 123456789L, &thing) == 9);
69 	}
70 	printf("ok\n");
71 	return NULL;
72 }
73 
74 int
75 main()
76 {
77 	pthread_t t1, t2;
78 
79 	printf("trying loop in single-threaded mode:\n");
80 	run_test("main");
81 	printf("now running loop with 2 threads:\n");
82 	CHECKr(pthread_create(&t1, NULL, run_test, "child 1"));
83 	CHECKr(pthread_create(&t2, NULL, run_test, "child 2"));
84 	CHECKr(pthread_join(t1, NULL));
85 	CHECKr(pthread_join(t2, NULL));
86 	SUCCEED;
87 }
88