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