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