Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

stdarg.c (980B)


      1 #include <stdarg.h>
      2 
      3 struct node { int a[4]; } x = {1,2,3,4};
      4 
      5 print(char *fmt, ...);
      6 
      7 main() {
      8 	print("test 1\n");
      9 	print("test %s\n", "2");
     10 	print("test %d%c", 3, '\n');
     11 	print("%s%s %w%c", "te", "st", 4, '\n');
     12 	print("%s%s %f%c", "te", "st", 5.0, '\n');
     13 	print("%b %b %b %b %b %b\n", x, x, x, x, x, x);
     14 	return 0;
     15 }
     16 
     17 print(char *fmt, ...) {
     18 	va_list ap;
     19 
     20 	va_start(ap, fmt);
     21 	for (; *fmt; fmt++)
     22 		if (*fmt == '%')
     23 			switch (*++fmt) {
     24 			case 'b': {
     25 				struct node x = va_arg(ap, struct node);
     26 				printf("{%d %d %d %d}", x.a[0], x.a[1], x.a[2], x.a[3]);
     27 				break;
     28 				}
     29 			case 'c':
     30 				printf("%c", va_arg(ap, char));
     31 				break;
     32 			case 'd':
     33 				printf("%d", va_arg(ap, int));
     34 				break;
     35 			case 'w':
     36 				printf("%x", va_arg(ap, short));
     37 				break;
     38 			case 's':
     39 				printf("%s", va_arg(ap, char *));
     40 				break;
     41 			case 'f':
     42 				printf("%f", va_arg(ap, double));
     43 				break;
     44 			default:
     45 				printf("%c", *fmt);
     46 				break;
     47 			}
     48 		 else
     49 			printf("%c", *fmt);
     50 	va_end(ap);
     51 }