summaryrefslogtreecommitdiff
path: root/lib/BlocksRuntime/tests/variadic.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/BlocksRuntime/tests/variadic.c')
-rw-r--r--lib/BlocksRuntime/tests/variadic.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/BlocksRuntime/tests/variadic.c b/lib/BlocksRuntime/tests/variadic.c
new file mode 100644
index 000000000..1d80657e9
--- /dev/null
+++ b/lib/BlocksRuntime/tests/variadic.c
@@ -0,0 +1,66 @@
+//
+// 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;
+}
+
+