fmt_decl.c revision 1.55 1 1.55 rillig /* $NetBSD: fmt_decl.c,v 1.55 2023/06/14 20:46:08 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.1 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.1 rillig b;
299 1.7 rillig /* $ XXX: The indentation of the second line is wrong. The variable names */
300 1.7 rillig /* $ XXX: 'a' and 'b' should be in the same column; the word 'struct' is */
301 1.7 rillig /* $ XXX: missing in the calculation for the indentation. */
302 1.1 rillig struct s01 a,
303 1.1 rillig b;
304 1.1 rillig struct s012 a,
305 1.1 rillig b;
306 1.1 rillig struct s0123 a,
307 1.1 rillig b;
308 1.1 rillig struct s01234 a,
309 1.1 rillig b;
310 1.1 rillig struct s012345 a,
311 1.1 rillig b;
312 1.1 rillig struct s0123456 a,
313 1.1 rillig b;
314 1.1 rillig struct s01234567 a,
315 1.1 rillig b;
316 1.1 rillig struct s012345678 a,
317 1.1 rillig b;
318 1.1 rillig struct s0123456789 a,
319 1.1 rillig b;
320 1.1 rillig struct s01234567890 a,
321 1.1 rillig b;
322 1.1 rillig struct s012345678901 a,
323 1.1 rillig b;
324 1.1 rillig struct s0123456789012 a,
325 1.1 rillig b;
326 1.1 rillig struct s01234567890123 a,
327 1.1 rillig b;
328 1.35 rillig //indent end
329 1.2 rillig
330 1.2 rillig
331 1.35 rillig //indent input
332 1.2 rillig char * x(void)
333 1.2 rillig {
334 1.2 rillig type identifier;
335 1.2 rillig type *pointer;
336 1.2 rillig unused * value;
337 1.2 rillig (void)unused * value;
338 1.2 rillig
339 1.2 rillig dmax = (double)3 * 10.0;
340 1.2 rillig dmin = (double)dmax * 10.0;
341 1.2 rillig davg = (double)dmax * dmin;
342 1.2 rillig
343 1.2 rillig return NULL;
344 1.2 rillig }
345 1.35 rillig //indent end
346 1.2 rillig
347 1.35 rillig //indent run
348 1.2 rillig char *
349 1.2 rillig x(void)
350 1.2 rillig {
351 1.2 rillig type identifier;
352 1.2 rillig type *pointer;
353 1.2 rillig unused *value;
354 1.2 rillig (void)unused * value;
355 1.2 rillig
356 1.2 rillig dmax = (double)3 * 10.0;
357 1.2 rillig dmin = (double)dmax * 10.0;
358 1.2 rillig davg = (double)dmax * dmin;
359 1.2 rillig
360 1.2 rillig return NULL;
361 1.2 rillig }
362 1.35 rillig //indent end
363 1.2 rillig
364 1.21 rillig
365 1.35 rillig //indent input
366 1.2 rillig int *
367 1.2 rillig y(void) {
368 1.2 rillig
369 1.2 rillig }
370 1.2 rillig
371 1.2 rillig int
372 1.2 rillig z(void) {
373 1.2 rillig
374 1.2 rillig }
375 1.35 rillig //indent end
376 1.2 rillig
377 1.35 rillig //indent run
378 1.2 rillig int *
379 1.2 rillig y(void)
380 1.2 rillig {
381 1.2 rillig
382 1.2 rillig }
383 1.2 rillig
384 1.2 rillig int
385 1.2 rillig z(void)
386 1.2 rillig {
387 1.2 rillig
388 1.2 rillig }
389 1.35 rillig //indent end
390 1.2 rillig
391 1.2 rillig
392 1.35 rillig //indent input
393 1.2 rillig int x;
394 1.2 rillig int *y;
395 1.2 rillig int * * * * z;
396 1.35 rillig //indent end
397 1.2 rillig
398 1.35 rillig //indent run
399 1.2 rillig int x;
400 1.2 rillig int *y;
401 1.2 rillig int ****z;
402 1.35 rillig //indent end
403 1.4 rillig
404 1.4 rillig
405 1.35 rillig //indent input
406 1.4 rillig int main(void) {
407 1.4 rillig char (*f1)() = NULL;
408 1.4 rillig char *(*f1)() = NULL;
409 1.4 rillig char *(*f2)();
410 1.4 rillig }
411 1.35 rillig //indent end
412 1.4 rillig
413 1.6 rillig /*
414 1.6 rillig * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
415 1.6 rillig * and third variable declaration in column 1. This bug has been introduced
416 1.6 rillig * to NetBSD when FreeBSD indent was imported in 2019.
417 1.6 rillig */
418 1.35 rillig //indent run -ldi0
419 1.4 rillig int
420 1.4 rillig main(void)
421 1.4 rillig {
422 1.4 rillig char (*f1)() = NULL;
423 1.6 rillig char *(*f1)() = NULL;
424 1.6 rillig char *(*f2)();
425 1.4 rillig }
426 1.35 rillig //indent end
427 1.5 rillig
428 1.35 rillig //indent run
429 1.5 rillig int
430 1.5 rillig main(void)
431 1.5 rillig {
432 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
433 1.5 rillig char (*f1)() = NULL;
434 1.5 rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
435 1.6 rillig char *(* f1)() = NULL;
436 1.5 rillig /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
437 1.6 rillig char *(* f2)();
438 1.5 rillig }
439 1.35 rillig //indent end
440 1.10 rillig
441 1.10 rillig
442 1.10 rillig /*
443 1.10 rillig * In some ancient time long before ISO C90, variable declarations with
444 1.10 rillig * initializer could be written without '='. The C Programming Language from
445 1.10 rillig * 1978 doesn't mention this form anymore.
446 1.18 rillig *
447 1.18 rillig * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a
448 1.18 rillig * unary operator.
449 1.10 rillig */
450 1.35 rillig //indent input
451 1.10 rillig int a - 1;
452 1.10 rillig {
453 1.10 rillig int a - 1;
454 1.10 rillig }
455 1.35 rillig //indent end
456 1.10 rillig
457 1.35 rillig //indent run -di0
458 1.11 rillig int a - 1;
459 1.10 rillig {
460 1.11 rillig int a - 1;
461 1.10 rillig }
462 1.35 rillig //indent end
463 1.14 rillig
464 1.14 rillig
465 1.14 rillig /*
466 1.20 rillig * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-19, the indentation
467 1.18 rillig * of the '*' depended on the function name, which did not make sense. For
468 1.18 rillig * function names that matched [A-Za-z]+, the '*' was placed correctly, for
469 1.18 rillig * all other function names (containing [$0-9_]) the '*' was right-aligned on
470 1.20 rillig * the declaration indentation, which defaults to 16.
471 1.14 rillig */
472 1.35 rillig //indent input
473 1.14 rillig int *
474 1.14 rillig f2(void)
475 1.14 rillig {
476 1.14 rillig }
477 1.14 rillig
478 1.14 rillig int *
479 1.14 rillig yy(void)
480 1.14 rillig {
481 1.14 rillig }
482 1.14 rillig
483 1.14 rillig int *
484 1.18 rillig int_create(void)
485 1.14 rillig {
486 1.14 rillig }
487 1.35 rillig //indent end
488 1.15 rillig
489 1.35 rillig //indent run-equals-input
490 1.18 rillig
491 1.15 rillig
492 1.15 rillig /*
493 1.15 rillig * Since 2019-04-04, the space between the '){' is missing.
494 1.15 rillig */
495 1.35 rillig //indent input
496 1.15 rillig int *
497 1.15 rillig function_name_____20________30________40________50
498 1.15 rillig (void)
499 1.15 rillig {}
500 1.35 rillig //indent end
501 1.15 rillig
502 1.38 rillig /*
503 1.38 rillig * Before 2023-05-11, indent moved the '{' right after the '(void)', without
504 1.38 rillig * any space in between.
505 1.38 rillig */
506 1.35 rillig //indent run
507 1.15 rillig int *function_name_____20________30________40________50
508 1.37 rillig (void)
509 1.37 rillig {
510 1.15 rillig }
511 1.35 rillig //indent end
512 1.15 rillig
513 1.15 rillig
514 1.15 rillig /*
515 1.17 rillig * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function
516 1.17 rillig * names were preserved while others were silently discarded.
517 1.15 rillig */
518 1.35 rillig //indent input
519 1.15 rillig int *
520 1.15 rillig aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
521 1.15 rillig (void)
522 1.15 rillig {}
523 1.35 rillig //indent end
524 1.15 rillig
525 1.38 rillig /*
526 1.38 rillig * Before 2023-05-11, indent moved the '{' right after the '(void)', without
527 1.38 rillig * any space in between.
528 1.38 rillig */
529 1.35 rillig //indent run
530 1.16 rillig int *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
531 1.37 rillig (void)
532 1.37 rillig {
533 1.15 rillig }
534 1.35 rillig //indent end
535 1.22 rillig
536 1.22 rillig
537 1.22 rillig /*
538 1.22 rillig * Before 1990, when C90 standardized function prototypes, a function
539 1.22 rillig * declaration or definition did not contain a '*' that may have looked
540 1.22 rillig * similar to the binary operator '*' because it was surrounded by two
541 1.22 rillig * identifiers.
542 1.22 rillig *
543 1.26 rillig * As of 2021-11-21, indent interpreted the '*' in the function declaration in
544 1.26 rillig * line 1 as a binary operator, even though the '*' was followed by a ','
545 1.26 rillig * directly. This was not visible in the output though since indent never
546 1.26 rillig * outputs a space before a comma.
547 1.22 rillig *
548 1.26 rillig * In the function declaration in line 2 and the function definition in line
549 1.26 rillig * 5, indent interpreted the '*' as a binary operator as well and accordingly
550 1.26 rillig * placed spaces around the '*'. On a very low syntactical analysis level,
551 1.26 rillig * this may have made sense since the '*' was surrounded by words, but still
552 1.26 rillig * the '*' is part of a declaration, where a binary operator does not make
553 1.26 rillig * sense.
554 1.26 rillig *
555 1.26 rillig * Essentially, as of 2021, indent had missed the last 31 years of advances in
556 1.26 rillig * the C programming language, in particular the invention of function
557 1.26 rillig * prototypes. Instead, the workaround had been to require all type names to
558 1.26 rillig * be specified via the options '-ta' and '-T'. This put the burden on the
559 1.26 rillig * user instead of the implementer.
560 1.26 rillig *
561 1.26 rillig * Fixed in lexi.c 1.156 from 2021-11-25.
562 1.22 rillig */
563 1.35 rillig //indent input
564 1.22 rillig void buffer_add(buffer *, char);
565 1.22 rillig void buffer_add(buffer *buf, char ch);
566 1.22 rillig
567 1.22 rillig void
568 1.22 rillig buffer_add(buffer *buf, char ch)
569 1.22 rillig {
570 1.22 rillig *buf->e++ = ch;
571 1.22 rillig }
572 1.35 rillig //indent end
573 1.22 rillig
574 1.50 rillig //indent run
575 1.50 rillig void buffer_add(buffer *, char);
576 1.50 rillig // $ FIXME: There should be no space after the '*'.
577 1.50 rillig void buffer_add(buffer * buf, char ch);
578 1.50 rillig
579 1.50 rillig void
580 1.50 rillig buffer_add(buffer *buf, char ch)
581 1.50 rillig {
582 1.50 rillig *buf->e++ = ch;
583 1.50 rillig }
584 1.50 rillig //indent end
585 1.23 rillig
586 1.23 rillig
587 1.23 rillig /*
588 1.38 rillig * Before lexi.c 1.153 from 2021-11-25, indent did not recognize 'Token' as a
589 1.38 rillig * type name and then messed up the positioning of the '{'.
590 1.23 rillig */
591 1.35 rillig //indent input
592 1.23 rillig static Token
593 1.23 rillig ToToken(bool cond)
594 1.23 rillig {
595 1.23 rillig }
596 1.35 rillig //indent end
597 1.23 rillig
598 1.35 rillig //indent run-equals-input -TToken
599 1.34 rillig
600 1.24 rillig /* Since lexi.c 1.153 from 2021-11-25. */
601 1.35 rillig //indent run-equals-input
602 1.23 rillig
603 1.23 rillig
604 1.23 rillig /*
605 1.46 rillig * Before indent.c 1.309 from 2023-05-23, indent easily got confused by unknown
606 1.46 rillig * type names in struct declarations, as a ';' did not finish a declaration.
607 1.23 rillig */
608 1.35 rillig //indent input
609 1.23 rillig typedef struct OpenDirs {
610 1.23 rillig CachedDirList list;
611 1.23 rillig HashTable /* of CachedDirListNode */ table;
612 1.23 rillig } OpenDirs;
613 1.35 rillig //indent end
614 1.23 rillig
615 1.46 rillig //indent run-equals-input -THashTable
616 1.23 rillig
617 1.46 rillig //indent run-equals-input
618 1.23 rillig
619 1.23 rillig
620 1.23 rillig /*
621 1.46 rillig * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
622 1.46 rillig * type names, even in declarations that are syntactically unambiguous.
623 1.23 rillig */
624 1.35 rillig //indent input
625 1.23 rillig static CachedDir *dot = NULL;
626 1.35 rillig //indent end
627 1.23 rillig
628 1.35 rillig //indent run-equals-input -TCachedDir
629 1.34 rillig
630 1.35 rillig //indent run-equals-input
631 1.23 rillig
632 1.23 rillig
633 1.23 rillig /*
634 1.46 rillig * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
635 1.46 rillig * type names in declarations.
636 1.23 rillig */
637 1.35 rillig //indent input
638 1.23 rillig static CachedDir *
639 1.23 rillig CachedDir_New(const char *name)
640 1.23 rillig {
641 1.23 rillig }
642 1.35 rillig //indent end
643 1.23 rillig
644 1.35 rillig //indent run-equals-input
645 1.23 rillig
646 1.23 rillig
647 1.23 rillig /*
648 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
649 1.26 rillig * type names in declarations and generated 'CachedDir * dir' with an extra
650 1.26 rillig * space.
651 1.23 rillig */
652 1.35 rillig //indent input
653 1.23 rillig static CachedDir *
654 1.23 rillig CachedDir_Ref(CachedDir *dir)
655 1.23 rillig {
656 1.23 rillig }
657 1.35 rillig //indent end
658 1.23 rillig
659 1.35 rillig //indent run-equals-input
660 1.23 rillig
661 1.23 rillig
662 1.23 rillig /*
663 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
664 1.26 rillig * type names in declarations and generated 'HashEntry * he' with an extra
665 1.26 rillig * space.
666 1.26 rillig *
667 1.26 rillig * Before lexi.c 1.153 from 2021-11-25, indent also placed the '{' at the end
668 1.26 rillig * of the line.
669 1.23 rillig */
670 1.35 rillig //indent input
671 1.23 rillig static bool
672 1.23 rillig HashEntry_KeyEquals(const HashEntry *he, Substring key)
673 1.23 rillig {
674 1.23 rillig }
675 1.35 rillig //indent end
676 1.23 rillig
677 1.35 rillig //indent run-equals-input
678 1.23 rillig
679 1.23 rillig
680 1.23 rillig /*
681 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent didn't notice that the two '*'
682 1.26 rillig * are in a declaration, instead it interpreted the first '*' as a binary
683 1.26 rillig * operator, therefore generating 'CachedDir * *var' with an extra space.
684 1.23 rillig */
685 1.35 rillig //indent input
686 1.23 rillig static void
687 1.23 rillig CachedDir_Assign(CachedDir **var, CachedDir *dir)
688 1.23 rillig {
689 1.23 rillig }
690 1.35 rillig //indent end
691 1.23 rillig
692 1.46 rillig //indent run-equals-input -TCachedDir
693 1.46 rillig
694 1.35 rillig //indent run-equals-input
695 1.34 rillig
696 1.23 rillig
697 1.23 rillig /*
698 1.24 rillig * Before lexi.c 1.153 from 2021-11-25, all initializer expressions after the
699 1.46 rillig * first one were indented as if they were statement continuations. This was
700 1.46 rillig * caused by the token 'Shell' being identified as a word, not as a type name.
701 1.23 rillig */
702 1.35 rillig //indent input
703 1.24 rillig static Shell shells[] = {
704 1.23 rillig {
705 1.23 rillig first,
706 1.23 rillig second,
707 1.23 rillig },
708 1.23 rillig };
709 1.35 rillig //indent end
710 1.23 rillig
711 1.35 rillig //indent run-equals-input
712 1.23 rillig
713 1.23 rillig
714 1.23 rillig /*
715 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by function
716 1.27 rillig * attribute macros that followed the function declaration. Its primitive
717 1.27 rillig * heuristic between deciding between a function declaration and a function
718 1.27 rillig * definition only looked for ')' immediately followed by ',' or ';'. This was
719 1.27 rillig * sufficient for well-formatted code before 1990. With the addition of
720 1.27 rillig * function prototypes and GCC attributes, the situation became more
721 1.27 rillig * complicated, and it took indent 31 years to adapt to this new reality.
722 1.23 rillig */
723 1.35 rillig //indent input
724 1.23 rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
725 1.23 rillig static void JobRestartJobs(void);
726 1.35 rillig //indent end
727 1.23 rillig
728 1.35 rillig //indent run
729 1.39 rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
730 1.27 rillig static void JobRestartJobs(void);
731 1.35 rillig //indent end
732 1.23 rillig
733 1.23 rillig
734 1.23 rillig /*
735 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by the
736 1.27 rillig * tokens ')' and ';' in the function body. It wrongly regarded them as
737 1.27 rillig * finishing a function declaration.
738 1.23 rillig */
739 1.35 rillig //indent input
740 1.23 rillig MAKE_INLINE const char *
741 1.23 rillig GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); }
742 1.35 rillig //indent end
743 1.23 rillig
744 1.26 rillig /*
745 1.26 rillig * Before lexi.c 1.156 from 2021-11-25, indent generated 'GNode * gn' with an
746 1.26 rillig * extra space.
747 1.27 rillig *
748 1.27 rillig * Before lexi.c 1.158 from 2021-11-25, indent wrongly placed the function
749 1.27 rillig * name in line 1, together with the '{'.
750 1.26 rillig */
751 1.35 rillig //indent run
752 1.27 rillig MAKE_INLINE const char *
753 1.27 rillig GNode_VarTarget(GNode *gn)
754 1.27 rillig {
755 1.23 rillig return GNode_ValueDirect(gn, TARGET);
756 1.23 rillig }
757 1.35 rillig //indent end
758 1.23 rillig
759 1.35 rillig //indent run-equals-prev-output -TGNode
760 1.25 rillig
761 1.25 rillig
762 1.25 rillig /*
763 1.25 rillig * Ensure that '*' in declarations is interpreted (or at least formatted) as
764 1.25 rillig * a 'pointer to' type derivation, not as a binary or unary operator.
765 1.25 rillig */
766 1.35 rillig //indent input
767 1.25 rillig number *var = a * b;
768 1.25 rillig
769 1.25 rillig void
770 1.25 rillig function(void)
771 1.25 rillig {
772 1.25 rillig number *var = a * b;
773 1.25 rillig }
774 1.35 rillig //indent end
775 1.25 rillig
776 1.35 rillig //indent run-equals-input -di0
777 1.28 rillig
778 1.28 rillig
779 1.28 rillig /*
780 1.28 rillig * In declarations, most occurrences of '*' are pointer type derivations.
781 1.29 rillig * There are a few exceptions though. Some of these are hard to detect
782 1.29 rillig * without knowing which identifiers are type names.
783 1.28 rillig */
784 1.35 rillig //indent input
785 1.28 rillig char str[expr * expr];
786 1.28 rillig char str[expr**ptr];
787 1.28 rillig char str[*ptr**ptr];
788 1.28 rillig char str[sizeof(expr * expr)];
789 1.28 rillig char str[sizeof(int) * expr];
790 1.28 rillig char str[sizeof(*ptr)];
791 1.28 rillig char str[sizeof(type**)];
792 1.28 rillig char str[sizeof(**ptr)];
793 1.35 rillig //indent end
794 1.28 rillig
795 1.35 rillig //indent run -di0
796 1.29 rillig char str[expr * expr];
797 1.29 rillig char str[expr * *ptr];
798 1.29 rillig char str[*ptr * *ptr];
799 1.29 rillig char str[sizeof(expr * expr)];
800 1.29 rillig char str[sizeof(int) * expr];
801 1.28 rillig char str[sizeof(*ptr)];
802 1.50 rillig char str[sizeof(type **)];
803 1.28 rillig char str[sizeof(**ptr)];
804 1.35 rillig //indent end
805 1.31 rillig
806 1.31 rillig
807 1.31 rillig /*
808 1.32 rillig * Since lexi.c 1.158 from 2021-11-25, whether the function 'a' was considered
809 1.32 rillig * a declaration or a definition depended on the preceding struct, in
810 1.32 rillig * particular the length of the 'pn' line. This didn't make sense at all and
811 1.32 rillig * was due to an out-of-bounds memory access.
812 1.31 rillig *
813 1.31 rillig * Seen amongst others in args.c 1.72, function add_typedefs_from_file.
814 1.32 rillig * Fixed in lexi.c 1.165 from 2021-11-27.
815 1.31 rillig */
816 1.35 rillig //indent input
817 1.31 rillig struct {
818 1.31 rillig } v = {
819 1.31 rillig pn("ta"),
820 1.31 rillig };
821 1.31 rillig
822 1.31 rillig static void
823 1.31 rillig a(char *fe)
824 1.31 rillig {
825 1.31 rillig }
826 1.31 rillig
827 1.31 rillig struct {
828 1.31 rillig } v = {
829 1.31 rillig pn("t"),
830 1.31 rillig };
831 1.31 rillig
832 1.31 rillig static void
833 1.31 rillig a(char *fe)
834 1.31 rillig {
835 1.31 rillig }
836 1.35 rillig //indent end
837 1.31 rillig
838 1.35 rillig //indent run -di0
839 1.31 rillig struct {
840 1.31 rillig } v = {
841 1.31 rillig pn("ta"),
842 1.31 rillig };
843 1.31 rillig
844 1.31 rillig static void
845 1.32 rillig a(char *fe)
846 1.32 rillig {
847 1.31 rillig }
848 1.31 rillig
849 1.31 rillig struct {
850 1.31 rillig } v = {
851 1.31 rillig pn("t"),
852 1.31 rillig };
853 1.31 rillig
854 1.31 rillig static void
855 1.31 rillig a(char *fe)
856 1.31 rillig {
857 1.31 rillig }
858 1.35 rillig //indent end
859 1.36 rillig
860 1.36 rillig
861 1.36 rillig /*
862 1.36 rillig * Before NetBSD indent.c 1.178 from 2021-10-29, indent removed the blank
863 1.36 rillig * before the '=', in the second and third of these function pointer
864 1.36 rillig * declarations. This was because indent interpreted the prototype parameters
865 1.36 rillig * 'int' and 'int, int' as type casts, which doesn't make sense at all. Fixing
866 1.36 rillig * this properly requires large style changes since indent is based on simple
867 1.36 rillig * heuristics all over. This didn't change in indent.c 1.178; instead, the
868 1.36 rillig * rule for inserting a blank before a binary operator was changed to always
869 1.36 rillig * insert a blank, except at the beginning of a line.
870 1.36 rillig */
871 1.36 rillig //indent input
872 1.36 rillig char *(*fn)() = NULL;
873 1.36 rillig char *(*fn)(int) = NULL;
874 1.36 rillig char *(*fn)(int, int) = NULL;
875 1.36 rillig //indent end
876 1.36 rillig
877 1.36 rillig /* XXX: The parameter '(int)' is wrongly interpreted as a type cast. */
878 1.36 rillig /* XXX: The parameter '(int, int)' is wrongly interpreted as a type cast. */
879 1.36 rillig //indent run-equals-input -di0
880 1.40 rillig
881 1.40 rillig
882 1.40 rillig /*
883 1.41 rillig * Depending on whether there was a line break in the function header, the
884 1.41 rillig * spaces around the '||' operator were erroneously removed.
885 1.40 rillig */
886 1.40 rillig //indent input
887 1.40 rillig bool is_identifier_start(char ch)
888 1.40 rillig {
889 1.40 rillig return ch_isalpha(ch) || ch == '_';
890 1.40 rillig }
891 1.40 rillig
892 1.40 rillig bool
893 1.40 rillig is_identifier_start(char ch)
894 1.40 rillig {
895 1.40 rillig return ch_isalpha(ch) || ch == '_';
896 1.40 rillig }
897 1.40 rillig //indent end
898 1.40 rillig
899 1.40 rillig //indent run
900 1.40 rillig bool
901 1.40 rillig is_identifier_start(char ch)
902 1.40 rillig {
903 1.40 rillig return ch_isalpha(ch) || ch == '_';
904 1.40 rillig }
905 1.40 rillig
906 1.40 rillig bool
907 1.40 rillig is_identifier_start(char ch)
908 1.40 rillig {
909 1.41 rillig return ch_isalpha(ch) || ch == '_';
910 1.40 rillig }
911 1.40 rillig //indent end
912 1.42 rillig
913 1.42 rillig
914 1.42 rillig //indent input
915 1.42 rillig void buf_add_chars(struct buffer *, const char *, size_t);
916 1.42 rillig
917 1.42 rillig static inline bool
918 1.42 rillig ch_isalnum(char ch)
919 1.42 rillig {
920 1.42 rillig return isalnum((unsigned char)ch) != 0;
921 1.42 rillig }
922 1.42 rillig
923 1.42 rillig static inline bool
924 1.42 rillig ch_isalpha(char ch)
925 1.42 rillig {
926 1.42 rillig return isalpha((unsigned char)ch) != 0;
927 1.42 rillig }
928 1.42 rillig //indent end
929 1.42 rillig
930 1.42 rillig //indent run -i4 -di0
931 1.42 rillig // $ FIXME: 'buffer' is classified as 'word'.
932 1.42 rillig // $
933 1.48 rillig // $ XXX: 'char' is classified as 'type_in_parentheses'; check whether
934 1.48 rillig // $ XXX: lsym_type_in_parentheses should only be used for types in cast
935 1.48 rillig // $ XXX: expressions.
936 1.42 rillig // $
937 1.42 rillig // $ FIXME: 'size_t' is classified as 'word'.
938 1.42 rillig void buf_add_chars(struct buffer *, const char *, size_t);
939 1.42 rillig
940 1.42 rillig static inline bool
941 1.42 rillig ch_isalnum(char ch)
942 1.42 rillig {
943 1.42 rillig return isalnum((unsigned char)ch) != 0;
944 1.42 rillig }
945 1.42 rillig
946 1.42 rillig static inline bool
947 1.42 rillig ch_isalpha(char ch)
948 1.42 rillig {
949 1.42 rillig return isalpha((unsigned char)ch) != 0;
950 1.42 rillig }
951 1.42 rillig //indent end
952 1.42 rillig
953 1.42 rillig //indent run-equals-input -i4 -di0
954 1.44 rillig
955 1.44 rillig
956 1.44 rillig //indent input
957 1.44 rillig void __printflike(1, 2)
958 1.44 rillig debug_printf(const char *fmt, ...)
959 1.44 rillig {
960 1.44 rillig }
961 1.44 rillig //indent end
962 1.44 rillig
963 1.44 rillig //indent run
964 1.44 rillig void
965 1.44 rillig // $ FIXME: No line break here.
966 1.44 rillig __printflike(1, 2)
967 1.44 rillig debug_printf(const char *fmt, ...)
968 1.44 rillig {
969 1.44 rillig }
970 1.44 rillig //indent end
971 1.44 rillig
972 1.44 rillig
973 1.44 rillig //indent input
974 1.44 rillig void
975 1.44 rillig (error_at)(int msgid, const pos_t *pos, ...)
976 1.44 rillig {
977 1.44 rillig }
978 1.44 rillig //indent end
979 1.44 rillig
980 1.44 rillig //indent run -ci4 -di0 -ndj -nlp
981 1.44 rillig void
982 1.44 rillig // $ FIXME: Wrong indentation, should be 0 instead.
983 1.50 rillig // $ FIXME: There should be no space after the '*'.
984 1.50 rillig (error_at)(int msgid, const pos_t * pos, ...)
985 1.44 rillig {
986 1.44 rillig }
987 1.44 rillig //indent end
988 1.49 rillig
989 1.49 rillig
990 1.49 rillig //indent input
991 1.49 rillig struct a {
992 1.49 rillig struct b {
993 1.49 rillig struct c {
994 1.49 rillig struct d1 {
995 1.49 rillig int e;
996 1.49 rillig } d1;
997 1.49 rillig struct d2 {
998 1.49 rillig int e;
999 1.49 rillig } d2;
1000 1.49 rillig } c;
1001 1.49 rillig } b;
1002 1.49 rillig };
1003 1.49 rillig //indent end
1004 1.49 rillig
1005 1.49 rillig //indent run-equals-input -di0
1006 1.51 rillig
1007 1.51 rillig
1008 1.51 rillig //indent input
1009 1.51 rillig static FILE *ArchFindMember(const char *, const char *,
1010 1.51 rillig struct ar_hdr *, const char *);
1011 1.51 rillig
1012 1.51 rillig bool
1013 1.51 rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
1014 1.51 rillig {
1015 1.51 rillig }
1016 1.51 rillig
1017 1.51 rillig static void MAKE_ATTR_PRINTFLIKE(5, 0)
1018 1.51 rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
1019 1.51 rillig ParseErrorLevel level, const char *fmt, va_list ap)
1020 1.51 rillig {
1021 1.51 rillig }
1022 1.51 rillig
1023 1.51 rillig typedef struct {
1024 1.51 rillig const char *m_name;
1025 1.51 rillig } mod_t;
1026 1.51 rillig //indent end
1027 1.51 rillig
1028 1.51 rillig //indent run -fbs -di0 -psl
1029 1.52 rillig // $ Must be detected as a function declaration, not a definition.
1030 1.52 rillig static FILE *ArchFindMember(const char *, const char *,
1031 1.52 rillig struct ar_hdr *, const char *);
1032 1.51 rillig
1033 1.51 rillig bool
1034 1.51 rillig Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
1035 1.51 rillig {
1036 1.51 rillig }
1037 1.51 rillig
1038 1.51 rillig static void
1039 1.51 rillig MAKE_ATTR_PRINTFLIKE(5, 0)
1040 1.51 rillig ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
1041 1.51 rillig ParseErrorLevel level, const char *fmt, va_list ap)
1042 1.51 rillig {
1043 1.51 rillig }
1044 1.51 rillig
1045 1.51 rillig typedef struct {
1046 1.51 rillig const char *m_name;
1047 1.51 rillig }
1048 1.51 rillig // $ FIXME: Remove this line break.
1049 1.51 rillig mod_t;
1050 1.51 rillig //indent end
1051 1.53 rillig
1052 1.53 rillig
1053 1.53 rillig //indent input
1054 1.53 rillig int a[] = {1, 2},
1055 1.53 rillig b[] = {1, 2};
1056 1.53 rillig {
1057 1.53 rillig int a[] = {1, 2},
1058 1.53 rillig b[] = {1, 2};
1059 1.53 rillig }
1060 1.53 rillig //indent end
1061 1.53 rillig
1062 1.53 rillig //indent run -di0
1063 1.53 rillig int a[] = {1, 2},
1064 1.53 rillig // $ FIXME: Missing indentation.
1065 1.53 rillig b[] = {1, 2};
1066 1.53 rillig {
1067 1.53 rillig int a[] = {1, 2},
1068 1.53 rillig // $ FIXME: Missing indentation.
1069 1.53 rillig b[] = {1, 2};
1070 1.53 rillig }
1071 1.53 rillig //indent end
1072 1.54 rillig
1073 1.54 rillig
1074 1.54 rillig /*
1075 1.54 rillig * When a type occurs at the top level, it forces a line break before.
1076 1.54 rillig */
1077 1.54 rillig //indent input
1078 1.54 rillig __attribute__((__dead__)) void die(void) {}
1079 1.54 rillig //indent end
1080 1.54 rillig
1081 1.54 rillig //indent run
1082 1.54 rillig __attribute__((__dead__))
1083 1.54 rillig void
1084 1.54 rillig die(void)
1085 1.54 rillig {
1086 1.54 rillig }
1087 1.54 rillig //indent end
1088 1.55 rillig
1089 1.55 rillig
1090 1.55 rillig /*
1091 1.55 rillig * In very rare cases, the type of a declarator might include literal tab
1092 1.55 rillig * characters. This tab might affect the indentation of the declarator, but
1093 1.55 rillig * only if it occurs before the declarator, and that is hard to achieve.
1094 1.55 rillig */
1095 1.55 rillig //indent input
1096 1.55 rillig int arr[sizeof " "];
1097 1.55 rillig //indent end
1098 1.55 rillig
1099 1.55 rillig //indent run-equals-input
1100 1.55 rillig
1101 1.55 rillig
1102 1.55 rillig /*
1103 1.55 rillig * The '}' of an initializer is not supposed to end the statement, it only ends
1104 1.55 rillig * the brace level of the initializer expression.
1105 1.55 rillig */
1106 1.55 rillig //indent input
1107 1.55 rillig int multi_line[1][1][1] = {
1108 1.55 rillig {
1109 1.55 rillig {
1110 1.55 rillig 1
1111 1.55 rillig },
1112 1.55 rillig },
1113 1.55 rillig };
1114 1.55 rillig int single_line[2][1][1] = {{{1},},{{2}}};
1115 1.55 rillig //indent end
1116 1.55 rillig
1117 1.55 rillig //indent run -di0
1118 1.55 rillig int multi_line[1][1][1] = {
1119 1.55 rillig {
1120 1.55 rillig {
1121 1.55 rillig 1
1122 1.55 rillig },
1123 1.55 rillig },
1124 1.55 rillig };
1125 1.55 rillig int single_line[2][1][1] = {{{1},}, {{2}}};
1126 1.55 rillig //indent end
1127 1.55 rillig
1128 1.55 rillig
1129 1.55 rillig /*
1130 1.55 rillig * The '}' of an initializer is not supposed to end the statement, it only ends
1131 1.55 rillig * the brace level of the initializer expression.
1132 1.55 rillig */
1133 1.55 rillig //indent input
1134 1.55 rillig {
1135 1.55 rillig int multi_line = {
1136 1.55 rillig {
1137 1.55 rillig {
1138 1.55 rillig b
1139 1.55 rillig },
1140 1.55 rillig },
1141 1.55 rillig };
1142 1.55 rillig int single_line = {{{b},},{}};
1143 1.55 rillig }
1144 1.55 rillig //indent end
1145 1.55 rillig
1146 1.55 rillig //indent run -di0
1147 1.55 rillig {
1148 1.55 rillig int multi_line = {
1149 1.55 rillig {
1150 1.55 rillig {
1151 1.55 rillig b
1152 1.55 rillig },
1153 1.55 rillig },
1154 1.55 rillig };
1155 1.55 rillig int single_line = {{{b},}, {}};
1156 1.55 rillig }
1157 1.55 rillig //indent end
1158 1.55 rillig
1159 1.55 rillig
1160 1.55 rillig /*
1161 1.55 rillig * In initializers, multi-line expressions don't have their second line
1162 1.55 rillig * indented, even though they should.
1163 1.55 rillig */
1164 1.55 rillig //indent input
1165 1.55 rillig {
1166 1.55 rillig multi_line = (int[]){
1167 1.55 rillig {1
1168 1.55 rillig +1},
1169 1.55 rillig {1
1170 1.55 rillig +1},
1171 1.55 rillig {1
1172 1.55 rillig +1},
1173 1.55 rillig };
1174 1.55 rillig }
1175 1.55 rillig //indent end
1176 1.55 rillig
1177 1.55 rillig //indent run
1178 1.55 rillig {
1179 1.55 rillig multi_line = (int[]){
1180 1.55 rillig {1
1181 1.55 rillig + 1},
1182 1.55 rillig {1
1183 1.55 rillig + 1},
1184 1.55 rillig {1
1185 1.55 rillig + 1},
1186 1.55 rillig };
1187 1.55 rillig }
1188 1.55 rillig //indent end
1189