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