53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// RUN: %clang_cc1 %s -ffreestanding
 | 
						|
// RUN: %clang_cc1 %s -ffreestanding -triple i686-unknown-linux
 | 
						|
// RUN: %clang_cc1 %s -ffreestanding -triple x86_64-unknown-linux
 | 
						|
// RUN: %clang_cc1 %s -ffreestanding -triple mips-unknown-linux
 | 
						|
// RUN: %clang_cc1 %s -ffreestanding -triple mipsel-unknown-linux
 | 
						|
// RUN: %clang_cc1 %s -ffreestanding -triple armv7-unknown-linux-gnueabi
 | 
						|
// RUN: %clang_cc1 %s -ffreestanding -triple thumbv7-unknown-linux-gnueabi
 | 
						|
 | 
						|
#include "stdarg.h"
 | 
						|
 | 
						|
int int_accumulator = 0;
 | 
						|
double double_accumulator = 0;
 | 
						|
 | 
						|
int test_vprintf(const char *fmt, va_list ap) {
 | 
						|
  char ch;
 | 
						|
  int result = 0;
 | 
						|
  while (*fmt != '\0') {
 | 
						|
    ch = *fmt++;
 | 
						|
    if (ch != '%') {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    ch = *fmt++;
 | 
						|
    switch (ch) {
 | 
						|
    case 'd':
 | 
						|
      int_accumulator += va_arg(ap, int);
 | 
						|
      result++;
 | 
						|
      break;
 | 
						|
 | 
						|
    case 'f':
 | 
						|
      double_accumulator += va_arg(ap, double);
 | 
						|
      result++;
 | 
						|
      break;
 | 
						|
 | 
						|
    default:
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    if (ch == '0') {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
int test_printf(const char *fmt, ...) {
 | 
						|
  va_list ap;
 | 
						|
  va_start(ap, fmt);
 | 
						|
  int result = test_vprintf(fmt, ap);
 | 
						|
  va_end(ap);
 | 
						|
  return result;
 | 
						|
}
 |