Home | History | Annotate | Line # | Download | only in indent
fmt_decl.c revision 1.35
      1  1.35  rillig /*	$NetBSD: fmt_decl.c,v 1.35 2022/04/24 09:04:12 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.1  rillig static const struct {
     59   1.1  rillig 	double		x;
     60   1.1  rillig 	double		y, z;
     61   1.1  rillig }		n[m + 1] =
     62   1.1  rillig {
     63   1.1  rillig 	{
     64   1.1  rillig 		.0,
     65   1.1  rillig 		.9,
     66   1.1  rillig 		5
     67   1.1  rillig 	}
     68   1.1  rillig };
     69  1.35  rillig //indent end
     70   1.1  rillig 
     71   1.1  rillig 
     72  1.35  rillig //indent input
     73   1.1  rillig typedef struct Complex
     74   1.1  rillig {
     75   1.1  rillig 	double		x;
     76   1.1  rillig 	double		y;
     77   1.1  rillig }	Complex;
     78  1.35  rillig //indent end
     79   1.1  rillig 
     80  1.35  rillig //indent run
     81   1.1  rillig typedef struct Complex {
     82   1.1  rillig 	double		x;
     83   1.1  rillig 	double		y;
     84   1.1  rillig }		Complex;
     85  1.35  rillig //indent end
     86   1.1  rillig 
     87   1.1  rillig 
     88   1.8  rillig /*
     89  1.13  rillig  * As of 2021-11-07, indent parses the following function definition as these
     90   1.8  rillig  * tokens:
     91   1.8  rillig  *
     92  1.13  rillig  * line 1: type_outside_parentheses "void"
     93   1.8  rillig  * line 1: newline "\n"
     94   1.8  rillig  * line 2: funcname "t1"
     95   1.8  rillig  * line 2: newline "\n"		repeated, see search_stmt
     96   1.8  rillig  * line 3: funcname "t1"	XXX: wrong line_no
     97   1.8  rillig  * line 3: lparen_or_lbracket "("
     98  1.13  rillig  * line 3: type_in_parentheses "char"
     99   1.8  rillig  * line 3: unary_op "*"
    100  1.13  rillig  * line 3: word "a"
    101   1.8  rillig  * line 3: comma ","
    102  1.13  rillig  * line 3: type_in_parentheses "int"
    103  1.13  rillig  * line 3: word "b"
    104   1.8  rillig  * line 3: comma ","
    105   1.8  rillig  * line 3: newline "\n"
    106  1.13  rillig  * line 4: type_in_parentheses "void"
    107   1.8  rillig  * line 4: lparen_or_lbracket "("
    108   1.8  rillig  * line 4: unary_op "*"
    109  1.13  rillig  * line 4: word "fn"
    110   1.8  rillig  * line 4: rparen_or_rbracket ")"
    111   1.8  rillig  * line 4: lparen_or_lbracket "("
    112  1.13  rillig  * line 4: type_in_parentheses "void"
    113   1.8  rillig  * line 4: rparen_or_rbracket ")"
    114   1.8  rillig  * line 4: rparen_or_rbracket ")"
    115   1.8  rillig  * line 4: newline "\n"
    116   1.8  rillig  * line 5: lbrace "{"
    117   1.8  rillig  * line 5: lbrace "{"		repeated, see search_stmt
    118   1.8  rillig  * line 5: newline "\n"		FIXME: there is no newline in the source
    119   1.8  rillig  * line 6: rbrace "}"
    120   1.8  rillig  * line 6: eof "\n"
    121   1.8  rillig  */
    122  1.35  rillig //indent input
    123   1.1  rillig void
    124   1.1  rillig t1 (char *a, int b,
    125   1.1  rillig 	void (*fn)(void))
    126   1.1  rillig {}
    127  1.35  rillig //indent end
    128   1.1  rillig 
    129  1.35  rillig //indent run
    130   1.1  rillig void
    131   1.1  rillig t1(char *a, int b,
    132   1.1  rillig    void (*fn)(void))
    133   1.1  rillig {
    134   1.1  rillig }
    135  1.35  rillig //indent end
    136   1.1  rillig 
    137   1.1  rillig 
    138  1.19  rillig /* See opt_bc.c. */
    139  1.35  rillig //indent input
    140   1.1  rillig void t2 (char *x, int y)
    141   1.1  rillig {
    142   1.1  rillig 	int a,
    143   1.1  rillig 	b,
    144   1.1  rillig 	c;
    145   1.1  rillig 	int
    146   1.1  rillig 	*d,
    147   1.1  rillig 	*e,
    148   1.1  rillig 	*f;
    149   1.1  rillig 	int (*g)(),
    150   1.1  rillig 	(*h)(),
    151   1.1  rillig 	(*i)();
    152   1.1  rillig 	int j,
    153   1.1  rillig 	k,
    154   1.1  rillig 	l;
    155   1.1  rillig 	int m
    156   1.1  rillig 	,n
    157   1.1  rillig 	,o
    158   1.1  rillig 	;
    159   1.1  rillig 	int		chars[ /* push the comma beyond column 74 .... */ ], x;
    160   1.1  rillig }
    161  1.35  rillig //indent end
    162   1.1  rillig 
    163  1.35  rillig //indent run
    164   1.1  rillig void
    165   1.1  rillig t2(char *x, int y)
    166   1.1  rillig {
    167   1.1  rillig 	int		a, b, c;
    168   1.1  rillig 	int
    169   1.1  rillig 		       *d, *e, *f;
    170   1.1  rillig 	int		(*g)(), (*h)(), (*i)();
    171   1.1  rillig 	int		j, k, l;
    172   1.1  rillig 	int		m
    173   1.1  rillig 		       ,n
    174   1.1  rillig 		       ,o
    175   1.1  rillig 		       ;
    176   1.1  rillig 	int		chars[ /* push the comma beyond column 74 .... */ ],
    177   1.1  rillig 			x;
    178   1.1  rillig }
    179  1.35  rillig //indent end
    180   1.1  rillig 
    181   1.1  rillig 
    182  1.35  rillig //indent input
    183   1.1  rillig const int	int_minimum_size =
    184   1.1  rillig MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF;
    185  1.35  rillig //indent end
    186   1.1  rillig 
    187  1.35  rillig //indent run-equals-input
    188   1.1  rillig 
    189   1.1  rillig 
    190  1.25  rillig /*
    191  1.25  rillig  * Ensure that the usual GCC-style function attributes are formatted in a
    192  1.25  rillig  * sensible way.
    193  1.25  rillig  */
    194  1.35  rillig //indent input
    195  1.25  rillig void function(const char *, ...) __attribute__((format(printf, 1, 2)));
    196  1.35  rillig //indent end
    197  1.25  rillig 
    198  1.25  rillig /* FIXME: missing space before '__attribute__' */
    199  1.35  rillig //indent run -di0
    200  1.25  rillig void function(const char *, ...)__attribute__((format(printf, 1, 2)));
    201  1.35  rillig //indent end
    202  1.25  rillig 
    203  1.25  rillig /* FIXME: missing space before '__attribute__' */
    204  1.35  rillig //indent run
    205  1.25  rillig void		function(const char *, ...)__attribute__((format(printf, 1, 2)));
    206  1.35  rillig //indent end
    207  1.25  rillig 
    208  1.25  rillig 
    209  1.35  rillig //indent input
    210   1.1  rillig static
    211   1.1  rillig _attribute_printf(1, 2)
    212   1.1  rillig void
    213   1.1  rillig print_error(const char *fmt,...)
    214   1.1  rillig {
    215   1.1  rillig }
    216  1.35  rillig //indent end
    217   1.1  rillig 
    218  1.35  rillig //indent run
    219   1.1  rillig static
    220   1.1  rillig _attribute_printf(1, 2)
    221   1.1  rillig void
    222   1.1  rillig print_error(const char *fmt, ...)
    223   1.1  rillig {
    224   1.2  rillig }
    225  1.35  rillig //indent end
    226   1.2  rillig 
    227   1.2  rillig 
    228  1.35  rillig //indent input
    229   1.2  rillig static _attribute_printf(1, 2)
    230   1.2  rillig void
    231   1.2  rillig print_error(const char *fmt,...)
    232   1.2  rillig {
    233   1.2  rillig }
    234  1.35  rillig //indent end
    235   1.1  rillig 
    236  1.35  rillig //indent run
    237   1.2  rillig static _attribute_printf(1, 2)
    238   1.2  rillig void
    239   1.2  rillig print_error(const char *fmt, ...)
    240   1.2  rillig {
    241   1.2  rillig }
    242  1.35  rillig //indent end
    243   1.2  rillig 
    244   1.2  rillig 
    245  1.35  rillig //indent input
    246   1.2  rillig static void _attribute_printf(1, 2)
    247   1.2  rillig print_error(const char *fmt,...)
    248   1.2  rillig {
    249   1.2  rillig }
    250  1.35  rillig //indent end
    251   1.2  rillig 
    252  1.35  rillig //indent run
    253   1.2  rillig static void
    254   1.2  rillig _attribute_printf(1, 2)
    255   1.2  rillig print_error(const char *fmt, ...)
    256   1.2  rillig {
    257   1.1  rillig }
    258  1.35  rillig //indent end
    259   1.1  rillig 
    260   1.1  rillig 
    261   1.3  rillig /* See FreeBSD r309380 */
    262  1.35  rillig //indent input
    263   1.1  rillig static LIST_HEAD(, alq) ald_active;
    264  1.19  rillig static int ald_shutting_down = 0;
    265   1.1  rillig struct thread *ald_thread;
    266  1.35  rillig //indent end
    267   1.1  rillig 
    268  1.35  rillig //indent run
    269   1.1  rillig static LIST_HEAD(, alq) ald_active;
    270  1.19  rillig static int	ald_shutting_down = 0;
    271   1.1  rillig struct thread  *ald_thread;
    272  1.35  rillig //indent end
    273   1.1  rillig 
    274   1.1  rillig 
    275  1.35  rillig //indent input
    276   1.1  rillig static int
    277   1.2  rillig old_style_definition(a, b, c)
    278   1.2  rillig 	struct thread *a;
    279   1.2  rillig 	int b;
    280   1.2  rillig 	double ***c;
    281   1.1  rillig {
    282   1.1  rillig 
    283   1.1  rillig }
    284  1.35  rillig //indent end
    285   1.1  rillig 
    286  1.35  rillig //indent run
    287   1.1  rillig static int
    288   1.2  rillig old_style_definition(a, b, c)
    289   1.2  rillig 	struct thread  *a;
    290   1.2  rillig 	int		b;
    291   1.2  rillig 	double	     ***c;
    292   1.1  rillig {
    293   1.1  rillig 
    294   1.1  rillig }
    295  1.35  rillig //indent end
    296   1.1  rillig 
    297   1.1  rillig 
    298   1.1  rillig /*
    299   1.1  rillig  * Demonstrate how variable declarations are broken into several lines when
    300   1.1  rillig  * the line length limit is set quite low.
    301   1.1  rillig  */
    302  1.35  rillig //indent input
    303   1.7  rillig struct s a,b;
    304   1.1  rillig struct s0 a,b;
    305   1.1  rillig struct s01 a,b;
    306   1.1  rillig struct s012 a,b;
    307   1.1  rillig struct s0123 a,b;
    308   1.1  rillig struct s01234 a,b;
    309   1.1  rillig struct s012345 a,b;
    310   1.1  rillig struct s0123456 a,b;
    311   1.1  rillig struct s01234567 a,b;
    312   1.1  rillig struct s012345678 a,b;
    313   1.1  rillig struct s0123456789 a,b;
    314   1.1  rillig struct s01234567890 a,b;
    315   1.1  rillig struct s012345678901 a,b;
    316   1.1  rillig struct s0123456789012 a,b;
    317   1.1  rillig struct s01234567890123 a,b;
    318  1.35  rillig //indent end
    319   1.1  rillig 
    320  1.35  rillig //indent run -l20 -di0
    321   1.7  rillig struct s a, b;
    322   1.7  rillig /* $ XXX: See process_comma, varname_len for why this line is broken. */
    323   1.1  rillig struct s0 a,
    324   1.1  rillig    b;
    325   1.7  rillig /* $ XXX: The indentation of the second line is wrong. The variable names */
    326   1.7  rillig /* $ XXX: 'a' and 'b' should be in the same column; the word 'struct' is */
    327   1.7  rillig /* $ XXX: missing in the calculation for the indentation. */
    328   1.1  rillig struct s01 a,
    329   1.1  rillig     b;
    330   1.1  rillig struct s012 a,
    331   1.1  rillig      b;
    332   1.1  rillig struct s0123 a,
    333   1.1  rillig       b;
    334   1.1  rillig struct s01234 a,
    335   1.1  rillig        b;
    336   1.1  rillig struct s012345 a,
    337   1.1  rillig         b;
    338   1.1  rillig struct s0123456 a,
    339   1.1  rillig          b;
    340   1.1  rillig struct s01234567 a,
    341   1.1  rillig           b;
    342   1.1  rillig struct s012345678 a,
    343   1.1  rillig            b;
    344   1.1  rillig struct s0123456789 a,
    345   1.1  rillig             b;
    346   1.1  rillig struct s01234567890 a,
    347   1.1  rillig              b;
    348   1.1  rillig struct s012345678901 a,
    349   1.1  rillig               b;
    350   1.1  rillig struct s0123456789012 a,
    351   1.1  rillig                b;
    352   1.1  rillig struct s01234567890123 a,
    353   1.1  rillig                 b;
    354  1.35  rillig //indent end
    355   1.2  rillig 
    356   1.2  rillig 
    357  1.35  rillig //indent input
    358   1.2  rillig char * x(void)
    359   1.2  rillig {
    360   1.2  rillig     type identifier;
    361   1.2  rillig     type *pointer;
    362   1.2  rillig     unused * value;
    363   1.2  rillig     (void)unused * value;
    364   1.2  rillig 
    365   1.2  rillig     dmax = (double)3 * 10.0;
    366   1.2  rillig     dmin = (double)dmax * 10.0;
    367   1.2  rillig     davg = (double)dmax * dmin;
    368   1.2  rillig 
    369   1.2  rillig     return NULL;
    370   1.2  rillig }
    371  1.35  rillig //indent end
    372   1.2  rillig 
    373  1.35  rillig //indent run
    374   1.2  rillig char *
    375   1.2  rillig x(void)
    376   1.2  rillig {
    377   1.2  rillig 	type		identifier;
    378   1.2  rillig 	type	       *pointer;
    379   1.2  rillig 	unused	       *value;
    380   1.2  rillig 	(void)unused * value;
    381   1.2  rillig 
    382   1.2  rillig 	dmax = (double)3 * 10.0;
    383   1.2  rillig 	dmin = (double)dmax * 10.0;
    384   1.2  rillig 	davg = (double)dmax * dmin;
    385   1.2  rillig 
    386   1.2  rillig 	return NULL;
    387   1.2  rillig }
    388  1.35  rillig //indent end
    389   1.2  rillig 
    390  1.21  rillig 
    391  1.35  rillig //indent input
    392   1.2  rillig int *
    393   1.2  rillig y(void) {
    394   1.2  rillig 
    395   1.2  rillig }
    396   1.2  rillig 
    397   1.2  rillig int
    398   1.2  rillig z(void) {
    399   1.2  rillig 
    400   1.2  rillig }
    401  1.35  rillig //indent end
    402   1.2  rillig 
    403  1.35  rillig //indent run
    404   1.2  rillig int *
    405   1.2  rillig y(void)
    406   1.2  rillig {
    407   1.2  rillig 
    408   1.2  rillig }
    409   1.2  rillig 
    410   1.2  rillig int
    411   1.2  rillig z(void)
    412   1.2  rillig {
    413   1.2  rillig 
    414   1.2  rillig }
    415  1.35  rillig //indent end
    416   1.2  rillig 
    417   1.2  rillig 
    418  1.35  rillig //indent input
    419   1.2  rillig int x;
    420   1.2  rillig int *y;
    421   1.2  rillig int * * * * z;
    422  1.35  rillig //indent end
    423   1.2  rillig 
    424  1.35  rillig //indent run
    425   1.2  rillig int		x;
    426   1.2  rillig int	       *y;
    427   1.2  rillig int	    ****z;
    428  1.35  rillig //indent end
    429   1.4  rillig 
    430   1.4  rillig 
    431  1.35  rillig //indent input
    432   1.4  rillig int main(void) {
    433   1.4  rillig     char (*f1)() = NULL;
    434   1.4  rillig     char *(*f1)() = NULL;
    435   1.4  rillig     char *(*f2)();
    436   1.4  rillig }
    437  1.35  rillig //indent end
    438   1.4  rillig 
    439   1.6  rillig /*
    440   1.6  rillig  * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
    441   1.6  rillig  * and third variable declaration in column 1. This bug has been introduced
    442   1.6  rillig  * to NetBSD when FreeBSD indent was imported in 2019.
    443   1.6  rillig  */
    444  1.35  rillig //indent run -ldi0
    445   1.4  rillig int
    446   1.4  rillig main(void)
    447   1.4  rillig {
    448   1.4  rillig 	char (*f1)() = NULL;
    449   1.6  rillig 	char *(*f1)() = NULL;
    450   1.6  rillig 	char *(*f2)();
    451   1.4  rillig }
    452  1.35  rillig //indent end
    453   1.5  rillig 
    454  1.35  rillig //indent run
    455   1.5  rillig int
    456   1.5  rillig main(void)
    457   1.5  rillig {
    458   1.5  rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
    459   1.5  rillig 	char		(*f1)() = NULL;
    460   1.5  rillig /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
    461   1.6  rillig 	char *(*	f1)() = NULL;
    462   1.5  rillig /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
    463   1.6  rillig 	char *(*	f2)();
    464   1.5  rillig }
    465  1.35  rillig //indent end
    466  1.10  rillig 
    467  1.10  rillig 
    468  1.10  rillig /*
    469  1.10  rillig  * In some ancient time long before ISO C90, variable declarations with
    470  1.10  rillig  * initializer could be written without '='. The C Programming Language from
    471  1.10  rillig  * 1978 doesn't mention this form anymore.
    472  1.18  rillig  *
    473  1.18  rillig  * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a
    474  1.18  rillig  * unary operator.
    475  1.10  rillig  */
    476  1.35  rillig //indent input
    477  1.10  rillig int a - 1;
    478  1.10  rillig {
    479  1.10  rillig int a - 1;
    480  1.10  rillig }
    481  1.35  rillig //indent end
    482  1.10  rillig 
    483  1.35  rillig //indent run -di0
    484  1.11  rillig int a - 1;
    485  1.10  rillig {
    486  1.11  rillig 	int a - 1;
    487  1.10  rillig }
    488  1.35  rillig //indent end
    489  1.14  rillig 
    490  1.14  rillig 
    491  1.14  rillig /*
    492  1.20  rillig  * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-19, the indentation
    493  1.18  rillig  * of the '*' depended on the function name, which did not make sense.  For
    494  1.18  rillig  * function names that matched [A-Za-z]+, the '*' was placed correctly, for
    495  1.18  rillig  * all other function names (containing [$0-9_]) the '*' was right-aligned on
    496  1.20  rillig  * the declaration indentation, which defaults to 16.
    497  1.14  rillig  */
    498  1.35  rillig //indent input
    499  1.14  rillig int *
    500  1.14  rillig f2(void)
    501  1.14  rillig {
    502  1.14  rillig }
    503  1.14  rillig 
    504  1.14  rillig int *
    505  1.14  rillig yy(void)
    506  1.14  rillig {
    507  1.14  rillig }
    508  1.14  rillig 
    509  1.14  rillig int *
    510  1.18  rillig int_create(void)
    511  1.14  rillig {
    512  1.14  rillig }
    513  1.35  rillig //indent end
    514  1.15  rillig 
    515  1.35  rillig //indent run-equals-input
    516  1.18  rillig 
    517  1.15  rillig 
    518  1.15  rillig /*
    519  1.15  rillig  * Since 2019-04-04, the space between the '){' is missing.
    520  1.15  rillig  */
    521  1.35  rillig //indent input
    522  1.15  rillig int *
    523  1.15  rillig function_name_____20________30________40________50
    524  1.15  rillig (void)
    525  1.15  rillig {}
    526  1.35  rillig //indent end
    527  1.15  rillig 
    528  1.15  rillig /* FIXME: The space between '){' is missing. */
    529  1.35  rillig //indent run
    530  1.15  rillig int	       *function_name_____20________30________40________50
    531  1.15  rillig 		(void){
    532  1.15  rillig }
    533  1.35  rillig //indent end
    534  1.15  rillig 
    535  1.15  rillig 
    536  1.15  rillig /*
    537  1.17  rillig  * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function
    538  1.17  rillig  * names were preserved while others were silently discarded.
    539  1.15  rillig  */
    540  1.35  rillig //indent input
    541  1.15  rillig int *
    542  1.15  rillig aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    543  1.15  rillig (void)
    544  1.15  rillig {}
    545  1.35  rillig //indent end
    546  1.15  rillig 
    547  1.35  rillig //indent run
    548  1.16  rillig int	       *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    549  1.16  rillig 		(void){
    550  1.15  rillig }
    551  1.35  rillig //indent end
    552  1.22  rillig 
    553  1.22  rillig 
    554  1.22  rillig /*
    555  1.22  rillig  * Before 1990, when C90 standardized function prototypes, a function
    556  1.22  rillig  * declaration or definition did not contain a '*' that may have looked
    557  1.22  rillig  * similar to the binary operator '*' because it was surrounded by two
    558  1.22  rillig  * identifiers.
    559  1.22  rillig  *
    560  1.26  rillig  * As of 2021-11-21, indent interpreted the '*' in the function declaration in
    561  1.26  rillig  * line 1 as a binary operator, even though the '*' was followed by a ','
    562  1.26  rillig  * directly. This was not visible in the output though since indent never
    563  1.26  rillig  * outputs a space before a comma.
    564  1.22  rillig  *
    565  1.26  rillig  * In the function declaration in line 2 and the function definition in line
    566  1.26  rillig  * 5, indent interpreted the '*' as a binary operator as well and accordingly
    567  1.26  rillig  * placed spaces around the '*'. On a very low syntactical analysis level,
    568  1.26  rillig  * this may have made sense since the '*' was surrounded by words, but still
    569  1.26  rillig  * the '*' is part of a declaration, where a binary operator does not make
    570  1.26  rillig  * sense.
    571  1.26  rillig  *
    572  1.26  rillig  * Essentially, as of 2021, indent had missed the last 31 years of advances in
    573  1.26  rillig  * the C programming language, in particular the invention of function
    574  1.26  rillig  * prototypes. Instead, the workaround had been to require all type names to
    575  1.26  rillig  * be specified via the options '-ta' and '-T'. This put the burden on the
    576  1.26  rillig  * user instead of the implementer.
    577  1.26  rillig  *
    578  1.26  rillig  * Fixed in lexi.c 1.156 from 2021-11-25.
    579  1.22  rillig  */
    580  1.35  rillig //indent input
    581  1.22  rillig void		buffer_add(buffer *, char);
    582  1.22  rillig void		buffer_add(buffer *buf, char ch);
    583  1.22  rillig 
    584  1.22  rillig void
    585  1.22  rillig buffer_add(buffer *buf, char ch)
    586  1.22  rillig {
    587  1.22  rillig 	*buf->e++ = ch;
    588  1.22  rillig }
    589  1.35  rillig //indent end
    590  1.22  rillig 
    591  1.26  rillig /* Before lexi.c 1.156 from 2021-11-25, indent generated 'buffer * buf'. */
    592  1.35  rillig //indent run
    593  1.29  rillig void		buffer_add(buffer *, char);
    594  1.29  rillig /* $ FIXME: space after '*' */
    595  1.29  rillig void		buffer_add(buffer * buf, char ch);
    596  1.29  rillig 
    597  1.29  rillig void
    598  1.29  rillig buffer_add(buffer *buf, char ch)
    599  1.29  rillig {
    600  1.29  rillig 	*buf->e++ = ch;
    601  1.29  rillig }
    602  1.35  rillig //indent end
    603  1.23  rillig 
    604  1.23  rillig 
    605  1.23  rillig /*
    606  1.23  rillig  * Indent gets easily confused by type names it does not know about.
    607  1.23  rillig  */
    608  1.35  rillig //indent input
    609  1.23  rillig static Token
    610  1.23  rillig ToToken(bool cond)
    611  1.23  rillig {
    612  1.23  rillig }
    613  1.35  rillig //indent end
    614  1.23  rillig 
    615  1.35  rillig //indent run-equals-input -TToken
    616  1.34  rillig 
    617  1.24  rillig /* Since lexi.c 1.153 from 2021-11-25. */
    618  1.35  rillig //indent run-equals-input
    619  1.23  rillig 
    620  1.23  rillig 
    621  1.23  rillig /*
    622  1.23  rillig  * Indent gets easily confused by unknown type names in struct declarations.
    623  1.23  rillig  */
    624  1.35  rillig //indent input
    625  1.23  rillig typedef struct OpenDirs {
    626  1.23  rillig 	CachedDirList	list;
    627  1.23  rillig 	HashTable /* of CachedDirListNode */ table;
    628  1.23  rillig }		OpenDirs;
    629  1.35  rillig //indent end
    630  1.23  rillig 
    631  1.23  rillig /* FIXME: The word 'HashTable' must not be aligned like a member name. */
    632  1.35  rillig //indent run
    633  1.23  rillig typedef struct OpenDirs {
    634  1.23  rillig 	CachedDirList	list;
    635  1.23  rillig 			HashTable /* of CachedDirListNode */ table;
    636  1.23  rillig }		OpenDirs;
    637  1.35  rillig //indent end
    638  1.23  rillig 
    639  1.35  rillig //indent run-equals-input -THashTable
    640  1.23  rillig 
    641  1.23  rillig 
    642  1.23  rillig /*
    643  1.23  rillig  * Indent gets easily confused by unknown type names, even in declarations
    644  1.23  rillig  * that are syntactically unambiguous.
    645  1.23  rillig  */
    646  1.35  rillig //indent input
    647  1.23  rillig static CachedDir *dot = NULL;
    648  1.35  rillig //indent end
    649  1.23  rillig 
    650  1.35  rillig //indent run-equals-input -TCachedDir
    651  1.34  rillig 
    652  1.24  rillig /* Since lexi.c 1.153 from 2021-11-25. */
    653  1.35  rillig //indent run-equals-input
    654  1.23  rillig 
    655  1.23  rillig 
    656  1.23  rillig /*
    657  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
    658  1.26  rillig  * type names in declarations and generated 'HashEntry * he' with an extra
    659  1.26  rillig  * space.
    660  1.23  rillig  */
    661  1.35  rillig //indent input
    662  1.23  rillig static CachedDir *
    663  1.23  rillig CachedDir_New(const char *name)
    664  1.23  rillig {
    665  1.23  rillig }
    666  1.35  rillig //indent end
    667  1.23  rillig 
    668  1.24  rillig /* Since lexi.c 1.153 from 2021-11-25. */
    669  1.35  rillig //indent run-equals-input
    670  1.23  rillig 
    671  1.23  rillig 
    672  1.23  rillig /*
    673  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
    674  1.26  rillig  * type names in declarations and generated 'CachedDir * dir' with an extra
    675  1.26  rillig  * space.
    676  1.23  rillig  */
    677  1.35  rillig //indent input
    678  1.23  rillig static CachedDir *
    679  1.23  rillig CachedDir_Ref(CachedDir *dir)
    680  1.23  rillig {
    681  1.23  rillig }
    682  1.35  rillig //indent end
    683  1.23  rillig 
    684  1.35  rillig //indent run-equals-input
    685  1.23  rillig 
    686  1.23  rillig 
    687  1.23  rillig /*
    688  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
    689  1.26  rillig  * type names in declarations and generated 'HashEntry * he' with an extra
    690  1.26  rillig  * space.
    691  1.26  rillig  *
    692  1.26  rillig  * Before lexi.c 1.153 from 2021-11-25, indent also placed the '{' at the end
    693  1.26  rillig  * of the line.
    694  1.23  rillig  */
    695  1.35  rillig //indent input
    696  1.23  rillig static bool
    697  1.23  rillig HashEntry_KeyEquals(const HashEntry *he, Substring key)
    698  1.23  rillig {
    699  1.23  rillig }
    700  1.35  rillig //indent end
    701  1.23  rillig 
    702  1.35  rillig //indent run-equals-input
    703  1.23  rillig 
    704  1.23  rillig 
    705  1.23  rillig /*
    706  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent didn't notice that the two '*'
    707  1.26  rillig  * are in a declaration, instead it interpreted the first '*' as a binary
    708  1.26  rillig  * operator, therefore generating 'CachedDir * *var' with an extra space.
    709  1.23  rillig  */
    710  1.35  rillig //indent input
    711  1.23  rillig static void
    712  1.23  rillig CachedDir_Assign(CachedDir **var, CachedDir *dir)
    713  1.23  rillig {
    714  1.23  rillig }
    715  1.35  rillig //indent end
    716  1.23  rillig 
    717  1.35  rillig //indent run-equals-input
    718  1.34  rillig 
    719  1.35  rillig //indent run-equals-input -TCachedDir
    720  1.23  rillig 
    721  1.23  rillig 
    722  1.23  rillig /*
    723  1.24  rillig  * Before lexi.c 1.153 from 2021-11-25, all initializer expressions after the
    724  1.24  rillig  * first one were indented as if they would be statement continuations. This
    725  1.24  rillig  * was because the token 'Shell' was identified as a word, not as a type name.
    726  1.23  rillig  */
    727  1.35  rillig //indent input
    728  1.24  rillig static Shell	shells[] = {
    729  1.23  rillig 	{
    730  1.23  rillig 		first,
    731  1.23  rillig 		second,
    732  1.23  rillig 	},
    733  1.23  rillig };
    734  1.35  rillig //indent end
    735  1.23  rillig 
    736  1.24  rillig /* Since lexi.c 1.153 from 2021-11-25. */
    737  1.35  rillig //indent run-equals-input
    738  1.23  rillig 
    739  1.23  rillig 
    740  1.23  rillig /*
    741  1.27  rillig  * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by function
    742  1.27  rillig  * attribute macros that followed the function declaration. Its primitive
    743  1.27  rillig  * heuristic between deciding between a function declaration and a function
    744  1.27  rillig  * definition only looked for ')' immediately followed by ',' or ';'. This was
    745  1.27  rillig  * sufficient for well-formatted code before 1990. With the addition of
    746  1.27  rillig  * function prototypes and GCC attributes, the situation became more
    747  1.27  rillig  * complicated, and it took indent 31 years to adapt to this new reality.
    748  1.23  rillig  */
    749  1.35  rillig //indent input
    750  1.23  rillig static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
    751  1.23  rillig static void JobRestartJobs(void);
    752  1.35  rillig //indent end
    753  1.23  rillig 
    754  1.35  rillig //indent run
    755  1.23  rillig /* $ FIXME: Missing space before 'MAKE_ATTR_DEAD'. */
    756  1.27  rillig static void	JobInterrupt(bool, int)MAKE_ATTR_DEAD;
    757  1.27  rillig static void	JobRestartJobs(void);
    758  1.35  rillig //indent end
    759  1.23  rillig 
    760  1.23  rillig 
    761  1.23  rillig /*
    762  1.27  rillig  * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by the
    763  1.27  rillig  * tokens ')' and ';' in the function body. It wrongly regarded them as
    764  1.27  rillig  * finishing a function declaration.
    765  1.23  rillig  */
    766  1.35  rillig //indent input
    767  1.23  rillig MAKE_INLINE const char *
    768  1.23  rillig GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); }
    769  1.35  rillig //indent end
    770  1.23  rillig 
    771  1.26  rillig /*
    772  1.26  rillig  * Before lexi.c 1.156 from 2021-11-25, indent generated 'GNode * gn' with an
    773  1.26  rillig  * extra space.
    774  1.27  rillig  *
    775  1.27  rillig  * Before lexi.c 1.158 from 2021-11-25, indent wrongly placed the function
    776  1.27  rillig  * name in line 1, together with the '{'.
    777  1.26  rillig  */
    778  1.35  rillig //indent run
    779  1.27  rillig MAKE_INLINE const char *
    780  1.27  rillig GNode_VarTarget(GNode *gn)
    781  1.27  rillig {
    782  1.23  rillig 	return GNode_ValueDirect(gn, TARGET);
    783  1.23  rillig }
    784  1.35  rillig //indent end
    785  1.23  rillig 
    786  1.35  rillig //indent run-equals-prev-output -TGNode
    787  1.25  rillig 
    788  1.25  rillig 
    789  1.25  rillig /*
    790  1.25  rillig  * Ensure that '*' in declarations is interpreted (or at least formatted) as
    791  1.25  rillig  * a 'pointer to' type derivation, not as a binary or unary operator.
    792  1.25  rillig  */
    793  1.35  rillig //indent input
    794  1.25  rillig number *var = a * b;
    795  1.25  rillig 
    796  1.25  rillig void
    797  1.25  rillig function(void)
    798  1.25  rillig {
    799  1.25  rillig 	number *var = a * b;
    800  1.25  rillig }
    801  1.35  rillig //indent end
    802  1.25  rillig 
    803  1.35  rillig //indent run-equals-input -di0
    804  1.28  rillig 
    805  1.28  rillig 
    806  1.28  rillig /*
    807  1.28  rillig  * In declarations, most occurrences of '*' are pointer type derivations.
    808  1.29  rillig  * There are a few exceptions though. Some of these are hard to detect
    809  1.29  rillig  * without knowing which identifiers are type names.
    810  1.28  rillig  */
    811  1.35  rillig //indent input
    812  1.28  rillig char str[expr * expr];
    813  1.28  rillig char str[expr**ptr];
    814  1.28  rillig char str[*ptr**ptr];
    815  1.28  rillig char str[sizeof(expr * expr)];
    816  1.28  rillig char str[sizeof(int) * expr];
    817  1.28  rillig char str[sizeof(*ptr)];
    818  1.28  rillig char str[sizeof(type**)];
    819  1.28  rillig char str[sizeof(**ptr)];
    820  1.35  rillig //indent end
    821  1.28  rillig 
    822  1.35  rillig //indent run -di0
    823  1.29  rillig char str[expr * expr];
    824  1.29  rillig char str[expr * *ptr];
    825  1.29  rillig char str[*ptr * *ptr];
    826  1.29  rillig char str[sizeof(expr * expr)];
    827  1.29  rillig char str[sizeof(int) * expr];
    828  1.28  rillig char str[sizeof(*ptr)];
    829  1.29  rillig /* $ FIXME: should be 'type **' */
    830  1.29  rillig char str[sizeof(type * *)];
    831  1.28  rillig char str[sizeof(**ptr)];
    832  1.35  rillig //indent end
    833  1.31  rillig 
    834  1.31  rillig 
    835  1.31  rillig /*
    836  1.32  rillig  * Since lexi.c 1.158 from 2021-11-25, whether the function 'a' was considered
    837  1.32  rillig  * a declaration or a definition depended on the preceding struct, in
    838  1.32  rillig  * particular the length of the 'pn' line. This didn't make sense at all and
    839  1.32  rillig  * was due to an out-of-bounds memory access.
    840  1.31  rillig  *
    841  1.31  rillig  * Seen amongst others in args.c 1.72, function add_typedefs_from_file.
    842  1.32  rillig  * Fixed in lexi.c 1.165 from 2021-11-27.
    843  1.31  rillig  */
    844  1.35  rillig //indent input
    845  1.31  rillig struct {
    846  1.31  rillig } v = {
    847  1.31  rillig     pn("ta"),
    848  1.31  rillig };
    849  1.31  rillig 
    850  1.31  rillig static void
    851  1.31  rillig a(char *fe)
    852  1.31  rillig {
    853  1.31  rillig }
    854  1.31  rillig 
    855  1.31  rillig struct {
    856  1.31  rillig } v = {
    857  1.31  rillig     pn("t"),
    858  1.31  rillig };
    859  1.31  rillig 
    860  1.31  rillig static void
    861  1.31  rillig a(char *fe)
    862  1.31  rillig {
    863  1.31  rillig }
    864  1.35  rillig //indent end
    865  1.31  rillig 
    866  1.35  rillig //indent run -di0
    867  1.31  rillig struct {
    868  1.31  rillig } v = {
    869  1.31  rillig 	pn("ta"),
    870  1.31  rillig };
    871  1.31  rillig 
    872  1.31  rillig static void
    873  1.32  rillig a(char *fe)
    874  1.32  rillig {
    875  1.31  rillig }
    876  1.31  rillig 
    877  1.31  rillig struct {
    878  1.31  rillig } v = {
    879  1.31  rillig 	pn("t"),
    880  1.31  rillig };
    881  1.31  rillig 
    882  1.31  rillig static void
    883  1.31  rillig a(char *fe)
    884  1.31  rillig {
    885  1.31  rillig }
    886  1.35  rillig //indent end
    887