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
test1(char * fmt,...)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 *
run_test(void * arg)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
main(int argc,char * argv[])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