xref: /openbsd-src/regress/lib/libpthread/stdarg/stdarg.c (revision ce7e0fc6a9d74d25b78fb6ad846387717f5172b6)
1 /*	$OpenBSD: stdarg.c,v 1.4 2001/12/12 21:18:34 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 <stdlib.h>
12 #include "test.h"
13 
14 #define EQ(v,exp) _CHECK(v, == exp, NULL)
15 
16 int thing;
17 
18 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 void *
60 run_test(arg)
61 	void *arg;
62 {
63 	char *msg = (char *)arg;
64 	int i;
65 
66 	SET_NAME(msg);
67 
68 	puts(msg);
69 	for (i = 0; i < 1000000; i++) {
70 		ASSERT(test1("iclp", 1234, 'x', 123456789L, &thing) == 9);
71 	}
72 	printf("ok\n");
73 	return NULL;
74 }
75 
76 int
77 main()
78 {
79 	pthread_t t1, t2;
80 
81 	printf("trying loop in single-threaded mode:\n");
82 	run_test("main");
83 	printf("now running loop with 2 threads:\n");
84 	CHECKr(pthread_create(&t1, NULL, run_test, "child 1"));
85 	CHECKr(pthread_create(&t2, NULL, run_test, "child 2"));
86 	CHECKr(pthread_join(t1, NULL));
87 	CHECKr(pthread_join(t2, NULL));
88 	SUCCEED;
89 }
90