fmt_decl.c revision 1.18 1 1.18 rillig /* $NetBSD: fmt_decl.c,v 1.18 2021/11/19 19:37:13 rillig Exp $ */
2 1.1 rillig /* $FreeBSD: head/usr.bin/indent/tests/declarations.0 334478 2018-06-01 09:41:15Z pstef $ */
3 1.1 rillig
4 1.1 rillig /* See FreeBSD r303570 */
5 1.1 rillig
6 1.1 rillig #indent input
7 1.1 rillig typedef void (*voidptr) (int *);
8 1.1 rillig #indent end
9 1.1 rillig
10 1.1 rillig #indent run
11 1.1 rillig typedef void (*voidptr)(int *);
12 1.1 rillig #indent end
13 1.1 rillig
14 1.1 rillig
15 1.1 rillig #indent input
16 1.1 rillig static const struct
17 1.1 rillig {
18 1.1 rillig double x;
19 1.1 rillig double y, z;
20 1.1 rillig } n[m + 1] =
21 1.1 rillig {
22 1.1 rillig {
23 1.1 rillig .0,
24 1.1 rillig .9,
25 1.1 rillig 5
26 1.1 rillig }
27 1.1 rillig };
28 1.1 rillig #indent end
29 1.1 rillig
30 1.1 rillig #indent run
31 1.1 rillig static const struct {
32 1.1 rillig double x;
33 1.1 rillig double y, z;
34 1.1 rillig } n[m + 1] =
35 1.1 rillig {
36 1.1 rillig {
37 1.1 rillig .0,
38 1.1 rillig .9,
39 1.1 rillig 5
40 1.1 rillig }
41 1.1 rillig };
42 1.1 rillig #indent end
43 1.1 rillig
44 1.1 rillig
45 1.1 rillig #indent input
46 1.1 rillig typedef struct Complex
47 1.1 rillig {
48 1.1 rillig double x;
49 1.1 rillig double y;
50 1.1 rillig } Complex;
51 1.1 rillig #indent end
52 1.1 rillig
53 1.1 rillig #indent run
54 1.1 rillig typedef struct Complex {
55 1.1 rillig double x;
56 1.1 rillig double y;
57 1.1 rillig } Complex;
58 1.1 rillig #indent end
59 1.1 rillig
60 1.1 rillig
61 1.8 rillig /*
62 1.13 rillig * As of 2021-11-07, indent parses the following function definition as these
63 1.8 rillig * tokens:
64 1.8 rillig *
65 1.13 rillig * line 1: type_outside_parentheses "void"
66 1.8 rillig * line 1: newline "\n"
67 1.8 rillig * line 2: funcname "t1"
68 1.8 rillig * line 2: newline "\n" repeated, see search_stmt
69 1.8 rillig * line 3: funcname "t1" XXX: wrong line_no
70 1.8 rillig * line 3: lparen_or_lbracket "("
71 1.13 rillig * line 3: type_in_parentheses "char"
72 1.8 rillig * line 3: unary_op "*"
73 1.13 rillig * line 3: word "a"
74 1.8 rillig * line 3: comma ","
75 1.13 rillig * line 3: type_in_parentheses "int"
76 1.13 rillig * line 3: word "b"
77 1.8 rillig * line 3: comma ","
78 1.8 rillig * line 3: newline "\n"
79 1.13 rillig * line 4: type_in_parentheses "void"
80 1.8 rillig * line 4: lparen_or_lbracket "("
81 1.8 rillig * line 4: unary_op "*"
82 1.13 rillig * line 4: word "fn"
83 1.8 rillig * line 4: rparen_or_rbracket ")"
84 1.8 rillig * line 4: lparen_or_lbracket "("
85 1.13 rillig * line 4: type_in_parentheses "void"
86 1.8 rillig * line 4: rparen_or_rbracket ")"
87 1.8 rillig * line 4: rparen_or_rbracket ")"
88 1.8 rillig * line 4: newline "\n"
89 1.8 rillig * line 5: lbrace "{"
90 1.8 rillig * line 5: lbrace "{" repeated, see search_stmt
91 1.8 rillig * line 5: newline "\n" FIXME: there is no newline in the source
92 1.8 rillig * line 6: rbrace "}"
93 1.8 rillig * line 6: eof "\n"
94 1.8 rillig */
95 1.1 rillig #indent input
96 1.1 rillig void
97 1.1 rillig t1 (char *a, int b,
98 1.1 rillig void (*fn)(void))
99 1.1 rillig {}
100 1.1 rillig #indent end
101 1.1 rillig
102 1.1 rillig #indent run
103 1.1 rillig void
104 1.1 rillig t1(char *a, int b,
105 1.1 rillig void (*fn)(void))
106 1.1 rillig {
107 1.1 rillig }
108 1.1 rillig #indent end
109 1.1 rillig
110 1.1 rillig
111 1.1 rillig #indent input
112 1.1 rillig void t2 (char *x, int y)
113 1.1 rillig {
114 1.1 rillig int a,
115 1.1 rillig b,
116 1.1 rillig c;
117 1.1 rillig int
118 1.1 rillig *d,
119 1.1 rillig *e,
120 1.1 rillig *f;
121 1.1 rillig int (*g)(),
122 1.1 rillig (*h)(),
123 1.1 rillig (*i)();
124 1.1 rillig int j,
125 1.1 rillig k,
126 1.1 rillig l;
127 1.1 rillig int m
128 1.1 rillig ,n
129 1.1 rillig ,o
130 1.1 rillig ;
131 1.1 rillig int chars[ /* push the comma beyond column 74 .... */ ], x;
132 1.1 rillig }
133 1.1 rillig #indent end
134 1.1 rillig
135 1.1 rillig #indent run
136 1.1 rillig void
137 1.1 rillig t2(char *x, int y)
138 1.1 rillig {
139 1.1 rillig int a, b, c;
140 1.1 rillig int
141 1.1 rillig *d, *e, *f;
142 1.1 rillig int (*g)(), (*h)(), (*i)();
143 1.1 rillig int j, k, l;
144 1.1 rillig int m
145 1.1 rillig ,n
146 1.1 rillig ,o
147 1.1 rillig ;
148 1.1 rillig int chars[ /* push the comma beyond column 74 .... */ ],
149 1.1 rillig x;
150 1.1 rillig }
151 1.1 rillig #indent end
152 1.1 rillig
153 1.1 rillig
154 1.1 rillig #indent input
155 1.1 rillig const int int_minimum_size =
156 1.1 rillig MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF;
157 1.1 rillig #indent end
158 1.1 rillig
159 1.1 rillig #indent run-equals-input
160 1.1 rillig
161 1.1 rillig
162 1.1 rillig #indent input
163 1.1 rillig static
164 1.1 rillig _attribute_printf(1, 2)
165 1.1 rillig void
166 1.1 rillig print_error(const char *fmt,...)
167 1.1 rillig {
168 1.1 rillig }
169 1.1 rillig #indent end
170 1.1 rillig
171 1.1 rillig #indent run
172 1.1 rillig static
173 1.1 rillig _attribute_printf(1, 2)
174 1.1 rillig void
175 1.1 rillig print_error(const char *fmt, ...)
176 1.1 rillig {
177 1.2 rillig }
178 1.2 rillig #indent end
179 1.2 rillig
180 1.2 rillig
181 1.2 rillig #indent input
182 1.2 rillig static _attribute_printf(1, 2)
183 1.2 rillig void
184 1.2 rillig print_error(const char *fmt,...)
185 1.2 rillig {
186 1.2 rillig }
187 1.2 rillig #indent end
188 1.1 rillig
189 1.2 rillig #indent run
190 1.2 rillig static _attribute_printf(1, 2)
191 1.2 rillig void
192 1.2 rillig print_error(const char *fmt, ...)
193 1.2 rillig {
194 1.2 rillig }
195 1.2 rillig #indent end
196 1.2 rillig
197 1.2 rillig
198 1.2 rillig #indent input
199 1.2 rillig static void _attribute_printf(1, 2)
200 1.2 rillig print_error(const char *fmt,...)
201 1.2 rillig {
202 1.2 rillig }
203 1.2 rillig #indent end
204 1.2 rillig
205 1.2 rillig #indent run
206 1.2 rillig static void
207 1.2 rillig _attribute_printf(1, 2)
208 1.2 rillig print_error(const char *fmt, ...)
209 1.2 rillig {
210 1.1 rillig }
211 1.1 rillig #indent end
212 1.1 rillig
213 1.1 rillig
214 1.3 rillig /* See FreeBSD r309380 */
215 1.1 rillig #indent input
216 1.1 rillig static LIST_HEAD(, alq) ald_active;
217 1.1 rillig static int ald_shutingdown = 0;
218 1.1 rillig struct thread *ald_thread;
219 1.1 rillig #indent end
220 1.1 rillig
221 1.1 rillig #indent run
222 1.1 rillig static LIST_HEAD(, alq) ald_active;
223 1.1 rillig static int ald_shutingdown = 0;
224 1.1 rillig struct thread *ald_thread;
225 1.1 rillig #indent end
226 1.1 rillig
227 1.1 rillig
228 1.1 rillig #indent input
229 1.1 rillig static int
230 1.2 rillig old_style_definition(a, b, c)
231 1.2 rillig struct thread *a;
232 1.2 rillig int b;
233 1.2 rillig double ***c;
234 1.1 rillig {
235 1.1 rillig
236 1.1 rillig }
237 1.1 rillig #indent end
238 1.1 rillig
239 1.1 rillig #indent run
240 1.1 rillig static int
241 1.2 rillig old_style_definition(a, b, c)
242 1.2 rillig struct thread *a;
243 1.2 rillig int b;
244 1.2 rillig double ***c;
245 1.1 rillig {
246 1.1 rillig
247 1.1 rillig }
248 1.1 rillig #indent end
249 1.1 rillig
250 1.1 rillig
251 1.1 rillig /*
252 1.1 rillig * Demonstrate how variable declarations are broken into several lines when
253 1.1 rillig * the line length limit is set quite low.
254 1.1 rillig */
255 1.1 rillig #indent input
256 1.7 rillig struct s a,b;
257 1.1 rillig struct s0 a,b;
258 1.1 rillig struct s01 a,b;
259 1.1 rillig struct s012 a,b;
260 1.1 rillig struct s0123 a,b;
261 1.1 rillig struct s01234 a,b;
262 1.1 rillig struct s012345 a,b;
263 1.1 rillig struct s0123456 a,b;
264 1.1 rillig struct s01234567 a,b;
265 1.1 rillig struct s012345678 a,b;
266 1.1 rillig struct s0123456789 a,b;
267 1.1 rillig struct s01234567890 a,b;
268 1.1 rillig struct s012345678901 a,b;
269 1.1 rillig struct s0123456789012 a,b;
270 1.1 rillig struct s01234567890123 a,b;
271 1.1 rillig #indent end
272 1.1 rillig
273 1.1 rillig #indent run -l20 -di0
274 1.7 rillig struct s a, b;
275 1.7 rillig /* $ XXX: See process_comma, varname_len for why this line is broken. */
276 1.1 rillig struct s0 a,
277 1.1 rillig b;
278 1.7 rillig /* $ XXX: The indentation of the second line is wrong. The variable names */
279 1.7 rillig /* $ XXX: 'a' and 'b' should be in the same column; the word 'struct' is */
280 1.7 rillig /* $ XXX: missing in the calculation for the indentation. */
281 1.1 rillig struct s01 a,
282 1.1 rillig b;
283 1.1 rillig struct s012 a,
284 1.1 rillig b;
285 1.1 rillig struct s0123 a,
286 1.1 rillig b;
287 1.1 rillig struct s01234 a,
288 1.1 rillig b;
289 1.1 rillig struct s012345 a,
290 1.1 rillig b;
291 1.1 rillig struct s0123456 a,
292 1.1 rillig b;
293 1.1 rillig struct s01234567 a,
294 1.1 rillig b;
295 1.1 rillig struct s012345678 a,
296 1.1 rillig b;
297 1.1 rillig struct s0123456789 a,
298 1.1 rillig b;
299 1.1 rillig struct s01234567890 a,
300 1.1 rillig b;
301 1.1 rillig struct s012345678901 a,
302 1.1 rillig b;
303 1.1 rillig struct s0123456789012 a,
304 1.1 rillig b;
305 1.1 rillig struct s01234567890123 a,
306 1.1 rillig b;
307 1.1 rillig #indent end
308 1.2 rillig
309 1.2 rillig
310 1.2 rillig #indent input
311 1.2 rillig char * x(void)
312 1.2 rillig {
313 1.2 rillig type identifier;
314 1.2 rillig type *pointer;
315 1.2 rillig unused * value;
316 1.2 rillig (void)unused * value;
317 1.2 rillig
318 1.2 rillig dmax = (double)3 * 10.0;
319 1.2 rillig dmin = (double)dmax * 10.0;
320 1.2 rillig davg = (double)dmax * dmin;
321 1.2 rillig
322 1.2 rillig return NULL;
323 1.2 rillig }
324 1.2 rillig #indent end
325 1.2 rillig
326 1.2 rillig #indent run
327 1.2 rillig char *
328 1.2 rillig x(void)
329 1.2 rillig {
330 1.2 rillig type identifier;
331 1.2 rillig type *pointer;
332 1.2 rillig unused *value;
333 1.2 rillig (void)unused * value;
334 1.2 rillig
335 1.2 rillig dmax = (double)3 * 10.0;
336 1.2 rillig dmin = (double)dmax * 10.0;
337 1.2 rillig davg = (double)dmax * dmin;
338 1.2 rillig
339 1.2 rillig return NULL;
340 1.2 rillig }
341 1.2 rillig #indent end
342 1.2 rillig
343 1.2 rillig #indent input
344 1.2 rillig int *
345 1.2 rillig y(void) {
346 1.2 rillig
347 1.2 rillig }
348 1.2 rillig
349 1.2 rillig int
350 1.2 rillig z(void) {
351 1.2 rillig
352 1.2 rillig }
353 1.2 rillig #indent end
354 1.2 rillig
355 1.2 rillig #indent run
356 1.2 rillig int *
357 1.2 rillig y(void)
358 1.2 rillig {
359 1.2 rillig
360 1.2 rillig }
361 1.2 rillig
362 1.2 rillig int
363 1.2 rillig z(void)
364 1.2 rillig {
365 1.2 rillig
366 1.2 rillig }
367 1.2 rillig #indent end
368 1.2 rillig
369 1.2 rillig
370 1.2 rillig #indent input
371 1.2 rillig int x;
372 1.2 rillig int *y;
373 1.2 rillig int * * * * z;
374 1.2 rillig #indent end
375 1.2 rillig
376 1.2 rillig #indent run
377 1.2 rillig int x;
378 1.2 rillig int *y;
379 1.2 rillig int ****z;
380 1.2 rillig #indent end
381 1.4 rillig
382 1.4 rillig
383 1.4 rillig #indent input
384 1.4 rillig int main(void) {
385 1.4 rillig char (*f1)() = NULL;
386 1.4 rillig char *(*f1)() = NULL;
387 1.4 rillig char *(*f2)();
388 1.4 rillig }
389 1.4 rillig #indent end
390 1.4 rillig
391 1.6 rillig /*
392 1.6 rillig * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
393 1.6 rillig * and third variable declaration in column 1. This bug has been introduced
394 1.6 rillig * to NetBSD when FreeBSD indent was imported in 2019.
395 1.6 rillig */
396 1.4 rillig #indent run -ldi0
397 1.4 rillig int
398 1.4 rillig main(void)
399 1.4 rillig {
400 1.4 rillig char (*f1)() = NULL;
401 1.6 rillig char *(*f1)() = NULL;
402 1.6 rillig char *(*f2)();
403 1.4 rillig }
404 1.4 rillig #indent end
405 1.5 rillig
406 1.5 rillig #indent run
407 1.5 rillig int
408 1.5 rillig main(void)
409 1.5 rillig {
410 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
411 1.5 rillig char (*f1)() = NULL;
412 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
413 1.6 rillig char *(* f1)() = NULL;
414 1.5 rillig /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
415 1.6 rillig char *(* f2)();
416 1.5 rillig }
417 1.5 rillig #indent end
418 1.10 rillig
419 1.10 rillig
420 1.10 rillig /*
421 1.10 rillig * In some ancient time long before ISO C90, variable declarations with
422 1.10 rillig * initializer could be written without '='. The C Programming Language from
423 1.10 rillig * 1978 doesn't mention this form anymore.
424 1.18 rillig *
425 1.18 rillig * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a
426 1.18 rillig * unary operator.
427 1.10 rillig */
428 1.10 rillig #indent input
429 1.10 rillig int a - 1;
430 1.10 rillig {
431 1.10 rillig int a - 1;
432 1.10 rillig }
433 1.10 rillig #indent end
434 1.10 rillig
435 1.10 rillig #indent run -di0
436 1.11 rillig int a - 1;
437 1.10 rillig {
438 1.11 rillig int a - 1;
439 1.10 rillig }
440 1.10 rillig #indent end
441 1.14 rillig
442 1.14 rillig
443 1.14 rillig /*
444 1.18 rillig * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-09, the indentation
445 1.18 rillig * of the '*' depended on the function name, which did not make sense. For
446 1.18 rillig * function names that matched [A-Za-z]+, the '*' was placed correctly, for
447 1.18 rillig * all other function names (containing [$0-9_]) the '*' was right-aligned on
448 1.18 rillig * declaration indentation, which defaults to 16.
449 1.14 rillig */
450 1.14 rillig #indent input
451 1.14 rillig int *
452 1.14 rillig f2(void)
453 1.14 rillig {
454 1.14 rillig }
455 1.14 rillig
456 1.14 rillig int *
457 1.14 rillig yy(void)
458 1.14 rillig {
459 1.14 rillig }
460 1.14 rillig
461 1.14 rillig int *
462 1.18 rillig int_create(void)
463 1.14 rillig {
464 1.14 rillig }
465 1.14 rillig #indent end
466 1.15 rillig
467 1.18 rillig #indent run-equals-input
468 1.18 rillig
469 1.15 rillig
470 1.15 rillig /*
471 1.15 rillig * Since 2019-04-04, the space between the '){' is missing.
472 1.15 rillig */
473 1.15 rillig #indent input
474 1.15 rillig int *
475 1.15 rillig function_name_____20________30________40________50
476 1.15 rillig (void)
477 1.15 rillig {}
478 1.15 rillig #indent end
479 1.15 rillig
480 1.15 rillig /* FIXME: The space between '){' is missing. */
481 1.15 rillig #indent run
482 1.15 rillig int *function_name_____20________30________40________50
483 1.15 rillig (void){
484 1.15 rillig }
485 1.15 rillig #indent end
486 1.15 rillig
487 1.15 rillig
488 1.15 rillig /*
489 1.17 rillig * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function
490 1.17 rillig * names were preserved while others were silently discarded.
491 1.15 rillig */
492 1.15 rillig #indent input
493 1.15 rillig int *
494 1.15 rillig aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
495 1.15 rillig (void)
496 1.15 rillig {}
497 1.15 rillig #indent end
498 1.15 rillig
499 1.15 rillig #indent run
500 1.16 rillig int *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
501 1.16 rillig (void){
502 1.15 rillig }
503 1.15 rillig #indent end
504