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