1 //
2 //                     The LLVM Compiler Infrastructure
3 //
4 // This file is distributed under the University of Illinois Open Source
5 // License. See LICENSE.TXT for details.
6 
7 /*
8  *  variadic.c
9  *  testObjects
10  *
11  *  Created by Blaine Garst on 2/17/09.
12  *
13  */
14 
15 // PURPOSE Test that variadic arguments compile and work for Blocks
16 // CONFIG
17 
18 #include <stdarg.h>
19 #include <stdio.h>
20 
main(int argc,char * argv[])21 int main(int argc, char *argv[]) {
22 
23     long (^addthem)(const char *, ...) = ^long (const char *format, ...){
24         va_list argp;
25         const char *p;
26         int i;
27         char c;
28         double d;
29         long result = 0;
30         va_start(argp, format);
31         //printf("starting...\n");
32         for (p = format; *p; p++) switch (*p) {
33             case 'i':
34                 i = va_arg(argp, int);
35                 //printf("i: %d\n", i);
36                 result += i;
37                 break;
38             case 'd':
39                 d = va_arg(argp, double);
40                 //printf("d: %g\n", d);
41                 result += (int)d;
42                 break;
43             case 'c':
44                 c = va_arg(argp, int);
45                 //printf("c: '%c'\n", c);
46                 result += c;
47                 break;
48         }
49         //printf("...done\n\n");
50         return result;
51     };
52     long testresult = addthem("ii", 10, 20);
53     if (testresult != 30) {
54         printf("got wrong result: %ld\n", testresult);
55         return 1;
56     }
57     testresult = addthem("idc", 30, 40.0, 'a');
58     if (testresult != (70+'a')) {
59         printf("got different wrong result: %ld\n", testresult);
60         return 1;
61     }
62     printf("%s: Success\n", argv[0]);
63     return 0;
64 }
65 
66 
67