186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// The LLVM Compiler Infrastructure 386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// This file is distributed under the University of Illinois Open Source 586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// License. See LICENSE.TXT for details. 686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst/* 886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst * variadic.c 986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst * testObjects 1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst * 1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst * Created by Blaine Garst on 2/17/09. 1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst * 1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst */ 1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// PURPOSE Test that variadic arguments compile and work for Blocks 1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG 1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdarg.h> 1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdio.h> 2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main(int argc, char *argv[]) { 2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst long (^addthem)(const char *, ...) = ^long (const char *format, ...){ 2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst va_list argp; 2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst const char *p; 2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int i; 2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst char c; 2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst double d; 2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst long result = 0; 3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst va_start(argp, format); 3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("starting...\n"); 3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst for (p = format; *p; p++) switch (*p) { 3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst case 'i': 3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst i = va_arg(argp, int); 3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("i: %d\n", i); 3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst result += i; 3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst break; 3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst case 'd': 3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst d = va_arg(argp, double); 4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("d: %g\n", d); 4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst result += (int)d; 4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst break; 4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst case 'c': 4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst c = va_arg(argp, int); 4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("c: '%c'\n", c); 4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst result += c; 4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst break; 4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("...done\n\n"); 5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return result; 5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst }; 5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst long testresult = addthem("ii", 10, 20); 5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if (testresult != 30) { 5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("got wrong result: %ld\n", testresult); 5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 1; 5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst testresult = addthem("idc", 30, 40.0, 'a'); 5886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if (testresult != (70+'a')) { 5986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("got different wrong result: %ld\n", testresult); 6086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 1; 6186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 6286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: Success\n", argv[0]); 6386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 0; 6486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 6586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 6686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 67