]> git.sur5r.net Git - cc65/blob - test/ref/stdarg.c
added tests as prepared by oliver
[cc65] / test / ref / stdarg.c
1 /*
2   !!DESCRIPTION!! variable argument lists
3   !!ORIGIN!!      LCC 4.1 Testsuite
4   !!LICENCE!!     own, freely distributeable for non-profit. read CPYRIGHT.LCC
5 */
6
7 #include <stdarg.h>
8
9 #ifndef NO_FUNCS_TAKE_STRUCTS
10 struct node
11 {
12         int a[4];
13 } x =
14 {
15 #ifdef NO_SLOPPY_STRUCT_INIT
16         {
17 #endif
18                 1,2,3,4
19 #ifdef NO_SLOPPY_STRUCT_INIT
20         }
21 #endif
22 };
23 #endif
24
25 print(char *fmt, ...);
26
27 main()
28 {
29         print("test 1\n");
30         print("test %s\n", "2");
31         print("test %d%c", 3, '\n');
32         print("%s%s %w%c", "te", "st", 4, '\n');
33     #ifdef NO_FLOATS
34                 print("%s%s %f%c", "te", "st", (signed long) 5, '\n');
35         #else
36                 print("%s%s %f%c", "te", "st", 5.0, '\n');
37     #endif
38         #ifndef NO_FUNCS_TAKE_STRUCTS
39         print("%b %b %b %b %b %b\n", x, x, x, x, x, x);
40         #endif
41         return 0;
42 }
43
44 print(char *fmt, ...) {
45         va_list ap;
46         va_start(ap, fmt);
47         for (; *fmt; fmt++)
48         {
49                 if (*fmt == '%')
50                         switch (*++fmt) {
51             case 'b': {
52                                         #ifdef NO_FUNCS_TAKE_STRUCTS
53                         printf("(1 2 3 4)");
54                                         #else
55                         struct node x =
56                                                         va_arg(
57                                                                 ap,
58                                                                 struct node
59                                                                 );
60                         printf("(%d %d %d %d)", x.a[0], x.a[1], x.a[2], x.a[3]);
61                                         #endif
62                     break;
63                     }
64                         case 'c':
65                                 /* printf("%c", va_arg(ap, char)); */
66                                 printf("%c", va_arg(ap, int));
67                                 break;
68                         case 'd':
69                                 printf("%d", va_arg(ap, int));
70                                 break;
71                         case 'w':
72                                 /* printf("%x", va_arg(ap, short)); */
73                                 printf("%x", va_arg(ap, int));
74                                 break;
75                         case 's':
76                                 printf("%s", va_arg(ap, char *));
77                                 break;
78                         case 'f':
79                 #ifdef NO_FLOATS
80                                         printf("%ld.000000", va_arg(ap, signed long));
81                                 #else
82                                         printf("%f", va_arg(ap, double));
83                 #endif
84                                 break;
85                         default:
86                                 printf("%c", *fmt);
87                                 break;
88                         }
89                  else
90                         printf("%c", *fmt);
91         }
92         va_end(ap);
93 }