1/* The purpose of this test is to catch edge cases when arguments are passed
2   in regs and on the stack.  We test 16 cases, trying to catch multiple
3   targets (some use 3 regs for argument passing, some use 12, etc.).
4   We test both the arguments and the `lastarg' (the argument to va_start).  */
5
6#include <stdarg.h>
7
8extern __SIZE_TYPE__ strlen ();
9
10int
11to_hex (unsigned int a)
12{
13  static char hex[] = "0123456789abcdef";
14
15  if (a > 15)
16    abort ();
17  return hex[a];
18}
19
20void
21f0 (char* format, ...)
22{
23  va_list ap;
24
25  va_start (ap, format);
26  if (strlen (format) != 16 - 0)
27    abort ();
28  while (*format)
29    if (*format++ != to_hex (va_arg (ap, int)))
30      abort ();
31  va_end(ap);
32}
33
34void
35f1 (int a1, char* format, ...)
36{
37  va_list ap;
38
39  va_start(ap, format);
40  if (strlen (format) != 16 - 1)
41    abort ();
42  while (*format)
43    if (*format++ != to_hex (va_arg (ap, int)))
44      abort ();
45  va_end(ap);
46}
47
48void
49f2 (int a1, int a2, char* format, ...)
50{
51  va_list ap;
52
53  va_start(ap, format);
54  if (strlen (format) != 16 - 2)
55    abort ();
56  while (*format)
57    if (*format++ != to_hex (va_arg (ap, int)))
58      abort ();
59  va_end(ap);
60}
61
62void
63f3 (int a1, int a2, int a3, char* format, ...)
64{
65  va_list ap;
66
67  va_start(ap, format);
68  if (strlen (format) != 16 - 3)
69    abort ();
70  while (*format)
71    if (*format++ != to_hex (va_arg (ap, int)))
72      abort ();
73  va_end(ap);
74}
75
76void
77f4 (int a1, int a2, int a3, int a4, char* format, ...)
78{
79  va_list ap;
80
81  va_start(ap, format);
82  if (strlen (format) != 16 - 4)
83    abort ();
84  while (*format)
85    if (*format++ != to_hex (va_arg (ap, int)))
86      abort ();
87  va_end(ap);
88}
89
90void
91f5 (int a1, int a2, int a3, int a4, int a5,
92    char* format, ...)
93{
94  va_list ap;
95
96  va_start(ap, format);
97  if (strlen (format) != 16 - 5)
98    abort ();
99  while (*format)
100    if (*format++ != to_hex (va_arg (ap, int)))
101      abort ();
102  va_end(ap);
103}
104
105void
106f6 (int a1, int a2, int a3, int a4, int a5,
107    int a6,
108    char* format, ...)
109{
110  va_list ap;
111
112  va_start(ap, format);
113  if (strlen (format) != 16 - 6)
114    abort ();
115  while (*format)
116    if (*format++ != to_hex (va_arg (ap, int)))
117      abort ();
118  va_end(ap);
119}
120
121void
122f7 (int a1, int a2, int a3, int a4, int a5,
123    int a6, int a7,
124    char* format, ...)
125{
126  va_list ap;
127
128  va_start(ap, format);
129  if (strlen (format) != 16 - 7)
130    abort ();
131  while (*format)
132    if (*format++ != to_hex (va_arg (ap, int)))
133      abort ();
134  va_end(ap);
135}
136
137void
138f8 (int a1, int a2, int a3, int a4, int a5,
139    int a6, int a7, int a8,
140    char* format, ...)
141{
142  va_list ap;
143
144  va_start(ap, format);
145  if (strlen (format) != 16 - 8)
146    abort ();
147  while (*format)
148    if (*format++ != to_hex (va_arg (ap, int)))
149      abort ();
150  va_end(ap);
151}
152
153void
154f9 (int a1, int a2, int a3, int a4, int a5,
155     int a6, int a7, int a8, int a9,
156     char* format, ...)
157{
158  va_list ap;
159
160  va_start(ap, format);
161  if (strlen (format) != 16 - 9)
162    abort ();
163  while (*format)
164    if (*format++ != to_hex (va_arg (ap, int)))
165      abort ();
166  va_end(ap);
167}
168
169void
170f10 (int a1, int a2, int a3, int a4, int a5,
171     int a6, int a7, int a8, int a9, int a10,
172     char* format, ...)
173{
174  va_list ap;
175
176  va_start(ap, format);
177  if (strlen (format) != 16 - 10)
178    abort ();
179  while (*format)
180    if (*format++ != to_hex (va_arg (ap, int)))
181      abort ();
182  va_end(ap);
183}
184
185void
186f11 (int a1, int a2, int a3, int a4, int a5,
187     int a6, int a7, int a8, int a9, int a10,
188     int a11,
189     char* format, ...)
190{
191  va_list ap;
192
193  va_start(ap, format);
194  if (strlen (format) != 16 - 11)
195    abort ();
196  while (*format)
197    if (*format++ != to_hex (va_arg (ap, int)))
198      abort ();
199  va_end(ap);
200}
201
202void
203f12 (int a1, int a2, int a3, int a4, int a5,
204     int a6, int a7, int a8, int a9, int a10,
205     int a11, int a12,
206     char* format, ...)
207{
208  va_list ap;
209
210  va_start(ap, format);
211  if (strlen (format) != 16 - 12)
212    abort ();
213  while (*format)
214    if (*format++ != to_hex (va_arg (ap, int)))
215      abort ();
216  va_end(ap);
217}
218
219void
220f13 (int a1, int a2, int a3, int a4, int a5,
221     int a6, int a7, int a8, int a9, int a10,
222     int a11, int a12, int a13,
223     char* format, ...)
224{
225  va_list ap;
226
227  va_start(ap, format);
228  if (strlen (format) != 16 - 13)
229    abort ();
230  while (*format)
231    if (*format++ != to_hex (va_arg (ap, int)))
232      abort ();
233  va_end(ap);
234}
235
236void
237f14 (int a1, int a2, int a3, int a4, int a5,
238     int a6, int a7, int a8, int a9, int a10,
239     int a11, int a12, int a13, int a14,
240     char* format, ...)
241{
242  va_list ap;
243
244  va_start(ap, format);
245  if (strlen (format) != 16 - 14)
246    abort ();
247  while (*format)
248    if (*format++ != to_hex (va_arg (ap, int)))
249      abort ();
250  va_end(ap);
251}
252
253void
254f15 (int a1, int a2, int a3, int a4, int a5,
255     int a6, int a7, int a8, int a9, int a10,
256     int a11, int a12, int a13, int a14, int a15,
257     char* format, ...)
258{
259  va_list ap;
260
261  va_start(ap, format);
262  if (strlen (format) != 16 - 15)
263    abort ();
264  while (*format)
265    if (*format++ != to_hex (va_arg (ap, int)))
266      abort ();
267  va_end(ap);
268}
269
270main ()
271{
272  char *f = "0123456789abcdef";
273
274  f0 (f+0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
275  f1 (0, f+1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
276  f2 (0, 1, f+2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
277  f3 (0, 1, 2, f+3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
278  f4 (0, 1, 2, 3, f+4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
279  f5 (0, 1, 2, 3, 4, f+5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
280  f6 (0, 1, 2, 3, 4, 5, f+6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
281  f7 (0, 1, 2, 3, 4, 5, 6, f+7, 7, 8, 9, 10, 11, 12, 13, 14, 15);
282  f8 (0, 1, 2, 3, 4, 5, 6, 7, f+8, 8, 9, 10, 11, 12, 13, 14, 15);
283  f9 (0, 1, 2, 3, 4, 5, 6, 7, 8, f+9, 9, 10, 11, 12, 13, 14, 15);
284  f10 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, f+10, 10, 11, 12, 13, 14, 15);
285  f11 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, f+11, 11, 12, 13, 14, 15);
286  f12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, f+12, 12, 13, 14, 15);
287  f13 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, f+13, 13, 14, 15);
288  f14 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, f+14, 14, 15);
289  f15 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, f+15, 15);
290
291  exit (0);
292}
293