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