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