1b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien// RUN: %clang_cc1 %s -ffreestanding 2b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien// RUN: %clang_cc1 %s -ffreestanding -triple i686-unknown-linux 3b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien// RUN: %clang_cc1 %s -ffreestanding -triple x86_64-unknown-linux 4b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien// RUN: %clang_cc1 %s -ffreestanding -triple mips-unknown-linux 5b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien// RUN: %clang_cc1 %s -ffreestanding -triple mipsel-unknown-linux 6b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien// RUN: %clang_cc1 %s -ffreestanding -triple armv7-unknown-linux-gnueabi 7b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien// RUN: %clang_cc1 %s -ffreestanding -triple thumbv7-unknown-linux-gnueabi 8b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 9b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien#include "stdarg.h" 10b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 11b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chienint int_accumulator = 0; 12b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chiendouble double_accumulator = 0; 13b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 14b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chienint test_vprintf(const char *fmt, va_list ap) { 15b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien char ch; 16b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien int result = 0; 17b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien while (*fmt != '\0') { 18b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien ch = *fmt++; 19b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien if (ch != '%') { 20b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien continue; 21b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien } 22b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 23b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien ch = *fmt++; 24b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien switch (ch) { 25b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien case 'd': 26b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien int_accumulator += va_arg(ap, int); 27b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien result++; 28b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien break; 29b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 30b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien case 'f': 31b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien double_accumulator += va_arg(ap, double); 32b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien result++; 33b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien break; 34b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 35b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien default: 36b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien break; 37b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien } 38b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 39b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien if (ch == '0') { 40b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien break; 41b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien } 42b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien } 43b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien return result; 44b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien} 45b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien 46b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chienint test_printf(const char *fmt, ...) { 47b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien va_list ap; 48b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien va_start(ap, fmt); 49b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien int result = test_vprintf(fmt, ap); 50b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien va_end(ap); 51b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien return result; 52b687f3ba4cdc3fd6e4fa9a89addc1efa61761eebLogan Chien} 53