67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
 | 
						|
/*
 | 
						|
 *  variadic.c
 | 
						|
 *  testObjects
 | 
						|
 *
 | 
						|
 *  Created by Blaine Garst on 2/17/09.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
// PURPOSE Test that variadic arguments compile and work for Blocks
 | 
						|
// CONFIG
 | 
						|
 | 
						|
#include <stdarg.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
int main(int argc, char *argv[]) {
 | 
						|
    
 | 
						|
    long (^addthem)(const char *, ...) = ^long (const char *format, ...){
 | 
						|
        va_list argp;
 | 
						|
        const char *p;
 | 
						|
        int i;
 | 
						|
        char c;
 | 
						|
        double d;
 | 
						|
        long result = 0;
 | 
						|
        va_start(argp, format);
 | 
						|
        //printf("starting...\n");
 | 
						|
        for (p = format; *p; p++) switch (*p) {
 | 
						|
            case 'i':
 | 
						|
                i = va_arg(argp, int);
 | 
						|
                //printf("i: %d\n", i);
 | 
						|
                result += i;
 | 
						|
                break;
 | 
						|
            case 'd':
 | 
						|
                d = va_arg(argp, double);
 | 
						|
                //printf("d: %g\n", d);
 | 
						|
                result += (int)d;
 | 
						|
                break;
 | 
						|
            case 'c':
 | 
						|
                c = va_arg(argp, int);
 | 
						|
                //printf("c: '%c'\n", c);
 | 
						|
                result += c;
 | 
						|
                break;
 | 
						|
        }
 | 
						|
        //printf("...done\n\n");
 | 
						|
        return result;
 | 
						|
    };
 | 
						|
    long testresult = addthem("ii", 10, 20);
 | 
						|
    if (testresult != 30) {
 | 
						|
        printf("got wrong result: %ld\n", testresult);
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
    testresult = addthem("idc", 30, 40.0, 'a');
 | 
						|
    if (testresult != (70+'a')) {
 | 
						|
        printf("got different wrong result: %ld\n", testresult);
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
    printf("%s: Success\n", argv[0]);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 |