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