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