Home | History | Annotate | Line # | Download | only in indent
      1  1.25  rillig /* $NetBSD: lsym_comment.c,v 1.25 2025/01/03 23:37:18 rillig Exp $ */
      2   1.1  rillig 
      3   1.1  rillig /*
      4   1.1  rillig  * Tests for the token lsym_comment, which starts a comment.
      5   1.1  rillig  *
      6   1.1  rillig  * C11 distinguishes block comments and end-of-line comments.  Indent further
      7   1.1  rillig  * distinguishes box comments that are a special kind of block comments.
      8   1.1  rillig  *
      9   1.1  rillig  * See also:
     10   1.1  rillig  *	opt_fc1.c
     11  1.15  rillig  *	lsym_comment.c
     12   1.1  rillig  */
     13   1.1  rillig 
     14   1.4  rillig /*-
     15   1.4  rillig  * TODO: systematically test comments
     16   1.4  rillig  *
     17   1.4  rillig  * - starting in column 1, with opt.format_col1_comments (-fc1)
     18   1.4  rillig  * - starting in column 1, without opt.format_col1_comments (-fc1)
     19   1.4  rillig  * - starting in column 9, independent of opt.format_col1_comments (-fc1)
     20   1.4  rillig  * - starting in column 33, the default
     21   1.4  rillig  * - starting in column 65, which is already close to the default right margin
     22   1.4  rillig  * - starting in column 81, spilling into the right margin
     23   1.4  rillig  *
     24   1.4  rillig  * - block comment starting with '/' '*' '-'
     25   1.4  rillig  * - block comment starting with '/' '*' '*'
     26   1.4  rillig  * - block comment starting with '/' '*' '\n'
     27   1.4  rillig  * - end-of-line comment starting with '//'
     28   1.4  rillig  * - end-of-line comment starting with '//x', so without leading space
     29   1.4  rillig  * - block comment starting with '/' '*' 'x', so without leading space
     30   1.4  rillig  *
     31   1.4  rillig  * - block/end-of-line comment to the right of a label
     32   1.4  rillig  * - block/end-of-line comment to the right of code
     33   1.4  rillig  * - block/end-of-line comment to the right of label with code
     34   1.4  rillig  *
     35  1.20  rillig  * - with/without opt.comment_delimiter_on_blank_line (-cdb)
     36   1.4  rillig  * - with/without opt.star_comment_cont (-sc)
     37   1.4  rillig  * - with/without opt.format_block_comments (-fbc)
     38   1.4  rillig  * - with varying opt.max_line_length (32, 64, 80, 140)
     39   1.4  rillig  * - with varying opt.unindent_displace (-d0, -d2, -d-5)
     40   1.4  rillig  * - with varying opt.indent_size (3, 4, 8)
     41   1.4  rillig  * - with varying opt.tabsize (3, 4, 8, 16)
     42   1.4  rillig  * - with varying opt.block_comment_max_line_length (-lc60, -lc78, -lc90)
     43   1.4  rillig  * - with varying opt.comment_column (-c0, -c1, -c33, -c80)
     44   1.4  rillig  * - with varying opt.decl_comment_column (-cd0, -cd1, -cd20, -cd33, -cd80)
     45  1.19  rillig  * - with/without ps.line_has_decl
     46   1.4  rillig  *
     47   1.4  rillig  * - very long comments that overflow the buffer 'com'
     48   1.4  rillig  * - comments that come from save_com
     49   1.4  rillig  * - very long word that already spills over the right margin
     50   1.4  rillig  * - wrap/nowrap comment containing '\n'
     51   1.4  rillig  * - wrap/nowrap comment containing '\f'
     52   1.4  rillig  * - wrap/nowrap comment containing '\t'
     53   1.4  rillig  */
     54   1.4  rillig 
     55   1.4  rillig //indent input
     56   1.4  rillig typedef enum x {
     57   1.4  rillig 	aaaaaaaaaaaaaaaaaaaaaa = 1 << 0,	/* test a */
     58   1.4  rillig 	bbbbbbbbbbbbbbbbb = 1 << 1,	/* test b */
     59   1.4  rillig 	cccccccccccccc = 1 << 1,	/* test c */
     60   1.4  rillig 	dddddddddddddddddddddddddddddd = 1 << 2	/* test d */
     61   1.4  rillig } x;
     62   1.4  rillig //indent end
     63   1.4  rillig 
     64   1.4  rillig //indent run-equals-input -bbb
     65   1.4  rillig 
     66   1.4  rillig 
     67   1.4  rillig //indent input
     68   1.4  rillig /* See FreeBSD r303597, r303598, r309219, and r309343 */
     69   1.4  rillig void
     70   1.4  rillig t(void) {
     71   1.4  rillig 	/*
     72   1.4  rillig 	 * Old indent wrapped the URL near where this sentence ends.
     73   1.4  rillig 	 *
     74   1.4  rillig 	 * https://www.freebsd.org/cgi/man.cgi?query=indent&apropos=0&sektion=0&manpath=FreeBSD+12-current&arch=default&format=html
     75   1.4  rillig 	 */
     76   1.4  rillig 
     77   1.4  rillig 	/*
     78   1.4  rillig 	 * The default maximum line length for comments is 78, and the 'kk' at
     79   1.4  rillig 	 * the end makes the line exactly 78 bytes long.
     80   1.4  rillig 	 *
     81   1.4  rillig 	 * aaaaaa bbbbbb cccccc dddddd eeeeee ffffff ggggg hhhhh iiiii jjjj kk
     82   1.4  rillig 	 */
     83   1.4  rillig 
     84   1.4  rillig 	/*
     85   1.4  rillig 	 * Old indent unnecessarily removed the star comment continuation on the next line.
     86   1.4  rillig 	 *
     87   1.4  rillig 	 * *test*
     88   1.4  rillig 	 */
     89   1.4  rillig 
     90   1.4  rillig 	/* r309219 Go through linked list, freeing from the malloced (t[-1]) address. */
     91   1.4  rillig 
     92   1.4  rillig 	/* r309343	*/
     93   1.4  rillig }
     94   1.4  rillig //indent end
     95   1.4  rillig 
     96   1.4  rillig //indent run -bbb
     97   1.4  rillig /* See FreeBSD r303597, r303598, r309219, and r309343 */
     98   1.4  rillig void
     99   1.4  rillig t(void)
    100   1.4  rillig {
    101  1.14  rillig 
    102   1.4  rillig 	/*
    103   1.4  rillig 	 * Old indent wrapped the URL near where this sentence ends.
    104   1.4  rillig 	 *
    105   1.4  rillig 	 * https://www.freebsd.org/cgi/man.cgi?query=indent&apropos=0&sektion=0&manpath=FreeBSD+12-current&arch=default&format=html
    106   1.4  rillig 	 */
    107   1.4  rillig 
    108   1.4  rillig 	/*
    109   1.4  rillig 	 * The default maximum line length for comments is 78, and the 'kk' at
    110   1.4  rillig 	 * the end makes the line exactly 78 bytes long.
    111   1.4  rillig 	 *
    112   1.4  rillig 	 * aaaaaa bbbbbb cccccc dddddd eeeeee ffffff ggggg hhhhh iiiii jjjj kk
    113   1.4  rillig 	 */
    114   1.4  rillig 
    115   1.4  rillig 	/*
    116   1.4  rillig 	 * Old indent unnecessarily removed the star comment continuation on
    117   1.4  rillig 	 * the next line.
    118   1.4  rillig 	 *
    119   1.4  rillig 	 * *test*
    120   1.4  rillig 	 */
    121   1.4  rillig 
    122   1.4  rillig 	/*
    123   1.4  rillig 	 * r309219 Go through linked list, freeing from the malloced (t[-1])
    124   1.4  rillig 	 * address.
    125   1.4  rillig 	 */
    126   1.4  rillig 
    127   1.4  rillig 	/* r309343	*/
    128   1.4  rillig }
    129   1.4  rillig //indent end
    130   1.4  rillig 
    131   1.4  rillig 
    132   1.4  rillig /*
    133   1.4  rillig  * The first Christmas tree is to the right of the code, therefore the comment
    134   1.4  rillig  * is moved to the code comment column; the follow-up lines of that comment
    135   1.4  rillig  * are moved by the same distance, to preserve the internal layout.
    136   1.4  rillig  *
    137   1.4  rillig  * The other Christmas tree is a standalone block comment, therefore the
    138   1.4  rillig  * comment starts in the code column.
    139   1.4  rillig  */
    140   1.4  rillig //indent input
    141   1.4  rillig {
    142  1.15  rillig 	if (1) /*- a Christmas tree  *
    143   1.4  rillig 				    ***
    144   1.4  rillig 				   ***** */
    145  1.15  rillig 		    /*- another one *
    146   1.4  rillig 				   ***
    147   1.4  rillig 				  ***** */
    148   1.4  rillig 		1;
    149   1.4  rillig }
    150   1.4  rillig //indent end
    151   1.4  rillig 
    152   1.4  rillig //indent run -bbb
    153   1.4  rillig {
    154  1.15  rillig 	if (1)			/*- a Christmas tree  *
    155   1.4  rillig 						     ***
    156   1.4  rillig 						    ***** */
    157  1.15  rillig 		/*- another one *
    158   1.4  rillig 			       ***
    159   1.4  rillig 			      ***** */
    160   1.4  rillig 		1;
    161   1.4  rillig }
    162   1.4  rillig //indent end
    163   1.4  rillig 
    164   1.4  rillig 
    165   1.4  rillig /*
    166   1.4  rillig  * The first Christmas tree is to the right of the code, therefore the comment
    167   1.4  rillig  * is moved to the code comment column; the follow-up lines of that comment
    168   1.4  rillig  * are moved by the same distance, to preserve the internal layout.
    169   1.4  rillig  *
    170   1.4  rillig  * The other Christmas tree is a standalone block comment, therefore the
    171   1.4  rillig  * comment starts in the code column.
    172   1.4  rillig  */
    173   1.4  rillig //indent input
    174   1.4  rillig {
    175   1.4  rillig 	if (7) { /*- a Christmas tree  *
    176   1.4  rillig 				      ***
    177   1.4  rillig 				     ***** */
    178   1.4  rillig 		    /*- another one *
    179   1.4  rillig 				   ***
    180   1.4  rillig 				  ***** */
    181   1.4  rillig 		stmt();
    182   1.4  rillig 	}
    183   1.4  rillig }
    184   1.4  rillig //indent end
    185   1.4  rillig 
    186   1.4  rillig //indent run -bbb
    187   1.4  rillig {
    188   1.4  rillig 	if (7) {		/*- a Christmas tree  *
    189   1.4  rillig 					             ***
    190   1.4  rillig 					            ***** */
    191   1.4  rillig 		/*- another one *
    192   1.4  rillig 			       ***
    193   1.4  rillig 			      ***** */
    194   1.4  rillig 		stmt();
    195   1.4  rillig 	}
    196   1.4  rillig }
    197   1.4  rillig //indent end
    198   1.4  rillig 
    199   1.4  rillig 
    200   1.4  rillig //indent input
    201   1.4  rillig int decl;/*-fixed comment
    202   1.4  rillig 	    fixed comment*/
    203   1.4  rillig //indent end
    204   1.4  rillig 
    205   1.4  rillig //indent run -di0
    206   1.4  rillig int decl;			/*-fixed comment
    207   1.4  rillig 			           fixed comment*/
    208   1.4  rillig //indent end
    209   1.4  rillig /*
    210   1.4  rillig  * XXX: The second line of the above comment contains 11 spaces in a row,
    211   1.4  rillig  * instead of using as many tabs as possible.
    212   1.4  rillig  */
    213   1.4  rillig 
    214   1.4  rillig 
    215   1.4  rillig //indent input
    216   1.4  rillig {
    217  1.15  rillig 	if (0)/*-first line            |
    218  1.15  rillig 	   second line                 |*/
    219   1.4  rillig 		;
    220   1.4  rillig }
    221   1.4  rillig //indent end
    222   1.4  rillig 
    223   1.4  rillig //indent run -di0
    224   1.4  rillig {
    225  1.15  rillig 	if (0)			/*-first line            |
    226  1.15  rillig 			     second line                 |*/
    227   1.4  rillig 		;
    228   1.4  rillig }
    229   1.4  rillig //indent end
    230   1.4  rillig 
    231   1.4  rillig 
    232   1.4  rillig /*
    233   1.4  rillig  * Ensure that all text of the comment is preserved when the comment is moved
    234   1.4  rillig  * to the right.
    235   1.4  rillig  */
    236   1.4  rillig //indent input
    237   1.4  rillig int decl;/*-fixed comment
    238   1.4  rillig 123456789ab fixed comment*/
    239   1.4  rillig //indent end
    240   1.4  rillig 
    241   1.4  rillig //indent run -di0
    242   1.4  rillig int decl;			/*-fixed comment
    243   1.4  rillig 		       123456789ab fixed comment*/
    244   1.4  rillig //indent end
    245   1.4  rillig 
    246   1.4  rillig 
    247   1.4  rillig /*
    248   1.4  rillig  * Ensure that all text of the comment is preserved when the comment is moved
    249   1.4  rillig  * to the right.
    250   1.4  rillig  */
    251   1.4  rillig //indent input
    252   1.4  rillig {
    253  1.15  rillig 	if(0)/*-first line
    254  1.15  rillig 123456789ab second line           |*/
    255   1.4  rillig 	    ;
    256   1.4  rillig }
    257   1.4  rillig //indent end
    258   1.4  rillig 
    259   1.4  rillig //indent run -di0
    260   1.4  rillig {
    261  1.15  rillig 	if (0)			/*-first line
    262  1.15  rillig 		   123456789ab second line           |*/
    263   1.4  rillig 		;
    264   1.4  rillig }
    265   1.4  rillig //indent end
    266   1.4  rillig 
    267   1.4  rillig 
    268   1.4  rillig /*
    269   1.4  rillig  * Ensure that all text of the comment is preserved when the comment is moved
    270   1.4  rillig  * to the left. In this case, the internal layout of the comment cannot be
    271   1.4  rillig  * preserved since the second line already starts in column 1.
    272   1.4  rillig  */
    273   1.4  rillig //indent input
    274   1.4  rillig int decl;					    /*-|fixed comment
    275   1.4  rillig 					| minus 12     |
    276   1.4  rillig 		| tabs inside		|
    277   1.4  rillig 	    |---|
    278   1.4  rillig |-----------|
    279   1.4  rillig tab1+++	tab2---	tab3+++	tab4---	tab5+++	tab6---	tab7+++fixed comment*/
    280   1.4  rillig //indent end
    281   1.4  rillig 
    282   1.4  rillig //indent run -di0
    283   1.4  rillig int decl;			/*-|fixed comment
    284   1.4  rillig 		    | minus 12     |
    285   1.4  rillig | tabs inside		|
    286   1.4  rillig |---|
    287   1.4  rillig |-----------|
    288   1.4  rillig tab1+++	tab2---	tab3+++	tab4---	tab5+++	tab6---	tab7+++fixed comment*/
    289   1.4  rillig //indent end
    290   1.4  rillig 
    291   1.4  rillig 
    292   1.4  rillig /*
    293   1.4  rillig  * Ensure that all text of the comment is preserved when the comment is moved
    294   1.4  rillig  * to the left. In this case, the internal layout of the comment cannot be
    295   1.4  rillig  * preserved since the second line already starts in column 1.
    296   1.4  rillig  */
    297   1.4  rillig //indent input
    298   1.4  rillig {
    299  1.15  rillig 	if(0)					    /*-|first line
    300   1.4  rillig 					| minus 12     |
    301   1.4  rillig 		| tabs inside		|
    302   1.4  rillig 	    |---|
    303   1.4  rillig |-----------|
    304   1.4  rillig tab1+++	tab2---	tab3+++	tab4---	tab5+++	tab6---	tab7+++fixed comment*/
    305   1.4  rillig 		;
    306   1.4  rillig }
    307   1.4  rillig //indent end
    308   1.4  rillig 
    309   1.4  rillig //indent run -di0
    310   1.4  rillig {
    311  1.15  rillig 	if (0)			/*-|first line
    312   1.4  rillig 		    | minus 12     |
    313   1.4  rillig | tabs inside		|
    314   1.4  rillig |---|
    315   1.4  rillig |-----------|
    316   1.4  rillig tab1+++	tab2---	tab3+++	tab4---	tab5+++	tab6---	tab7+++fixed comment*/
    317   1.4  rillig 		;
    318   1.4  rillig }
    319   1.4  rillig //indent end
    320   1.4  rillig 
    321   1.4  rillig 
    322   1.4  rillig /*
    323  1.15  rillig  * Ensure that '{' after a comment is preserved.
    324   1.4  rillig  */
    325   1.4  rillig //indent input
    326   1.4  rillig {
    327   1.4  rillig 	if(0)/*comment*/{
    328   1.4  rillig 	}
    329   1.4  rillig }
    330   1.4  rillig //indent end
    331   1.4  rillig 
    332  1.15  rillig /* Before 2023-05-11, the comment and the '{' swapped places. */
    333   1.4  rillig //indent run
    334   1.4  rillig {
    335   1.5  rillig 	if (0) /* comment */ {
    336   1.4  rillig 	}
    337   1.4  rillig }
    338   1.4  rillig //indent end
    339   1.4  rillig 
    340   1.4  rillig 
    341   1.4  rillig /*
    342   1.4  rillig  * The following comments test line breaking when the comment ends with a
    343   1.4  rillig  * space.
    344   1.4  rillig  */
    345   1.4  rillig //indent input
    346   1.4  rillig /* 456789 123456789 123456789 12345 */
    347   1.4  rillig /* 456789 123456789 123456789 123456 */
    348   1.4  rillig /* 456789 123456789 123456789 1234567 */
    349   1.4  rillig /* 456789 123456789 123456789 12345678 */
    350   1.4  rillig /* 456789 123456789 123456789 123456789 */
    351   1.4  rillig //indent end
    352   1.4  rillig 
    353   1.4  rillig //indent run -l38
    354   1.4  rillig /* 456789 123456789 123456789 12345 */
    355   1.4  rillig /*
    356   1.4  rillig  * 456789 123456789 123456789 123456
    357   1.4  rillig  */
    358   1.4  rillig /*
    359   1.4  rillig  * 456789 123456789 123456789 1234567
    360   1.4  rillig  */
    361   1.4  rillig /*
    362   1.4  rillig  * 456789 123456789 123456789 12345678
    363   1.4  rillig  */
    364   1.4  rillig /*
    365   1.4  rillig  * 456789 123456789 123456789
    366   1.4  rillig  * 123456789
    367   1.4  rillig  */
    368   1.4  rillig //indent end
    369   1.4  rillig 
    370   1.4  rillig 
    371   1.4  rillig /*
    372  1.18  rillig  * When determining whether the comment fits in a single line, only the first
    373  1.18  rillig  * trailing space or tab is kept, the others are removed.
    374  1.17  rillig  */
    375  1.17  rillig //indent input
    376  1.18  rillig /* tab: */
    377  1.17  rillig /* 456789 123456789 123456789 12345		*/
    378  1.17  rillig /* 456789 123456789 123456789 123456		*/
    379  1.18  rillig /* space: */
    380  1.18  rillig /* 456789 123456789 123456789 12345             */
    381  1.18  rillig /* 456789 123456789 123456789 123456            */
    382  1.17  rillig //indent end
    383  1.17  rillig 
    384  1.17  rillig //indent run -l38
    385  1.18  rillig /* tab: */
    386  1.17  rillig /*
    387  1.17  rillig  * 456789 123456789 123456789 12345
    388  1.17  rillig  */
    389  1.17  rillig /*
    390  1.17  rillig  * 456789 123456789 123456789 123456
    391  1.17  rillig  */
    392  1.18  rillig /* space: */
    393  1.18  rillig /* 456789 123456789 123456789 12345 */
    394  1.18  rillig /*
    395  1.18  rillig  * 456789 123456789 123456789 123456
    396  1.18  rillig  */
    397  1.17  rillig //indent end
    398  1.17  rillig 
    399  1.17  rillig 
    400  1.17  rillig /*
    401   1.4  rillig  * The following comments test line breaking when the comment does not end
    402   1.4  rillig  * with a space. Since indent adds a trailing space to a single-line comment,
    403   1.4  rillig  * this space has to be taken into account when computing the line length.
    404   1.4  rillig  */
    405   1.4  rillig //indent input
    406   1.4  rillig /* x		. line length 35*/
    407   1.4  rillig /* x		.. line length 36*/
    408   1.4  rillig /* x		... line length 37*/
    409   1.4  rillig /* x		.... line length 38*/
    410   1.4  rillig /* x		..... line length 39*/
    411   1.4  rillig /* x		...... line length 40*/
    412   1.4  rillig /* x		....... line length 41*/
    413   1.4  rillig /* x		........ line length 42*/
    414   1.4  rillig //indent end
    415   1.4  rillig 
    416   1.4  rillig //indent run -l38
    417   1.4  rillig /* x		. line length 35 */
    418   1.4  rillig /* x		.. line length 36 */
    419   1.4  rillig /* x		... line length 37 */
    420   1.4  rillig /* x		.... line length 38 */
    421   1.4  rillig /*
    422   1.4  rillig  * x		..... line length 39
    423   1.4  rillig  */
    424   1.4  rillig /*
    425   1.4  rillig  * x		...... line length 40
    426   1.4  rillig  */
    427   1.4  rillig /*
    428   1.4  rillig  * x		....... line length 41
    429   1.4  rillig  */
    430   1.4  rillig /*
    431   1.4  rillig  * x		........ line length 42
    432   1.4  rillig  */
    433   1.4  rillig //indent end
    434   1.4  rillig 
    435   1.4  rillig 
    436   1.4  rillig /*
    437   1.4  rillig  * The different types of comments that indent distinguishes, starting in
    438   1.4  rillig  * column 1 (see options '-fc1' and '-nfc1').
    439   1.4  rillig  */
    440   1.4  rillig //indent input
    441   1.4  rillig /* This is a traditional C block comment. */
    442   1.4  rillig 
    443   1.4  rillig // This is a C99 line comment.
    444   1.4  rillig 
    445   1.4  rillig /*
    446   1.4  rillig  * This is a box comment since its first line (the one above this line) is
    447   1.4  rillig  * empty.
    448   1.4  rillig  *
    449   1.4  rillig  *
    450   1.4  rillig  *
    451   1.4  rillig  * Its text gets wrapped.
    452   1.4  rillig  * Empty lines serve as paragraphs.
    453   1.4  rillig  */
    454   1.4  rillig 
    455   1.4  rillig /**
    456   1.4  rillig  * This is a box comment
    457   1.4  rillig  * that is not re-wrapped.
    458   1.4  rillig  */
    459   1.4  rillig 
    460   1.4  rillig /*-
    461   1.4  rillig  * This is a box comment
    462   1.4  rillig  * that is not re-wrapped.
    463   1.4  rillig  * It is often used for copyright declarations.
    464   1.4  rillig  */
    465   1.4  rillig //indent end
    466   1.4  rillig 
    467   1.4  rillig //indent run
    468   1.4  rillig /* This is a traditional C block comment. */
    469   1.4  rillig 
    470   1.4  rillig // This is a C99 line comment.
    471   1.4  rillig 
    472   1.4  rillig /*
    473   1.4  rillig  * This is a box comment since its first line (the one above this line) is
    474   1.4  rillig  * empty.
    475   1.4  rillig  *
    476   1.4  rillig  *
    477   1.4  rillig  *
    478   1.4  rillig  * Its text gets wrapped. Empty lines serve as paragraphs.
    479   1.4  rillig  */
    480   1.4  rillig 
    481   1.4  rillig /**
    482   1.4  rillig  * This is a box comment
    483   1.4  rillig  * that is not re-wrapped.
    484   1.4  rillig  */
    485   1.4  rillig 
    486   1.4  rillig /*-
    487   1.4  rillig  * This is a box comment
    488   1.4  rillig  * that is not re-wrapped.
    489   1.4  rillig  * It is often used for copyright declarations.
    490   1.4  rillig  */
    491   1.4  rillig //indent end
    492   1.4  rillig 
    493   1.4  rillig 
    494   1.4  rillig /*
    495   1.4  rillig  * The different types of comments that indent distinguishes, starting in
    496   1.4  rillig  * column 9, so they are independent of the option '-fc1'.
    497   1.4  rillig  */
    498   1.4  rillig //indent input
    499   1.4  rillig void
    500   1.4  rillig function(void)
    501   1.4  rillig {
    502   1.4  rillig 	/* This is a traditional C block comment. */
    503   1.4  rillig 
    504   1.4  rillig 	/*
    505   1.4  rillig 	 * This is a box comment.
    506   1.4  rillig 	 *
    507   1.4  rillig 	 * It starts in column 9, not 1,
    508   1.4  rillig 	 * therefore it gets re-wrapped.
    509   1.4  rillig 	 */
    510   1.4  rillig 
    511   1.4  rillig 	/**
    512   1.4  rillig 	 * This is a box comment
    513   1.4  rillig 	 * that is not re-wrapped, even though it starts in column 9, not 1.
    514   1.4  rillig 	 */
    515   1.4  rillig 
    516   1.4  rillig 	/*-
    517   1.4  rillig 	 * This is a box comment
    518   1.4  rillig 	 * that is not re-wrapped.
    519   1.4  rillig 	 */
    520   1.4  rillig }
    521   1.4  rillig //indent end
    522   1.4  rillig 
    523   1.4  rillig //indent run
    524   1.4  rillig void
    525   1.4  rillig function(void)
    526   1.4  rillig {
    527   1.4  rillig 	/* This is a traditional C block comment. */
    528   1.4  rillig 
    529   1.4  rillig 	/*
    530   1.4  rillig 	 * This is a box comment.
    531   1.4  rillig 	 *
    532   1.4  rillig 	 * It starts in column 9, not 1, therefore it gets re-wrapped.
    533   1.4  rillig 	 */
    534   1.4  rillig 
    535   1.4  rillig 	/**
    536   1.4  rillig 	 * This is a box comment
    537   1.4  rillig 	 * that is not re-wrapped, even though it starts in column 9, not 1.
    538   1.4  rillig 	 */
    539   1.4  rillig 
    540   1.4  rillig 	/*-
    541   1.4  rillig 	 * This is a box comment
    542   1.4  rillig 	 * that is not re-wrapped.
    543   1.4  rillig 	 */
    544   1.4  rillig }
    545   1.4  rillig //indent end
    546   1.4  rillig 
    547   1.4  rillig 
    548   1.4  rillig /*
    549   1.4  rillig  * Comments to the right of declarations.
    550   1.4  rillig  */
    551   1.4  rillig //indent input
    552   1.4  rillig void
    553   1.4  rillig function(void)
    554   1.4  rillig {
    555   1.4  rillig 	int decl;	/* declaration comment */
    556   1.4  rillig 
    557   1.4  rillig 	int decl;	/* short
    558   1.4  rillig 			 * multi-line
    559   1.4  rillig 			 * declaration
    560   1.4  rillig 			 * comment */
    561   1.4  rillig 
    562   1.4  rillig 	int decl;	/* long single-line declaration comment that is longer than the allowed line width */
    563   1.4  rillig 
    564   1.4  rillig 	int decl;	/* long multi-line declaration comment
    565   1.4  rillig  * that is longer than
    566   1.4  rillig  * the allowed line width */
    567   1.4  rillig 
    568   1.4  rillig 	int decl;	// C99 declaration comment
    569   1.4  rillig 
    570   1.4  rillig 	{
    571   1.4  rillig 		int decl;	/* indented declaration */
    572   1.4  rillig 		{
    573   1.4  rillig 			int decl;	/* indented declaration */
    574   1.4  rillig 			{
    575   1.4  rillig 				int decl;	/* indented declaration */
    576   1.4  rillig 				{
    577   1.4  rillig 					int decl;	/* indented declaration */
    578   1.4  rillig 				}
    579   1.4  rillig 			}
    580   1.4  rillig 		}
    581   1.4  rillig 	}
    582   1.4  rillig }
    583   1.4  rillig //indent end
    584   1.4  rillig 
    585   1.4  rillig //indent run -ldi0
    586   1.4  rillig void
    587   1.4  rillig function(void)
    588   1.4  rillig {
    589   1.4  rillig 	int decl;		/* declaration comment */
    590   1.4  rillig 
    591   1.4  rillig 	int decl;		/* short multi-line declaration comment */
    592   1.4  rillig 
    593   1.4  rillig 	int decl;		/* long single-line declaration comment that
    594   1.4  rillig 				 * is longer than the allowed line width */
    595   1.4  rillig 
    596   1.4  rillig 	int decl;		/* long multi-line declaration comment that is
    597   1.4  rillig 				 * longer than the allowed line width */
    598   1.4  rillig 
    599   1.4  rillig 	int decl;		// C99 declaration comment
    600   1.4  rillig 
    601   1.4  rillig 	{
    602   1.4  rillig 		int decl;	/* indented declaration */
    603   1.4  rillig 		{
    604   1.4  rillig 			int decl;	/* indented declaration */
    605   1.4  rillig 			{
    606   1.4  rillig 				int decl;	/* indented declaration */
    607   1.4  rillig 				{
    608  1.11  rillig // $ This comment is indented so far to the right that it may overshoot the
    609  1.11  rillig // $ right margin.  The allowed line length is increased to the starting
    610  1.11  rillig // $ indentation of 56 plus a fixed amount of 25 columns, resulting in 81.
    611  1.11  rillig // $ The trailing '*' would fit, but the trailing '/' is too much.
    612  1.11  rillig 					int decl;	/* indented declaration
    613  1.11  rillig 							 */
    614   1.4  rillig 				}
    615   1.4  rillig 			}
    616   1.4  rillig 		}
    617   1.4  rillig 	}
    618   1.4  rillig }
    619   1.4  rillig //indent end
    620   1.4  rillig 
    621   1.4  rillig 
    622   1.4  rillig /*
    623   1.4  rillig  * Comments to the right of code.
    624   1.4  rillig  */
    625   1.4  rillig //indent input
    626   1.4  rillig void
    627   1.4  rillig function(void)
    628   1.4  rillig {
    629   1.4  rillig 	code();			/* code comment */
    630   1.4  rillig 	code();			/* code comment _________ to line length 78 */
    631   1.4  rillig 	code();			/* code comment __________ to line length 79 */
    632   1.4  rillig 	code();			/* code comment ___________ to line length 80 */
    633   1.4  rillig 	code();			/* code comment ____________ to line length 81 */
    634   1.4  rillig 	code();			/* code comment _____________ to line length 82 */
    635   1.4  rillig 
    636   1.4  rillig /* $ In the following comments, the line length is measured after formatting. */
    637   1.4  rillig 	code();			/* code comment _________ to line length 78*/
    638   1.4  rillig 	code();			/* code comment __________ to line length 79*/
    639   1.4  rillig 	code();			/* code comment ___________ to line length 80*/
    640   1.4  rillig 	code();			/* code comment ____________ to line length 81*/
    641   1.4  rillig 	code();			/* code comment _____________ to line length 82*/
    642   1.4  rillig 
    643   1.4  rillig 	code();			/* short
    644   1.4  rillig 				 * multi-line
    645   1.4  rillig 				 * code
    646   1.4  rillig 				 * comment */
    647   1.4  rillig 
    648   1.4  rillig 	code();			/* long single-line code comment that is longer than the allowed line width */
    649   1.4  rillig 
    650   1.4  rillig 	code();			/* long multi-line code comment
    651   1.4  rillig  * that is longer than
    652   1.4  rillig  * the allowed line width */
    653   1.4  rillig 
    654   1.4  rillig 	code();			// C99 code comment
    655   1.4  rillig 	code();			// C99 code comment ________ to line length 78
    656   1.4  rillig 	code();			// C99 code comment _________ to line length 79
    657   1.4  rillig 	code();			// C99 code comment __________ to line length 80
    658   1.4  rillig 	code();			// C99 code comment ___________ to line length 81
    659   1.4  rillig 	code();			// C99 code comment ____________ to line length 82
    660   1.4  rillig 
    661   1.4  rillig 	if (cond) /* comment */
    662   1.4  rillig 		if (cond) /* comment */
    663   1.4  rillig 			if (cond) /* comment */
    664   1.4  rillig 				if (cond) /* comment */
    665   1.4  rillig 					if (cond) /* comment */
    666   1.4  rillig 						code(); /* comment */
    667   1.4  rillig }
    668   1.4  rillig //indent end
    669   1.4  rillig 
    670  1.11  rillig //indent run -l78
    671   1.4  rillig void
    672   1.4  rillig function(void)
    673   1.4  rillig {
    674   1.4  rillig 	code();			/* code comment */
    675   1.4  rillig 	code();			/* code comment _________ to line length 78 */
    676  1.11  rillig 	code();			/* code comment __________ to line length 79
    677  1.11  rillig 				 */
    678  1.11  rillig 	code();			/* code comment ___________ to line length 80
    679  1.11  rillig 				 */
    680  1.11  rillig 	code();			/* code comment ____________ to line length 81
    681  1.11  rillig 				 */
    682   1.4  rillig 	code();			/* code comment _____________ to line length
    683   1.4  rillig 				 * 82 */
    684   1.4  rillig 
    685   1.4  rillig /* $ In the following comments, the line length is measured after formatting. */
    686   1.4  rillig 	code();			/* code comment _________ to line length 78 */
    687  1.11  rillig 	code();			/* code comment __________ to line length 79
    688  1.11  rillig 				 */
    689  1.11  rillig 	code();			/* code comment ___________ to line length 80
    690  1.11  rillig 				 */
    691  1.11  rillig 	code();			/* code comment ____________ to line length 81
    692  1.11  rillig 				 */
    693   1.4  rillig 	code();			/* code comment _____________ to line length
    694   1.4  rillig 				 * 82 */
    695   1.4  rillig 
    696   1.4  rillig 	code();			/* short multi-line code comment */
    697   1.4  rillig 
    698   1.4  rillig 	code();			/* long single-line code comment that is
    699   1.4  rillig 				 * longer than the allowed line width */
    700   1.4  rillig 
    701   1.4  rillig 	code();			/* long multi-line code comment that is longer
    702   1.4  rillig 				 * than the allowed line width */
    703   1.4  rillig 
    704   1.4  rillig /* $ Trailing C99 comments are not wrapped, as indent would not correctly */
    705   1.4  rillig /* $ recognize the continuation lines as continued comments. For block */
    706   1.4  rillig /* $ comments this works since the comment has not ended yet. */
    707   1.4  rillig 	code();			// C99 code comment
    708   1.4  rillig 	code();			// C99 code comment ________ to line length 78
    709   1.4  rillig 	code();			// C99 code comment _________ to line length 79
    710   1.4  rillig 	code();			// C99 code comment __________ to line length 80
    711   1.4  rillig 	code();			// C99 code comment ___________ to line length 81
    712   1.4  rillig 	code();			// C99 code comment ____________ to line length 82
    713   1.4  rillig 
    714   1.4  rillig 	if (cond)		/* comment */
    715   1.4  rillig 		if (cond)	/* comment */
    716   1.4  rillig 			if (cond)	/* comment */
    717   1.4  rillig 				if (cond)	/* comment */
    718   1.4  rillig 					if (cond)	/* comment */
    719   1.4  rillig 						code();	/* comment */
    720   1.4  rillig }
    721   1.4  rillig //indent end
    722   1.4  rillig 
    723   1.4  rillig 
    724   1.4  rillig //indent input
    725   1.4  rillig /*
    726   1.4  rillig 	 * this
    727   1.4  rillig 		 * is a boxed
    728   1.4  rillig 			 * staircase.
    729   1.4  rillig *
    730   1.4  rillig * Its paragraphs get wrapped.
    731   1.4  rillig 
    732   1.4  rillig There may also be
    733   1.4  rillig 		lines without asterisks.
    734   1.4  rillig 
    735   1.4  rillig  */
    736   1.4  rillig //indent end
    737   1.4  rillig 
    738   1.4  rillig //indent run
    739   1.4  rillig /*
    740   1.4  rillig  * this is a boxed staircase.
    741   1.4  rillig  *
    742   1.4  rillig  * Its paragraphs get wrapped.
    743   1.4  rillig  *
    744   1.4  rillig  * There may also be lines without asterisks.
    745   1.4  rillig  *
    746   1.4  rillig  */
    747   1.4  rillig //indent end
    748   1.4  rillig 
    749   1.4  rillig 
    750   1.4  rillig //indent input
    751   1.4  rillig void loop(void)
    752   1.4  rillig {
    753   1.4  rillig while(cond)/*comment*/;
    754   1.4  rillig 
    755   1.4  rillig 	while(cond)
    756   1.4  rillig 	/*comment*/;
    757   1.4  rillig }
    758   1.4  rillig //indent end
    759   1.4  rillig 
    760   1.4  rillig //indent run
    761   1.4  rillig void
    762   1.4  rillig loop(void)
    763   1.4  rillig {
    764  1.25  rillig 	while (cond)		/* comment */
    765  1.25  rillig 		;
    766   1.4  rillig 
    767   1.4  rillig 	while (cond)
    768  1.16  rillig 		/* comment */;
    769   1.4  rillig }
    770   1.4  rillig //indent end
    771   1.4  rillig 
    772   1.4  rillig 
    773   1.4  rillig /*
    774   1.4  rillig  * The following comment starts really far to the right. To avoid that each
    775   1.4  rillig  * line only contains a single word, the maximum allowed line width is
    776   1.4  rillig  * extended such that each comment line may contain 22 characters.
    777   1.4  rillig  */
    778   1.4  rillig //indent input
    779   1.4  rillig int		global_variable_with_really_long_name_that_reaches_up_to_column_83;	/* 1234567890123456789 1 1234567890123456789 12 1234567890123456789 123 1234567890123456789 1234 1234567890123456789 12345 1234567890123456789 123456 */
    780   1.4  rillig //indent end
    781   1.4  rillig 
    782   1.4  rillig //indent run
    783   1.4  rillig int		global_variable_with_really_long_name_that_reaches_up_to_column_83;	/* 1234567890123456789 1
    784   1.4  rillig 											 * 1234567890123456789 12
    785   1.4  rillig 											 * 1234567890123456789
    786   1.4  rillig 											 * 123
    787   1.4  rillig 											 * 1234567890123456789
    788   1.4  rillig 											 * 1234
    789   1.4  rillig 											 * 1234567890123456789
    790   1.4  rillig 											 * 12345
    791   1.4  rillig 											 * 1234567890123456789
    792   1.4  rillig 											 * 123456 */
    793   1.4  rillig //indent end
    794   1.4  rillig 
    795   1.4  rillig 
    796   1.4  rillig /*
    797   1.4  rillig  * Demonstrates handling of line-end '//' comments.
    798   1.4  rillig  *
    799   1.4  rillig  * Even though this type of comments had been added in C99, indent didn't
    800   1.4  rillig  * support these comments until 2021 and instead messed up the code in
    801   1.4  rillig  * seemingly unpredictable ways. It treated any sequence of '/' as a binary
    802   1.4  rillig  * operator, no matter whether it was '/' or '//' or '/////'.
    803   1.4  rillig  */
    804   1.4  rillig //indent input
    805   1.4  rillig int dummy // comment
    806   1.4  rillig     = // eq
    807   1.4  rillig     1		// one
    808   1.4  rillig     + // plus
    809   1.4  rillig     2;// two
    810   1.4  rillig 
    811   1.4  rillig /////separator/////
    812   1.4  rillig 
    813   1.4  rillig void function(void){}
    814   1.4  rillig 
    815   1.4  rillig // Note: removing one of these line-end comments affected the formatting
    816   1.4  rillig // of the main function below, before indent supported '//' comments.
    817   1.4  rillig 
    818   1.4  rillig int
    819   1.4  rillig main(void)
    820   1.4  rillig {
    821   1.4  rillig }
    822   1.4  rillig //indent end
    823   1.4  rillig 
    824   1.4  rillig //indent run
    825   1.4  rillig int		dummy		// comment
    826   1.4  rillig =				// eq
    827   1.4  rillig 1				// one
    828   1.4  rillig +				// plus
    829   1.4  rillig 2;				// two
    830   1.4  rillig 
    831   1.4  rillig /////separator/////
    832   1.4  rillig 
    833   1.4  rillig void
    834   1.4  rillig function(void)
    835   1.4  rillig {
    836   1.4  rillig }
    837   1.4  rillig 
    838   1.4  rillig // Note: removing one of these line-end comments affected the formatting
    839   1.4  rillig // of the main function below, before indent supported '//' comments.
    840   1.4  rillig 
    841   1.4  rillig int
    842   1.4  rillig main(void)
    843   1.4  rillig {
    844   1.4  rillig }
    845   1.4  rillig //indent end
    846   1.4  rillig 
    847   1.4  rillig 
    848   1.4  rillig /*
    849   1.4  rillig  * Between March 2021 and October 2021, indent supported C99 comments only
    850   1.4  rillig  * very basically. It messed up the following code, repeating the identifier
    851   1.4  rillig  * 'bar' twice in a row.
    852   1.4  rillig  */
    853   1.4  rillig //indent input
    854   1.4  rillig void c99_comment(void)
    855   1.4  rillig {
    856   1.4  rillig foo(); // C99 comment
    857   1.4  rillig bar();
    858   1.4  rillig }
    859   1.4  rillig //indent end
    860   1.4  rillig 
    861   1.4  rillig //indent run
    862   1.4  rillig void
    863   1.4  rillig c99_comment(void)
    864   1.4  rillig {
    865   1.4  rillig 	foo();			// C99 comment
    866   1.4  rillig 	bar();
    867   1.4  rillig }
    868   1.4  rillig //indent end
    869   1.4  rillig 
    870   1.4  rillig 
    871   1.3  rillig //indent input
    872   1.4  rillig void
    873   1.4  rillig comment_at_end_of_function(void)
    874   1.4  rillig {
    875   1.4  rillig 	if (cond)
    876   1.4  rillig 		statement();
    877   1.4  rillig 	// comment
    878   1.4  rillig }
    879   1.3  rillig //indent end
    880   1.1  rillig 
    881   1.3  rillig //indent run-equals-input
    882   1.4  rillig 
    883   1.4  rillig 
    884   1.4  rillig //indent input
    885   1.4  rillig int		decl;
    886   1.4  rillig // end-of-line comment at the end of the file
    887   1.4  rillig //indent end
    888   1.4  rillig 
    889   1.4  rillig //indent run-equals-input
    890   1.4  rillig 
    891   1.4  rillig 
    892   1.4  rillig /* A form feed in the middle of a comment is an ordinary character. */
    893   1.4  rillig //indent input
    894   1.4  rillig /*
    895   1.4  rillig  * AE
    897   1.4  rillig  */
    898   1.4  rillig /*-AE*/
    900   1.4  rillig //indent end
    901   1.4  rillig 
    902   1.4  rillig //indent run-equals-input
    903   1.4  rillig 
    904  1.13  rillig 
    905  1.13  rillig /*
    906   1.4  rillig  * Form feeds are seldom used, especially in comments, so treat them as an
    907   1.4  rillig  * ordinary character.
    908   1.4  rillig  */
    909   1.4  rillig //indent input
    910   1.4  rillig /* comment*/
    912   1.4  rillig /*text* comment*/
    914  1.13  rillig //indent end
    915   1.4  rillig 
    916   1.4  rillig //indent run
    917  1.13  rillig /*  comment */
    919   1.4  rillig /* text* comment */
    921   1.4  rillig //indent end
    922   1.4  rillig 
    923   1.4  rillig //indent run-equals-prev-output -nsc
    924   1.4  rillig 
    925  1.15  rillig //indent run-equals-input -nfc1
    926   1.4  rillig 
    927   1.4  rillig 
    928   1.4  rillig /*
    929   1.4  rillig  * A completely empty line in a box comment must be copied unmodified to the
    930   1.4  rillig  * output. This is done in process_comment by adding a space to the end of an
    931   1.4  rillig  * otherwise empty comment. This space forces output_line to add some output,
    932   1.4  rillig  * but the trailing space is discarded, resulting in an empty line.
    933   1.4  rillig  */
    934   1.4  rillig //indent input
    935   1.4  rillig /*- comment
    936   1.4  rillig 
    937   1.4  rillig 
    938   1.4  rillig end */
    939   1.4  rillig //indent end
    940   1.4  rillig 
    941   1.4  rillig //indent run-equals-input -nfc1
    942   1.4  rillig 
    943   1.4  rillig 
    944   1.4  rillig //indent input
    945   1.4  rillig /* comment comment comment comment mlute */
    946   1.4  rillig //indent end
    947   1.4  rillig 
    948   1.4  rillig //indent run -l40
    949   1.4  rillig /*
    950   1.4  rillig  * comment comment comment comment
    951   1.4  rillig  * mlute
    952   1.4  rillig  */
    953   1.4  rillig //indent end
    954   1.4  rillig 
    955   1.4  rillig 
    956   1.4  rillig //indent input
    957   1.4  rillig int f(void)
    958   1.4  rillig {
    959   1.4  rillig 	if (0)
    960   1.4  rillig 		/* 12 1234 123 123456 1234 1234567 123 1234.  */;
    961   1.4  rillig }
    962   1.4  rillig //indent end
    963   1.4  rillig 
    964   1.4  rillig /* The comment is too long to fit in a single line. */
    965   1.4  rillig //indent run -l54
    966   1.4  rillig int
    967  1.16  rillig f(void)
    968   1.4  rillig {
    969   1.4  rillig 	if (0)
    970   1.4  rillig 		/*
    971   1.4  rillig 		 * 12 1234 123 123456 1234 1234567 123
    972   1.4  rillig 		 * 1234.
    973   1.4  rillig 		 */;
    974   1.4  rillig }
    975   1.4  rillig //indent end
    976   1.4  rillig 
    977  1.18  rillig /* The comment fits in a single line. */
    978   1.4  rillig //indent run
    979   1.4  rillig int
    980   1.4  rillig f(void)
    981   1.4  rillig {
    982   1.4  rillig 	if (0)
    983   1.4  rillig 		/* 12 1234 123 123456 1234 1234567 123 1234. */;
    984   1.4  rillig }
    985   1.4  rillig //indent end
    986   1.4  rillig 
    987   1.4  rillig 
    988   1.4  rillig /*
    989   1.4  rillig  * Test for an edge cases in comment handling, having a block comment inside
    990   1.4  rillig  * a line comment. Before NetBSD pr_comment.c 1.96 from 2021-11-04, indent
    991   1.4  rillig  * wrongly assumed that the comment would end at the '*' '/', tokenizing the
    992   1.4  rillig  * second word 'still' as a type_outside_parentheses.
    993   1.4  rillig  */
    994   1.4  rillig //indent input
    995   1.4  rillig /* block comment */
    996   1.4  rillig // line comment /* still a line comment */ still a line comment
    997   1.4  rillig //indent end
    998   1.4  rillig 
    999   1.4  rillig //indent run-equals-input
   1000   1.4  rillig 
   1001   1.4  rillig 
   1002   1.4  rillig /*
   1003   1.4  rillig  * Tests for comments that are not wrapped.
   1004   1.4  rillig  */
   1005   1.4  rillig //indent input
   1006   1.4  rillig /*-	tab space	tab space */
   1007   1.4  rillig /*-	very-long-word-that-cannot-be-broken very-long-word-that-cannot-be-broken */
   1008   1.4  rillig /*-	very-long-word-that-cannot-be-broken very-long-word-that-cannot-be-broken */
   1009   1.4  rillig //indent end
   1010   1.4  rillig 
   1011   1.4  rillig //indent run-equals-input -l5
   1012   1.4  rillig 
   1013   1.4  rillig //indent run-equals-input -l32
   1014   1.4  rillig 
   1015   1.4  rillig 
   1016   1.4  rillig /*
   1017   1.4  rillig  * Test for form feeds in nowrap comments.
   1018   1.4  rillig  */
   1019   1.4  rillig //indent input
   1020   1.4  rillig /*-*/
   1022  1.21  rillig /*-<>*/
   1024   1.4  rillig //indent end
   1025   1.4  rillig 
   1026   1.4  rillig //indent run-equals-input
   1027   1.4  rillig 
   1028   1.4  rillig 
   1029   1.4  rillig /*
   1030   1.4  rillig  * In a comment that is wrapped, one or more empty lines separate paragraphs.
   1031   1.4  rillig  * All of these empty lines are preserved.
   1032   1.4  rillig  */
   1033   1.4  rillig //indent input
   1034   1.4  rillig /* line 1
   1035   1.4  rillig 
   1036   1.4  rillig 
   1037   1.4  rillig line 4 */
   1038   1.4  rillig //indent end
   1039   1.4  rillig 
   1040   1.4  rillig //indent run
   1041   1.4  rillig /*
   1042   1.4  rillig  * line 1
   1043   1.4  rillig  *
   1044   1.4  rillig  *
   1045   1.4  rillig  * line 4
   1046   1.4  rillig  */
   1047   1.4  rillig //indent end
   1048   1.4  rillig 
   1049   1.4  rillig //indent run-equals-input -nfc1
   1050   1.4  rillig 
   1051   1.4  rillig //indent run-equals-input -nfc1 -nsc
   1052   1.4  rillig 
   1053   1.4  rillig //indent run -nsc
   1054   1.4  rillig /*
   1055   1.4  rillig line 1
   1056   1.4  rillig 
   1057   1.4  rillig 
   1058   1.4  rillig line 4
   1059   1.4  rillig  */
   1060   1.4  rillig //indent end
   1061   1.4  rillig 
   1062   1.4  rillig //indent run-equals-input -nsc -ncdb
   1063   1.4  rillig 
   1064   1.4  rillig 
   1065   1.4  rillig /*
   1066   1.4  rillig  * Since 2019-04-04 and before pr_comment.c 1.123 from 2021-11-25, the
   1067   1.4  rillig  * function analyze_comment wrongly joined the two comments.
   1068   1.4  rillig  */
   1069   1.8  rillig //indent input
   1070   1.8  rillig /*
   1071   1.4  rillig  *//*
   1072   1.4  rillig join*/
   1073   1.4  rillig //indent end
   1074   1.4  rillig 
   1075   1.4  rillig //indent run -nfc1
   1076   1.4  rillig /*
   1077   1.4  rillig  */
   1078   1.4  rillig  /*
   1079   1.4  rillig   * join
   1080   1.4  rillig   */
   1081   1.4  rillig //indent end
   1082   1.4  rillig 
   1083   1.4  rillig 
   1084   1.4  rillig /*
   1085   1.4  rillig  * Since 2019-04-04 and before pr_comment.c 1.123 from 2021-11-25, the
   1086   1.4  rillig  * function analyze_comment generated malformed output by terminating the
   1087   1.4  rillig  * first comment but omitting the start of the second comment.
   1088   1.4  rillig  */
   1089   1.8  rillig //indent input
   1090   1.8  rillig /*
   1091   1.4  rillig *//*
   1092   1.4  rillig error*/
   1093   1.4  rillig //indent end
   1094  1.12  rillig 
   1095  1.12  rillig //indent run -nfc1
   1096  1.12  rillig /*
   1097  1.12  rillig */
   1098  1.12  rillig  /*
   1099  1.12  rillig   * error
   1100  1.12  rillig   */
   1101  1.12  rillig //indent end
   1102  1.12  rillig 
   1103  1.12  rillig 
   1104  1.12  rillig /*
   1105  1.12  rillig  * Ensure that there is exactly one space between the comment and the
   1106  1.12  rillig  * following binary operator.
   1107  1.12  rillig  */
   1108  1.12  rillig //indent input
   1109  1.12  rillig {
   1110  1.12  rillig a /* */ > b;
   1111  1.12  rillig a>b;
   1112  1.12  rillig }
   1113  1.20  rillig //indent end
   1114  1.20  rillig 
   1115  1.20  rillig //indent run
   1116  1.20  rillig {
   1117  1.20  rillig 	a /* */ > b;
   1118  1.20  rillig 	a > b;
   1119  1.20  rillig }
   1120  1.20  rillig //indent end
   1121  1.20  rillig 
   1122  1.20  rillig 
   1123  1.20  rillig /*
   1124  1.20  rillig  * Line comments are only related to a code snippet if they are on the same
   1125  1.20  rillig  * line; they cannot be continued in the next lines.
   1126  1.20  rillig  */
   1127  1.20  rillig //indent input
   1128  1.20  rillig int line;	// comment line 1
   1129  1.20  rillig 		// comment line 2
   1130  1.20  rillig int block;	/* comment line 1
   1131  1.20  rillig 		 * comment line 2
   1132  1.20  rillig 		 */
   1133  1.21  rillig //indent end
   1134  1.21  rillig 
   1135  1.24  rillig //indent run -di0
   1136  1.21  rillig int line;			// comment line 1
   1137  1.21  rillig // $ XXX: This comment was probably intended to continue 'comment line 1'.
   1138  1.21  rillig // comment line 2
   1139  1.21  rillig int block;			/* comment line 1 comment line 2 */
   1140  1.21  rillig //indent end
   1141  1.21  rillig 
   1142  1.21  rillig 
   1143  1.21  rillig // Ensure that '/*/' is not interpreted as a complete comment.
   1144  1.24  rillig //indent input
   1145  1.22  rillig /*/ comment? or:not; /* */
   1146  1.22  rillig //indent end
   1147  1.22  rillig 
   1148  1.22  rillig //indent run
   1149  1.22  rillig /* / comment? or:not; /* */
   1150  1.22  rillig //indent end
   1151  1.22  rillig 
   1152  1.22  rillig //indent run-equals-input -nfc1
   1153  1.22  rillig 
   1154  1.22  rillig 
   1155  1.22  rillig /*
   1156  1.22  rillig  * The tokens '/' and '*' do not form a comment when they are separated by a
   1157  1.22  rillig  * space.
   1158  1.22  rillig  */
   1159  1.22  rillig //indent input
   1160  1.22  rillig int a = b / *c;
   1161  1.22  rillig // $ Indent can be tricked into treating '/' as a unary operator, thus turning
   1162  1.22  rillig // $ some operators into the start of a comment. This only works in
   1163  1.22  rillig // $ syntactically invalid text.
   1164  1.22  rillig int a = b + / * c;
   1165  1.22  rillig //indent end
   1166  1.22  rillig 
   1167  1.22  rillig //indent run -di0
   1168  1.22  rillig int a = b / *c;
   1169  1.22  rillig // $ FIXME: Don't merge the two operators; there are enough situations where
   1170  1.22  rillig // $ indent has to guess whether an operator is unary or binary, and these
   1171  1.22  rillig // $ heuristics can go wrong.
   1172  1.22  rillig int a = b + /*c;
   1173  1.22  rillig //indent end
   1174  1.22  rillig 
   1175  1.22  rillig 
   1176  1.22  rillig /*
   1177  1.22  rillig  * Ensure that tab characters that are broken into separate lines are replaced
   1178  1.22  rillig  * with spaces; other tabs are preserved.
   1179  1.22  rillig  */
   1180  1.22  rillig //indent input
   1181  1.22  rillig /* word	word	word	word	word	word	word	word	word */
   1182  1.22  rillig //indent end
   1183  1.22  rillig 
   1184  1.22  rillig //indent run -l38
   1185  1.22  rillig /*
   1186  1.22  rillig  * word	word	word	word	word
   1187  1.22  rillig  * word	word	word	word
   1188  1.22  rillig  */
   1189  1.22  rillig //indent end
   1190  1.22  rillig 
   1191  1.22  rillig 
   1192  1.22  rillig /* In no-wrap comments, every single newline is preserved. */
   1193  1.22  rillig //indent input
   1194  1.22  rillig /*-
   1195  1.22  rillig paragraph 1
   1196               
   1197               
   1198               
   1199               paragraph 2
   1200                */
   1201               //indent end
   1202               
   1203               //indent run-equals-input
   1204