fmt_decl.c revision 1.60 1 1.60 rillig /* $NetBSD: fmt_decl.c,v 1.60 2023/06/25 19:19:42 rillig Exp $ */
2 1.1 rillig
3 1.19 rillig /*
4 1.19 rillig * Tests for declarations of global variables, external functions, and local
5 1.19 rillig * variables.
6 1.19 rillig *
7 1.19 rillig * See also:
8 1.19 rillig * opt_di.c
9 1.19 rillig */
10 1.19 rillig
11 1.1 rillig /* See FreeBSD r303570 */
12 1.1 rillig
13 1.19 rillig /*
14 1.19 rillig * A type definition usually declares a single type, so there is no need to
15 1.19 rillig * align the newly declared type name with the other variables.
16 1.19 rillig */
17 1.35 rillig //indent input
18 1.30 rillig typedef void ( * function_ptr ) ( int * ) ;
19 1.35 rillig //indent end
20 1.1 rillig
21 1.35 rillig //indent run
22 1.30 rillig typedef void (*function_ptr)(int *);
23 1.35 rillig //indent end
24 1.1 rillig
25 1.1 rillig
26 1.19 rillig /*
27 1.19 rillig * In variable declarations, the names of the first declarators are indented
28 1.19 rillig * by the amount given in '-di', which defaults to 16.
29 1.19 rillig */
30 1.35 rillig //indent input
31 1.19 rillig extern void ( * function_pointer ) ( int * ) ;
32 1.19 rillig extern void * pointer;
33 1.35 rillig //indent end
34 1.19 rillig
35 1.35 rillig //indent run
36 1.19 rillig /* $ XXX: Why is the token 'function_pointer' not aligned with 'pointer'? */
37 1.19 rillig extern void (*function_pointer)(int *);
38 1.19 rillig extern void *pointer;
39 1.35 rillig //indent end
40 1.19 rillig
41 1.19 rillig
42 1.35 rillig //indent input
43 1.1 rillig static const struct
44 1.1 rillig {
45 1.1 rillig double x;
46 1.1 rillig double y, z;
47 1.1 rillig } n[m + 1] =
48 1.1 rillig {
49 1.1 rillig {
50 1.1 rillig .0,
51 1.1 rillig .9,
52 1.1 rillig 5
53 1.1 rillig }
54 1.1 rillig };
55 1.35 rillig //indent end
56 1.1 rillig
57 1.35 rillig //indent run
58 1.37 rillig static const struct
59 1.37 rillig {
60 1.1 rillig double x;
61 1.1 rillig double y, z;
62 1.1 rillig } n[m + 1] =
63 1.1 rillig {
64 1.1 rillig {
65 1.1 rillig .0,
66 1.1 rillig .9,
67 1.1 rillig 5
68 1.1 rillig }
69 1.1 rillig };
70 1.35 rillig //indent end
71 1.1 rillig
72 1.1 rillig
73 1.35 rillig //indent input
74 1.1 rillig typedef struct Complex
75 1.1 rillig {
76 1.1 rillig double x;
77 1.1 rillig double y;
78 1.1 rillig } Complex;
79 1.35 rillig //indent end
80 1.1 rillig
81 1.35 rillig //indent run
82 1.37 rillig typedef struct Complex
83 1.37 rillig {
84 1.1 rillig double x;
85 1.1 rillig double y;
86 1.58 rillig } Complex;
87 1.35 rillig //indent end
88 1.1 rillig
89 1.1 rillig
90 1.8 rillig /*
91 1.38 rillig * Ensure that function definitions are reasonably indented. Before
92 1.38 rillig * 2023-05-11, tokens were repeatedly read, and the line numbers were wrong.
93 1.8 rillig */
94 1.35 rillig //indent input
95 1.1 rillig void
96 1.1 rillig t1 (char *a, int b,
97 1.1 rillig void (*fn)(void))
98 1.1 rillig {}
99 1.35 rillig //indent end
100 1.1 rillig
101 1.35 rillig //indent run
102 1.1 rillig void
103 1.1 rillig t1(char *a, int b,
104 1.1 rillig void (*fn)(void))
105 1.1 rillig {
106 1.1 rillig }
107 1.35 rillig //indent end
108 1.1 rillig
109 1.1 rillig
110 1.19 rillig /* See opt_bc.c. */
111 1.35 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.43 rillig int chars[ /* push the comma beyond column 74 ...... */ ], x;
132 1.1 rillig }
133 1.35 rillig //indent end
134 1.1 rillig
135 1.35 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.43 rillig int chars[/* push the comma beyond column 74 ...... */],
149 1.1 rillig x;
150 1.1 rillig }
151 1.35 rillig //indent end
152 1.1 rillig
153 1.1 rillig
154 1.35 rillig //indent input
155 1.1 rillig const int int_minimum_size =
156 1.51 rillig // $ FIXME: Missing indentation.
157 1.1 rillig MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF;
158 1.35 rillig //indent end
159 1.1 rillig
160 1.35 rillig //indent run-equals-input
161 1.1 rillig
162 1.1 rillig
163 1.25 rillig /*
164 1.25 rillig * Ensure that the usual GCC-style function attributes are formatted in a
165 1.25 rillig * sensible way.
166 1.25 rillig */
167 1.35 rillig //indent input
168 1.39 rillig void single_param(int) __attribute__((__noreturn__)) ;
169 1.39 rillig void function(const char *, ...) __attribute__((format(printf, 1, 2))) ;
170 1.35 rillig //indent end
171 1.25 rillig
172 1.35 rillig //indent run -di0
173 1.39 rillig void single_param(int) __attribute__((__noreturn__));
174 1.39 rillig void function(const char *, ...) __attribute__((format(printf, 1, 2)));
175 1.35 rillig //indent end
176 1.25 rillig
177 1.35 rillig //indent run
178 1.39 rillig void single_param(int) __attribute__((__noreturn__));
179 1.39 rillig void function(const char *, ...) __attribute__((format(printf, 1, 2)));
180 1.35 rillig //indent end
181 1.25 rillig
182 1.25 rillig
183 1.35 rillig //indent input
184 1.1 rillig static
185 1.1 rillig _attribute_printf(1, 2)
186 1.1 rillig void
187 1.1 rillig print_error(const char *fmt,...)
188 1.1 rillig {
189 1.1 rillig }
190 1.35 rillig //indent end
191 1.1 rillig
192 1.35 rillig //indent run
193 1.1 rillig static
194 1.1 rillig _attribute_printf(1, 2)
195 1.1 rillig void
196 1.1 rillig print_error(const char *fmt, ...)
197 1.1 rillig {
198 1.2 rillig }
199 1.35 rillig //indent end
200 1.2 rillig
201 1.2 rillig
202 1.35 rillig //indent input
203 1.2 rillig static _attribute_printf(1, 2)
204 1.2 rillig void
205 1.2 rillig print_error(const char *fmt,...)
206 1.2 rillig {
207 1.2 rillig }
208 1.35 rillig //indent end
209 1.1 rillig
210 1.35 rillig //indent run
211 1.2 rillig static _attribute_printf(1, 2)
212 1.2 rillig void
213 1.2 rillig print_error(const char *fmt, ...)
214 1.2 rillig {
215 1.2 rillig }
216 1.35 rillig //indent end
217 1.2 rillig
218 1.2 rillig
219 1.35 rillig //indent input
220 1.2 rillig static void _attribute_printf(1, 2)
221 1.2 rillig print_error(const char *fmt,...)
222 1.2 rillig {
223 1.2 rillig }
224 1.35 rillig //indent end
225 1.2 rillig
226 1.35 rillig //indent run
227 1.2 rillig static void
228 1.2 rillig _attribute_printf(1, 2)
229 1.2 rillig print_error(const char *fmt, ...)
230 1.2 rillig {
231 1.1 rillig }
232 1.35 rillig //indent end
233 1.1 rillig
234 1.1 rillig
235 1.3 rillig /* See FreeBSD r309380 */
236 1.35 rillig //indent input
237 1.1 rillig static LIST_HEAD(, alq) ald_active;
238 1.19 rillig static int ald_shutting_down = 0;
239 1.1 rillig struct thread *ald_thread;
240 1.35 rillig //indent end
241 1.1 rillig
242 1.35 rillig //indent run
243 1.1 rillig static LIST_HEAD(, alq) ald_active;
244 1.19 rillig static int ald_shutting_down = 0;
245 1.1 rillig struct thread *ald_thread;
246 1.35 rillig //indent end
247 1.1 rillig
248 1.1 rillig
249 1.35 rillig //indent input
250 1.1 rillig static int
251 1.2 rillig old_style_definition(a, b, c)
252 1.2 rillig struct thread *a;
253 1.2 rillig int b;
254 1.2 rillig double ***c;
255 1.1 rillig {
256 1.1 rillig
257 1.1 rillig }
258 1.35 rillig //indent end
259 1.1 rillig
260 1.35 rillig //indent run
261 1.1 rillig static int
262 1.2 rillig old_style_definition(a, b, c)
263 1.2 rillig struct thread *a;
264 1.2 rillig int b;
265 1.2 rillig double ***c;
266 1.1 rillig {
267 1.1 rillig
268 1.1 rillig }
269 1.35 rillig //indent end
270 1.1 rillig
271 1.1 rillig
272 1.1 rillig /*
273 1.1 rillig * Demonstrate how variable declarations are broken into several lines when
274 1.1 rillig * the line length limit is set quite low.
275 1.1 rillig */
276 1.35 rillig //indent input
277 1.7 rillig struct s a,b;
278 1.1 rillig struct s0 a,b;
279 1.1 rillig struct s01 a,b;
280 1.1 rillig struct s012 a,b;
281 1.1 rillig struct s0123 a,b;
282 1.1 rillig struct s01234 a,b;
283 1.1 rillig struct s012345 a,b;
284 1.1 rillig struct s0123456 a,b;
285 1.1 rillig struct s01234567 a,b;
286 1.1 rillig struct s012345678 a,b;
287 1.1 rillig struct s0123456789 a,b;
288 1.1 rillig struct s01234567890 a,b;
289 1.1 rillig struct s012345678901 a,b;
290 1.1 rillig struct s0123456789012 a,b;
291 1.1 rillig struct s01234567890123 a,b;
292 1.35 rillig //indent end
293 1.1 rillig
294 1.35 rillig //indent run -l20 -di0
295 1.7 rillig struct s a, b;
296 1.7 rillig /* $ XXX: See process_comma, varname_len for why this line is broken. */
297 1.1 rillig struct s0 a,
298 1.56 rillig b;
299 1.1 rillig struct s01 a,
300 1.56 rillig b;
301 1.1 rillig struct s012 a,
302 1.56 rillig b;
303 1.1 rillig struct s0123 a,
304 1.56 rillig b;
305 1.1 rillig struct s01234 a,
306 1.56 rillig b;
307 1.1 rillig struct s012345 a,
308 1.56 rillig b;
309 1.1 rillig struct s0123456 a,
310 1.56 rillig b;
311 1.1 rillig struct s01234567 a,
312 1.56 rillig b;
313 1.1 rillig struct s012345678 a,
314 1.56 rillig b;
315 1.1 rillig struct s0123456789 a,
316 1.56 rillig b;
317 1.1 rillig struct s01234567890 a,
318 1.56 rillig b;
319 1.1 rillig struct s012345678901 a,
320 1.56 rillig b;
321 1.1 rillig struct s0123456789012 a,
322 1.56 rillig b;
323 1.1 rillig struct s01234567890123 a,
324 1.56 rillig b;
325 1.35 rillig //indent end
326 1.2 rillig
327 1.2 rillig
328 1.35 rillig //indent input
329 1.2 rillig char * x(void)
330 1.2 rillig {
331 1.2 rillig type identifier;
332 1.2 rillig type *pointer;
333 1.2 rillig unused * value;
334 1.2 rillig (void)unused * value;
335 1.2 rillig
336 1.2 rillig dmax = (double)3 * 10.0;
337 1.2 rillig dmin = (double)dmax * 10.0;
338 1.2 rillig davg = (double)dmax * dmin;
339 1.2 rillig
340 1.2 rillig return NULL;
341 1.2 rillig }
342 1.35 rillig //indent end
343 1.2 rillig
344 1.35 rillig //indent run
345 1.2 rillig char *
346 1.2 rillig x(void)
347 1.2 rillig {
348 1.2 rillig type identifier;
349 1.2 rillig type *pointer;
350 1.2 rillig unused *value;
351 1.2 rillig (void)unused * value;
352 1.2 rillig
353 1.2 rillig dmax = (double)3 * 10.0;
354 1.2 rillig dmin = (double)dmax * 10.0;
355 1.2 rillig davg = (double)dmax * dmin;
356 1.2 rillig
357 1.2 rillig return NULL;
358 1.2 rillig }
359 1.35 rillig //indent end
360 1.2 rillig
361 1.21 rillig
362 1.35 rillig //indent input
363 1.2 rillig int *
364 1.2 rillig y(void) {
365 1.2 rillig
366 1.2 rillig }
367 1.2 rillig
368 1.2 rillig int
369 1.2 rillig z(void) {
370 1.2 rillig
371 1.2 rillig }
372 1.35 rillig //indent end
373 1.2 rillig
374 1.35 rillig //indent run
375 1.2 rillig int *
376 1.2 rillig y(void)
377 1.2 rillig {
378 1.2 rillig
379 1.2 rillig }
380 1.2 rillig
381 1.2 rillig int
382 1.2 rillig z(void)
383 1.2 rillig {
384 1.2 rillig
385 1.2 rillig }
386 1.35 rillig //indent end
387 1.2 rillig
388 1.2 rillig
389 1.35 rillig //indent input
390 1.2 rillig int x;
391 1.2 rillig int *y;
392 1.2 rillig int * * * * z;
393 1.35 rillig //indent end
394 1.2 rillig
395 1.35 rillig //indent run
396 1.2 rillig int x;
397 1.2 rillig int *y;
398 1.2 rillig int ****z;
399 1.35 rillig //indent end
400 1.4 rillig
401 1.4 rillig
402 1.35 rillig //indent input
403 1.4 rillig int main(void) {
404 1.4 rillig char (*f1)() = NULL;
405 1.4 rillig char *(*f1)() = NULL;
406 1.4 rillig char *(*f2)();
407 1.4 rillig }
408 1.35 rillig //indent end
409 1.4 rillig
410 1.6 rillig /*
411 1.6 rillig * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
412 1.6 rillig * and third variable declaration in column 1. This bug has been introduced
413 1.6 rillig * to NetBSD when FreeBSD indent was imported in 2019.
414 1.6 rillig */
415 1.35 rillig //indent run -ldi0
416 1.4 rillig int
417 1.4 rillig main(void)
418 1.4 rillig {
419 1.4 rillig char (*f1)() = NULL;
420 1.6 rillig char *(*f1)() = NULL;
421 1.6 rillig char *(*f2)();
422 1.4 rillig }
423 1.35 rillig //indent end
424 1.5 rillig
425 1.35 rillig //indent run
426 1.5 rillig int
427 1.5 rillig main(void)
428 1.5 rillig {
429 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
430 1.5 rillig char (*f1)() = NULL;
431 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
432 1.6 rillig char *(* f1)() = NULL;
433 1.5 rillig /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
434 1.6 rillig char *(* f2)();
435 1.5 rillig }
436 1.35 rillig //indent end
437 1.10 rillig
438 1.10 rillig
439 1.10 rillig /*
440 1.10 rillig * In some ancient time long before ISO C90, variable declarations with
441 1.10 rillig * initializer could be written without '='. The C Programming Language from
442 1.10 rillig * 1978 doesn't mention this form anymore.
443 1.18 rillig *
444 1.18 rillig * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a
445 1.18 rillig * unary operator.
446 1.10 rillig */
447 1.35 rillig //indent input
448 1.10 rillig int a - 1;
449 1.10 rillig {
450 1.10 rillig int a - 1;
451 1.10 rillig }
452 1.35 rillig //indent end
453 1.10 rillig
454 1.35 rillig //indent run -di0
455 1.11 rillig int a - 1;
456 1.10 rillig {
457 1.11 rillig int a - 1;
458 1.10 rillig }
459 1.35 rillig //indent end
460 1.14 rillig
461 1.14 rillig
462 1.14 rillig /*
463 1.20 rillig * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-19, the indentation
464 1.18 rillig * of the '*' depended on the function name, which did not make sense. For
465 1.18 rillig * function names that matched [A-Za-z]+, the '*' was placed correctly, for
466 1.18 rillig * all other function names (containing [$0-9_]) the '*' was right-aligned on
467 1.20 rillig * the declaration indentation, which defaults to 16.
468 1.14 rillig */
469 1.35 rillig //indent input
470 1.14 rillig int *
471 1.14 rillig f2(void)
472 1.14 rillig {
473 1.14 rillig }
474 1.14 rillig
475 1.14 rillig int *
476 1.14 rillig yy(void)
477 1.14 rillig {
478 1.14 rillig }
479 1.14 rillig
480 1.14 rillig int *
481 1.18 rillig int_create(void)
482 1.14 rillig {
483 1.14 rillig }
484 1.35 rillig //indent end
485 1.15 rillig
486 1.35 rillig //indent run-equals-input
487 1.18 rillig
488 1.15 rillig
489 1.15 rillig /*
490 1.15 rillig * Since 2019-04-04, the space between the '){' is missing.
491 1.15 rillig */
492 1.35 rillig //indent input
493 1.15 rillig int *
494 1.15 rillig function_name_____20________30________40________50
495 1.15 rillig (void)
496 1.15 rillig {}
497 1.35 rillig //indent end
498 1.15 rillig
499 1.38 rillig /*
500 1.38 rillig * Before 2023-05-11, indent moved the '{' right after the '(void)', without
501 1.38 rillig * any space in between.
502 1.38 rillig */
503 1.35 rillig //indent run
504 1.15 rillig int *function_name_____20________30________40________50
505 1.37 rillig (void)
506 1.37 rillig {
507 1.15 rillig }
508 1.35 rillig //indent end
509 1.15 rillig
510 1.15 rillig
511 1.15 rillig /*
512 1.17 rillig * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function
513 1.17 rillig * names were preserved while others were silently discarded.
514 1.15 rillig */
515 1.35 rillig //indent input
516 1.15 rillig int *
517 1.15 rillig aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
518 1.15 rillig (void)
519 1.15 rillig {}
520 1.35 rillig //indent end
521 1.15 rillig
522 1.38 rillig /*
523 1.38 rillig * Before 2023-05-11, indent moved the '{' right after the '(void)', without
524 1.38 rillig * any space in between.
525 1.38 rillig */
526 1.35 rillig //indent run
527 1.16 rillig int *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
528 1.37 rillig (void)
529 1.37 rillig {
530 1.15 rillig }
531 1.35 rillig //indent end
532 1.22 rillig
533 1.22 rillig
534 1.22 rillig /*
535 1.22 rillig * Before 1990, when C90 standardized function prototypes, a function
536 1.22 rillig * declaration or definition did not contain a '*' that may have looked
537 1.22 rillig * similar to the binary operator '*' because it was surrounded by two
538 1.22 rillig * identifiers.
539 1.22 rillig *
540 1.26 rillig * As of 2021-11-21, indent interpreted the '*' in the function declaration in
541 1.26 rillig * line 1 as a binary operator, even though the '*' was followed by a ','
542 1.26 rillig * directly. This was not visible in the output though since indent never
543 1.26 rillig * outputs a space before a comma.
544 1.22 rillig *
545 1.26 rillig * In the function declaration in line 2 and the function definition in line
546 1.26 rillig * 5, indent interpreted the '*' as a binary operator as well and accordingly
547 1.26 rillig * placed spaces around the '*'. On a very low syntactical analysis level,
548 1.26 rillig * this may have made sense since the '*' was surrounded by words, but still
549 1.26 rillig * the '*' is part of a declaration, where a binary operator does not make
550 1.26 rillig * sense.
551 1.26 rillig *
552 1.26 rillig * Essentially, as of 2021, indent had missed the last 31 years of advances in
553 1.26 rillig * the C programming language, in particular the invention of function
554 1.26 rillig * prototypes. Instead, the workaround had been to require all type names to
555 1.26 rillig * be specified via the options '-ta' and '-T'. This put the burden on the
556 1.26 rillig * user instead of the implementer.
557 1.26 rillig *
558 1.26 rillig * Fixed in lexi.c 1.156 from 2021-11-25.
559 1.22 rillig */
560 1.35 rillig //indent input
561 1.22 rillig void buffer_add(buffer *, char);
562 1.22 rillig void buffer_add(buffer *buf, char ch);
563 1.22 rillig
564 1.22 rillig void
565 1.22 rillig buffer_add(buffer *buf, char ch)
566 1.22 rillig {
567 1.22 rillig *buf->e++ = ch;
568 1.22 rillig }
569 1.35 rillig //indent end
570 1.22 rillig
571 1.50 rillig //indent run
572 1.50 rillig void buffer_add(buffer *, char);
573 1.50 rillig // $ FIXME: There should be no space after the '*'.
574 1.50 rillig void buffer_add(buffer * buf, char ch);
575 1.50 rillig
576 1.50 rillig void
577 1.50 rillig buffer_add(buffer *buf, char ch)
578 1.50 rillig {
579 1.50 rillig *buf->e++ = ch;
580 1.50 rillig }
581 1.50 rillig //indent end
582 1.23 rillig
583 1.23 rillig
584 1.23 rillig /*
585 1.38 rillig * Before lexi.c 1.153 from 2021-11-25, indent did not recognize 'Token' as a
586 1.38 rillig * type name and then messed up the positioning of the '{'.
587 1.23 rillig */
588 1.35 rillig //indent input
589 1.23 rillig static Token
590 1.23 rillig ToToken(bool cond)
591 1.23 rillig {
592 1.23 rillig }
593 1.35 rillig //indent end
594 1.23 rillig
595 1.35 rillig //indent run-equals-input -TToken
596 1.34 rillig
597 1.24 rillig /* Since lexi.c 1.153 from 2021-11-25. */
598 1.35 rillig //indent run-equals-input
599 1.23 rillig
600 1.23 rillig
601 1.23 rillig /*
602 1.46 rillig * Before indent.c 1.309 from 2023-05-23, indent easily got confused by unknown
603 1.46 rillig * type names in struct declarations, as a ';' did not finish a declaration.
604 1.23 rillig */
605 1.35 rillig //indent input
606 1.23 rillig typedef struct OpenDirs {
607 1.23 rillig CachedDirList list;
608 1.23 rillig HashTable /* of CachedDirListNode */ table;
609 1.58 rillig } OpenDirs;
610 1.35 rillig //indent end
611 1.23 rillig
612 1.46 rillig //indent run-equals-input -THashTable
613 1.23 rillig
614 1.46 rillig //indent run-equals-input
615 1.23 rillig
616 1.23 rillig
617 1.23 rillig /*
618 1.46 rillig * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
619 1.46 rillig * type names, even in declarations that are syntactically unambiguous.
620 1.23 rillig */
621 1.35 rillig //indent input
622 1.23 rillig static CachedDir *dot = NULL;
623 1.35 rillig //indent end
624 1.23 rillig
625 1.35 rillig //indent run-equals-input -TCachedDir
626 1.34 rillig
627 1.35 rillig //indent run-equals-input
628 1.23 rillig
629 1.23 rillig
630 1.23 rillig /*
631 1.46 rillig * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
632 1.46 rillig * type names in declarations.
633 1.23 rillig */
634 1.35 rillig //indent input
635 1.23 rillig static CachedDir *
636 1.23 rillig CachedDir_New(const char *name)
637 1.23 rillig {
638 1.23 rillig }
639 1.35 rillig //indent end
640 1.23 rillig
641 1.35 rillig //indent run-equals-input
642 1.23 rillig
643 1.23 rillig
644 1.23 rillig /*
645 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
646 1.26 rillig * type names in declarations and generated 'CachedDir * dir' with an extra
647 1.26 rillig * space.
648 1.23 rillig */
649 1.35 rillig //indent input
650 1.23 rillig static CachedDir *
651 1.23 rillig CachedDir_Ref(CachedDir *dir)
652 1.23 rillig {
653 1.23 rillig }
654 1.35 rillig //indent end
655 1.23 rillig
656 1.35 rillig //indent run-equals-input
657 1.23 rillig
658 1.23 rillig
659 1.23 rillig /*
660 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
661 1.26 rillig * type names in declarations and generated 'HashEntry * he' with an extra
662 1.26 rillig * space.
663 1.26 rillig *
664 1.26 rillig * Before lexi.c 1.153 from 2021-11-25, indent also placed the '{' at the end
665 1.26 rillig * of the line.
666 1.23 rillig */
667 1.35 rillig //indent input
668 1.23 rillig static bool
669 1.23 rillig HashEntry_KeyEquals(const HashEntry *he, Substring key)
670 1.23 rillig {
671 1.23 rillig }
672 1.35 rillig //indent end
673 1.23 rillig
674 1.35 rillig //indent run-equals-input
675 1.23 rillig
676 1.23 rillig
677 1.23 rillig /*
678 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent didn't notice that the two '*'
679 1.26 rillig * are in a declaration, instead it interpreted the first '*' as a binary
680 1.26 rillig * operator, therefore generating 'CachedDir * *var' with an extra space.
681 1.23 rillig */
682 1.35 rillig //indent input
683 1.23 rillig static void
684 1.23 rillig CachedDir_Assign(CachedDir **var, CachedDir *dir)
685 1.23 rillig {
686 1.23 rillig }
687 1.35 rillig //indent end
688 1.23 rillig
689 1.46 rillig //indent run-equals-input -TCachedDir
690 1.46 rillig
691 1.35 rillig //indent run-equals-input
692 1.34 rillig
693 1.23 rillig
694 1.23 rillig /*
695 1.24 rillig * Before lexi.c 1.153 from 2021-11-25, all initializer expressions after the
696 1.46 rillig * first one were indented as if they were statement continuations. This was
697 1.46 rillig * caused by the token 'Shell' being identified as a word, not as a type name.
698 1.23 rillig */
699 1.35 rillig //indent input
700 1.24 rillig static Shell shells[] = {
701 1.23 rillig {
702 1.23 rillig first,
703 1.23 rillig second,
704 1.23 rillig },
705 1.23 rillig };
706 1.35 rillig //indent end
707 1.23 rillig
708 1.35 rillig //indent run-equals-input
709 1.23 rillig
710 1.23 rillig
711 1.23 rillig /*
712 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by function
713 1.27 rillig * attribute macros that followed the function declaration. Its primitive
714 1.27 rillig * heuristic between deciding between a function declaration and a function
715 1.27 rillig * definition only looked for ')' immediately followed by ',' or ';'. This was
716 1.27 rillig * sufficient for well-formatted code before 1990. With the addition of
717 1.27 rillig * function prototypes and GCC attributes, the situation became more
718 1.27 rillig * complicated, and it took indent 31 years to adapt to this new reality.
719 1.23 rillig */
720 1.35 rillig //indent input
721 1.23 rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
722 1.23 rillig static void JobRestartJobs(void);
723 1.35 rillig //indent end
724 1.23 rillig
725 1.35 rillig //indent run
726 1.39 rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
727 1.27 rillig static void JobRestartJobs(void);
728 1.35 rillig //indent end
729 1.23 rillig
730 1.23 rillig
731 1.23 rillig /*
732 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by the
733 1.27 rillig * tokens ')' and ';' in the function body. It wrongly regarded them as
734 1.27 rillig * finishing a function declaration.
735 1.23 rillig */
736 1.35 rillig //indent input
737 1.23 rillig MAKE_INLINE const char *
738 1.23 rillig GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); }
739 1.35 rillig //indent end
740 1.23 rillig
741 1.26 rillig /*
742 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent generated 'GNode * gn' with an
743 1.26 rillig * extra space.
744 1.27 rillig *
745 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent wrongly placed the function
746 1.27 rillig * name in line 1, together with the '{'.
747 1.26 rillig */
748 1.35 rillig //indent run
749 1.27 rillig MAKE_INLINE const char *
750 1.27 rillig GNode_VarTarget(GNode *gn)
751 1.27 rillig {
752 1.23 rillig return GNode_ValueDirect(gn, TARGET);
753 1.23 rillig }
754 1.35 rillig //indent end
755 1.23 rillig
756 1.35 rillig //indent run-equals-prev-output -TGNode
757 1.25 rillig
758 1.25 rillig
759 1.25 rillig /*
760 1.25 rillig * Ensure that '*' in declarations is interpreted (or at least formatted) as
761 1.25 rillig * a 'pointer to' type derivation, not as a binary or unary operator.
762 1.25 rillig */
763 1.35 rillig //indent input
764 1.25 rillig number *var = a * b;
765 1.25 rillig
766 1.25 rillig void
767 1.25 rillig function(void)
768 1.25 rillig {
769 1.25 rillig number *var = a * b;
770 1.25 rillig }
771 1.35 rillig //indent end
772 1.25 rillig
773 1.35 rillig //indent run-equals-input -di0
774 1.28 rillig
775 1.28 rillig
776 1.28 rillig /*
777 1.28 rillig * In declarations, most occurrences of '*' are pointer type derivations.
778 1.29 rillig * There are a few exceptions though. Some of these are hard to detect
779 1.29 rillig * without knowing which identifiers are type names.
780 1.28 rillig */
781 1.35 rillig //indent input
782 1.28 rillig char str[expr * expr];
783 1.28 rillig char str[expr**ptr];
784 1.28 rillig char str[*ptr**ptr];
785 1.28 rillig char str[sizeof(expr * expr)];
786 1.28 rillig char str[sizeof(int) * expr];
787 1.28 rillig char str[sizeof(*ptr)];
788 1.28 rillig char str[sizeof(type**)];
789 1.28 rillig char str[sizeof(**ptr)];
790 1.35 rillig //indent end
791 1.28 rillig
792 1.35 rillig //indent run -di0
793 1.29 rillig char str[expr * expr];
794 1.29 rillig char str[expr * *ptr];
795 1.29 rillig char str[*ptr * *ptr];
796 1.29 rillig char str[sizeof(expr * expr)];
797 1.29 rillig char str[sizeof(int) * expr];
798 1.28 rillig char str[sizeof(*ptr)];
799 1.50 rillig char str[sizeof(type **)];
800 1.28 rillig char str[sizeof(**ptr)];
801 1.35 rillig //indent end
802 1.31 rillig
803 1.31 rillig
804 1.31 rillig /*
805 1.32 rillig * Since lexi.c 1.158 from 2021-11-25, whether the function 'a' was considered
806 1.32 rillig * a declaration or a definition depended on the preceding struct, in
807 1.32 rillig * particular the length of the 'pn' line. This didn't make sense at all and
808 1.32 rillig * was due to an out-of-bounds memory access.
809 1.31 rillig *
810 1.31 rillig * Seen amongst others in args.c 1.72, function add_typedefs_from_file.
811 1.32 rillig * Fixed in lexi.c 1.165 from 2021-11-27.
812 1.31 rillig */
813 1.35 rillig //indent input
814 1.31 rillig struct {
815 1.31 rillig } v = {
816 1.31 rillig pn("ta"),
817 1.31 rillig };
818 1.31 rillig
819 1.31 rillig static void
820 1.31 rillig a(char *fe)
821 1.31 rillig {
822 1.31 rillig }
823 1.31 rillig
824 1.31 rillig struct {
825 1.31 rillig } v = {
826 1.31 rillig pn("t"),
827 1.31 rillig };
828 1.31 rillig
829 1.31 rillig static void
830 1.31 rillig a(char *fe)
831 1.31 rillig {
832 1.31 rillig }
833 1.35 rillig //indent end
834 1.31 rillig
835 1.35 rillig //indent run -di0
836 1.31 rillig struct {
837 1.31 rillig } v = {
838 1.31 rillig pn("ta"),
839 1.31 rillig };
840 1.31 rillig
841 1.31 rillig static void
842 1.32 rillig a(char *fe)
843 1.32 rillig {
844 1.31 rillig }
845 1.31 rillig
846 1.31 rillig struct {
847 1.31 rillig } v = {
848 1.31 rillig pn("t"),
849 1.31 rillig };
850 1.31 rillig
851 1.31 rillig static void
852 1.31 rillig a(char *fe)
853 1.31 rillig {
854 1.31 rillig }
855 1.35 rillig //indent end
856 1.36 rillig
857 1.36 rillig
858 1.36 rillig /*
859 1.36 rillig * Before NetBSD indent.c 1.178 from 2021-10-29, indent removed the blank
860 1.36 rillig * before the '=', in the second and third of these function pointer
861 1.36 rillig * declarations. This was because indent interpreted the prototype parameters
862 1.36 rillig * 'int' and 'int, int' as type casts, which doesn't make sense at all. Fixing
863 1.36 rillig * this properly requires large style changes since indent is based on simple
864 1.36 rillig * heuristics all over. This didn't change in indent.c 1.178; instead, the
865 1.36 rillig * rule for inserting a blank before a binary operator was changed to always
866 1.36 rillig * insert a blank, except at the beginning of a line.
867 1.36 rillig */
868 1.36 rillig //indent input
869 1.36 rillig char *(*fn)() = NULL;
870 1.36 rillig char *(*fn)(int) = NULL;
871 1.36 rillig char *(*fn)(int, int) = NULL;
872 1.36 rillig //indent end
873 1.36 rillig
874 1.36 rillig /* XXX: The parameter '(int)' is wrongly interpreted as a type cast. */
875 1.36 rillig /* XXX: The parameter '(int, int)' is wrongly interpreted as a type cast. */
876 1.36 rillig //indent run-equals-input -di0
877 1.40 rillig
878 1.40 rillig
879 1.40 rillig /*
880 1.41 rillig * Depending on whether there was a line break in the function header, the
881 1.41 rillig * spaces around the '||' operator were erroneously removed.
882 1.40 rillig */
883 1.40 rillig //indent input
884 1.40 rillig bool is_identifier_start(char ch)
885 1.40 rillig {
886 1.40 rillig return ch_isalpha(ch) || ch == '_';
887 1.40 rillig }
888 1.40 rillig
889 1.40 rillig bool
890 1.40 rillig is_identifier_start(char ch)
891 1.40 rillig {
892 1.40 rillig return ch_isalpha(ch) || ch == '_';
893 1.40 rillig }
894 1.40 rillig //indent end
895 1.40 rillig
896 1.40 rillig //indent run
897 1.40 rillig bool
898 1.40 rillig is_identifier_start(char ch)
899 1.40 rillig {
900 1.40 rillig return ch_isalpha(ch) || ch == '_';
901 1.40 rillig }
902 1.40 rillig
903 1.40 rillig bool
904 1.40 rillig is_identifier_start(char ch)
905 1.40 rillig {
906 1.41 rillig return ch_isalpha(ch) || ch == '_';
907 1.40 rillig }
908 1.40 rillig //indent end
909 1.42 rillig
910 1.42 rillig
911 1.42 rillig //indent input
912 1.42 rillig void buf_add_chars(struct buffer *, const char *, size_t);
913 1.42 rillig
914 1.42 rillig static inline bool
915 1.42 rillig ch_isalnum(char ch)
916 1.42 rillig {
917 1.42 rillig return isalnum((unsigned char)ch) != 0;
918 1.42 rillig }
919 1.42 rillig
920 1.42 rillig static inline bool
921 1.42 rillig ch_isalpha(char ch)
922 1.42 rillig {
923 1.42 rillig return isalpha((unsigned char)ch) != 0;
924 1.42 rillig }
925 1.42 rillig //indent end
926 1.42 rillig
927 1.42 rillig //indent run -i4 -di0
928 1.42 rillig // $ FIXME: 'buffer' is classified as 'word'.
929 1.42 rillig // $
930 1.42 rillig // $ FIXME: 'size_t' is classified as 'word'.
931 1.42 rillig void buf_add_chars(struct buffer *, const char *, size_t);
932 1.42 rillig
933 1.42 rillig static inline bool
934 1.42 rillig ch_isalnum(char ch)
935 1.42 rillig {
936 1.42 rillig return isalnum((unsigned char)ch) != 0;
937 1.42 rillig }
938 1.42 rillig
939 1.42 rillig static inline bool
940 1.42 rillig ch_isalpha(char ch)
941 1.42 rillig {
942 1.42 rillig return isalpha((unsigned char)ch) != 0;
943 1.42 rillig }
944 1.42 rillig //indent end
945 1.42 rillig
946 1.42 rillig //indent run-equals-input -i4 -di0
947 1.44 rillig
948 1.44 rillig
949 1.44 rillig //indent input
950 1.44 rillig void __printflike(1, 2)
951 1.44 rillig debug_printf(const char *fmt, ...)
952 1.44 rillig {
953 1.44 rillig }
954 1.44 rillig //indent end
955 1.44 rillig
956 1.44 rillig //indent run
957 1.44 rillig void
958 1.44 rillig // $ FIXME: No line break here.
959 1.44 rillig __printflike(1, 2)
960 1.44 rillig debug_printf(const char *fmt, ...)
961 1.44 rillig {
962 1.44 rillig }
963 1.44 rillig //indent end
964 1.44 rillig
965 1.44 rillig
966 1.60 rillig /*
967 1.60 rillig * When a name is defined both as a function and as a macro, the name in the
968 1.60 rillig * function definition must be enclosed in parentheses, to prevent the macro
969 1.60 rillig * from being expanded. It is also possible to undefine the macro, but that is
970 1.60 rillig * often not done in practice.
971 1.60 rillig */
972 1.44 rillig //indent input
973 1.44 rillig void
974 1.44 rillig (error_at)(int msgid, const pos_t *pos, ...)
975 1.44 rillig {
976 1.44 rillig }
977 1.44 rillig //indent end
978 1.44 rillig
979 1.60 rillig //indent run-equals-input
980 1.49 rillig
981 1.49 rillig
982 1.49 rillig //indent input
983 1.49 rillig struct a {
984 1.49 rillig struct b {
985 1.49 rillig struct c {
986 1.49 rillig struct d1 {
987 1.49 rillig int e;
988 1.49 rillig } d1;
989 1.49 rillig struct d2 {
990 1.49 rillig int e;
991 1.49 rillig } d2;
992 1.49 rillig } c;
993 1.49 rillig } b;
994 1.49 rillig };
995 1.49 rillig //indent end
996 1.49 rillig
997 1.49 rillig //indent run-equals-input -di0
998 1.51 rillig
999 1.51 rillig
1000 1.51 rillig //indent input
1001 1.51 rillig static FILE *ArchFindMember(const char *, const char *,
1002 1.51 rillig struct ar_hdr *, const char *);
1003 1.51 rillig
1004 1.51 rillig bool
1005 1.51 rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
1006 1.51 rillig {
1007 1.51 rillig }
1008 1.51 rillig
1009 1.51 rillig static void MAKE_ATTR_PRINTFLIKE(5, 0)
1010 1.51 rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
1011 1.51 rillig ParseErrorLevel level, const char *fmt, va_list ap)
1012 1.51 rillig {
1013 1.51 rillig }
1014 1.51 rillig
1015 1.51 rillig typedef struct {
1016 1.51 rillig const char *m_name;
1017 1.51 rillig } mod_t;
1018 1.51 rillig //indent end
1019 1.51 rillig
1020 1.51 rillig //indent run -fbs -di0 -psl
1021 1.52 rillig // $ Must be detected as a function declaration, not a definition.
1022 1.52 rillig static FILE *ArchFindMember(const char *, const char *,
1023 1.52 rillig struct ar_hdr *, const char *);
1024 1.51 rillig
1025 1.51 rillig bool
1026 1.51 rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
1027 1.51 rillig {
1028 1.51 rillig }
1029 1.51 rillig
1030 1.51 rillig static void
1031 1.51 rillig MAKE_ATTR_PRINTFLIKE(5, 0)
1032 1.51 rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
1033 1.51 rillig ParseErrorLevel level, const char *fmt, va_list ap)
1034 1.51 rillig {
1035 1.51 rillig }
1036 1.51 rillig
1037 1.51 rillig typedef struct {
1038 1.51 rillig const char *m_name;
1039 1.58 rillig } mod_t;
1040 1.51 rillig //indent end
1041 1.53 rillig
1042 1.53 rillig
1043 1.53 rillig //indent input
1044 1.53 rillig int a[] = {1, 2},
1045 1.53 rillig b[] = {1, 2};
1046 1.53 rillig {
1047 1.53 rillig int a[] = {1, 2},
1048 1.53 rillig b[] = {1, 2};
1049 1.53 rillig }
1050 1.53 rillig //indent end
1051 1.53 rillig
1052 1.53 rillig //indent run -di0
1053 1.53 rillig int a[] = {1, 2},
1054 1.53 rillig // $ FIXME: Missing indentation.
1055 1.53 rillig b[] = {1, 2};
1056 1.53 rillig {
1057 1.53 rillig int a[] = {1, 2},
1058 1.53 rillig // $ FIXME: Missing indentation.
1059 1.53 rillig b[] = {1, 2};
1060 1.53 rillig }
1061 1.53 rillig //indent end
1062 1.54 rillig
1063 1.54 rillig
1064 1.54 rillig /*
1065 1.54 rillig * When a type occurs at the top level, it forces a line break before.
1066 1.54 rillig */
1067 1.54 rillig //indent input
1068 1.54 rillig __attribute__((__dead__)) void die(void) {}
1069 1.54 rillig //indent end
1070 1.54 rillig
1071 1.54 rillig //indent run
1072 1.54 rillig __attribute__((__dead__))
1073 1.54 rillig void
1074 1.54 rillig die(void)
1075 1.54 rillig {
1076 1.54 rillig }
1077 1.54 rillig //indent end
1078 1.55 rillig
1079 1.55 rillig
1080 1.55 rillig /*
1081 1.55 rillig * In very rare cases, the type of a declarator might include literal tab
1082 1.55 rillig * characters. This tab might affect the indentation of the declarator, but
1083 1.55 rillig * only if it occurs before the declarator, and that is hard to achieve.
1084 1.55 rillig */
1085 1.55 rillig //indent input
1086 1.55 rillig int arr[sizeof " "];
1087 1.55 rillig //indent end
1088 1.55 rillig
1089 1.55 rillig //indent run-equals-input
1090 1.55 rillig
1091 1.55 rillig
1092 1.55 rillig /*
1093 1.55 rillig * The '}' of an initializer is not supposed to end the statement, it only ends
1094 1.55 rillig * the brace level of the initializer expression.
1095 1.55 rillig */
1096 1.55 rillig //indent input
1097 1.55 rillig int multi_line[1][1][1] = {
1098 1.55 rillig {
1099 1.55 rillig {
1100 1.55 rillig 1
1101 1.55 rillig },
1102 1.55 rillig },
1103 1.55 rillig };
1104 1.55 rillig int single_line[2][1][1] = {{{1},},{{2}}};
1105 1.55 rillig //indent end
1106 1.55 rillig
1107 1.55 rillig //indent run -di0
1108 1.55 rillig int multi_line[1][1][1] = {
1109 1.55 rillig {
1110 1.55 rillig {
1111 1.55 rillig 1
1112 1.55 rillig },
1113 1.55 rillig },
1114 1.55 rillig };
1115 1.55 rillig int single_line[2][1][1] = {{{1},}, {{2}}};
1116 1.55 rillig //indent end
1117 1.55 rillig
1118 1.55 rillig
1119 1.55 rillig /*
1120 1.55 rillig * The '}' of an initializer is not supposed to end the statement, it only ends
1121 1.55 rillig * the brace level of the initializer expression.
1122 1.55 rillig */
1123 1.55 rillig //indent input
1124 1.55 rillig {
1125 1.55 rillig int multi_line = {
1126 1.55 rillig {
1127 1.55 rillig {
1128 1.55 rillig b
1129 1.55 rillig },
1130 1.55 rillig },
1131 1.55 rillig };
1132 1.55 rillig int single_line = {{{b},},{}};
1133 1.55 rillig }
1134 1.55 rillig //indent end
1135 1.55 rillig
1136 1.55 rillig //indent run -di0
1137 1.55 rillig {
1138 1.55 rillig int multi_line = {
1139 1.55 rillig {
1140 1.55 rillig {
1141 1.55 rillig b
1142 1.55 rillig },
1143 1.55 rillig },
1144 1.55 rillig };
1145 1.55 rillig int single_line = {{{b},}, {}};
1146 1.55 rillig }
1147 1.55 rillig //indent end
1148 1.55 rillig
1149 1.55 rillig
1150 1.55 rillig /*
1151 1.55 rillig * In initializers, multi-line expressions don't have their second line
1152 1.55 rillig * indented, even though they should.
1153 1.55 rillig */
1154 1.55 rillig //indent input
1155 1.55 rillig {
1156 1.55 rillig multi_line = (int[]){
1157 1.55 rillig {1
1158 1.55 rillig +1},
1159 1.55 rillig {1
1160 1.55 rillig +1},
1161 1.55 rillig {1
1162 1.55 rillig +1},
1163 1.55 rillig };
1164 1.55 rillig }
1165 1.55 rillig //indent end
1166 1.55 rillig
1167 1.55 rillig //indent run
1168 1.55 rillig {
1169 1.55 rillig multi_line = (int[]){
1170 1.55 rillig {1
1171 1.55 rillig + 1},
1172 1.55 rillig {1
1173 1.55 rillig + 1},
1174 1.55 rillig {1
1175 1.55 rillig + 1},
1176 1.55 rillig };
1177 1.55 rillig }
1178 1.55 rillig //indent end
1179 1.57 rillig
1180 1.57 rillig
1181 1.57 rillig /*
1182 1.57 rillig *
1183 1.57 rillig */
1184 1.57 rillig //indent input
1185 1.57 rillig int
1186 1.57 rillig old_style(a)
1187 1.57 rillig struct {
1188 1.57 rillig int member;
1189 1.57 rillig } a;
1190 1.57 rillig {
1191 1.57 rillig stmt;
1192 1.57 rillig }
1193 1.57 rillig //indent end
1194 1.57 rillig
1195 1.57 rillig //indent run-equals-input
1196