Module Name: src
Committed By: rillig
Date: Mon Oct 18 22:30:35 UTC 2021
Modified Files:
src/distrib/sets/lists/tests: mi
src/tests/usr.bin/indent: Makefile token_comment.c
Added Files:
src/tests/usr.bin/indent: token_binary_op.c token_case_label.c
token_colon.c token_comma.c token_decl.c token_do_stmt.c
token_end_of_file.c token_for_exprs.c token_form_feed.c
token_funcname.c token_if_expr.c token_if_expr_stmt.c
token_if_expr_stmt_else.c token_keyword_do.c
token_keyword_do_else.c token_keyword_else.c
token_keyword_for_if_while.c token_keyword_struct_union_enum.c
token_lbrace.c token_lparen.c token_newline.c token_period.c
token_postfix_op.c token_preprocessing.c token_question.c
token_rbrace.c token_rparen.c token_semicolon.c token_stmt.c
token_stmt_list.c token_storage_class.c token_string_prefix.c
token_switch_expr.c token_type_def.c token_unary_op.c
token_while_expr.c
Removed Files:
src/tests/usr.bin/indent: token-binary_op.0 token-binary_op.0.pro
token-binary_op.0.stdout token-case_label.0 token-case_label.0.pro
token-case_label.0.stdout token-colon.0 token-colon.0.pro
token-colon.0.stdout token-comma.0 token-comma.0.pro
token-comma.0.stdout token-decl.0 token-decl.0.pro
token-decl.0.stdout token-do_stmt.0 token-do_stmt.0.pro
token-do_stmt.0.stdout token-end_of_file.0 token-end_of_file.0.pro
token-end_of_file.0.stdout token-for_exprs.0 token-for_exprs.0.pro
token-for_exprs.0.stdout token-form_feed.0 token-form_feed.0.pro
token-form_feed.0.stdout token-funcname.0 token-funcname.0.pro
token-funcname.0.stdout token-if_expr.0 token-if_expr.0.pro
token-if_expr.0.stdout token-if_expr_stmt.0
token-if_expr_stmt.0.pro token-if_expr_stmt.0.stdout
token-if_expr_stmt_else.0 token-if_expr_stmt_else.0.pro
token-if_expr_stmt_else.0.stdout token-keyword_do.0
token-keyword_do.0.pro token-keyword_do.0.stdout
token-keyword_do_else.0 token-keyword_do_else.0.pro
token-keyword_do_else.0.stdout token-keyword_else.0
token-keyword_else.0.pro token-keyword_else.0.stdout
token-keyword_for_if_while.0 token-keyword_for_if_while.0.pro
token-keyword_for_if_while.0.stdout
token-keyword_struct_union_enum.0
token-keyword_struct_union_enum.0.pro
token-keyword_struct_union_enum.0.stdout token-lbrace.0
token-lbrace.0.pro token-lbrace.0.stdout token-lparen.0
token-lparen.0.pro token-lparen.0.stdout token-newline.0
token-newline.0.pro token-newline.0.stdout token-period.0
token-period.0.pro token-period.0.stdout token-postfix_op.0
token-postfix_op.0.pro token-postfix_op.0.stdout
token-preprocessing.0 token-preprocessing.0.pro
token-preprocessing.0.stdout token-question.0 token-question.0.pro
token-question.0.stdout token-rbrace.0 token-rbrace.0.pro
token-rbrace.0.stdout token-rparen.0 token-rparen.0.pro
token-rparen.0.stdout token-semicolon.0 token-semicolon.0.pro
token-semicolon.0.stdout token-stmt.0 token-stmt.0.pro
token-stmt.0.stdout token-stmt_list.0 token-stmt_list.0.pro
token-stmt_list.0.stdout token-storage_class.0
token-storage_class.0.pro token-storage_class.0.stdout
token-string_prefix.0 token-string_prefix.0.pro
token-string_prefix.0.stdout token-switch_expr.0
token-switch_expr.0.pro token-switch_expr.0.stdout token-type_def.0
token-type_def.0.pro token-type_def.0.stdout token-unary_op.0
token-unary_op.0.pro token-unary_op.0.stdout token-while_expr.0
token-while_expr.0.pro token-while_expr.0.stdout
Log Message:
tests/indent: condense the token tests
This reduces the number of files in the test directory. It also allows
the tests to be read from top to bottom, looking at only a single file.
Since t_options.awk complains about files that don't have any test case
at all, add some test for each token kind. Most of the tests had
previously been effectively empty.
To generate a diff of this commit:
cvs rdiff -u -r1.1144 -r1.1145 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.19 -r1.20 src/tests/usr.bin/indent/Makefile
cvs rdiff -u -r1.2 -r0 src/tests/usr.bin/indent/token-binary_op.0 \
src/tests/usr.bin/indent/token-binary_op.0.pro \
src/tests/usr.bin/indent/token-binary_op.0.stdout \
src/tests/usr.bin/indent/token-colon.0 \
src/tests/usr.bin/indent/token-colon.0.stdout \
src/tests/usr.bin/indent/token-keyword_do_else.0.stdout \
src/tests/usr.bin/indent/token-keyword_else.0 \
src/tests/usr.bin/indent/token-keyword_else.0.stdout \
src/tests/usr.bin/indent/token-lparen.0.pro \
src/tests/usr.bin/indent/token-while_expr.0 \
src/tests/usr.bin/indent/token-while_expr.0.stdout
cvs rdiff -u -r1.1 -r0 src/tests/usr.bin/indent/token-case_label.0 \
src/tests/usr.bin/indent/token-case_label.0.pro \
src/tests/usr.bin/indent/token-case_label.0.stdout \
src/tests/usr.bin/indent/token-colon.0.pro \
src/tests/usr.bin/indent/token-comma.0 \
src/tests/usr.bin/indent/token-comma.0.pro \
src/tests/usr.bin/indent/token-comma.0.stdout \
src/tests/usr.bin/indent/token-decl.0 \
src/tests/usr.bin/indent/token-decl.0.pro \
src/tests/usr.bin/indent/token-decl.0.stdout \
src/tests/usr.bin/indent/token-do_stmt.0 \
src/tests/usr.bin/indent/token-do_stmt.0.pro \
src/tests/usr.bin/indent/token-do_stmt.0.stdout \
src/tests/usr.bin/indent/token-end_of_file.0 \
src/tests/usr.bin/indent/token-end_of_file.0.pro \
src/tests/usr.bin/indent/token-end_of_file.0.stdout \
src/tests/usr.bin/indent/token-for_exprs.0 \
src/tests/usr.bin/indent/token-for_exprs.0.pro \
src/tests/usr.bin/indent/token-for_exprs.0.stdout \
src/tests/usr.bin/indent/token-form_feed.0 \
src/tests/usr.bin/indent/token-form_feed.0.pro \
src/tests/usr.bin/indent/token-form_feed.0.stdout \
src/tests/usr.bin/indent/token-funcname.0 \
src/tests/usr.bin/indent/token-funcname.0.pro \
src/tests/usr.bin/indent/token-funcname.0.stdout \
src/tests/usr.bin/indent/token-if_expr.0 \
src/tests/usr.bin/indent/token-if_expr.0.pro \
src/tests/usr.bin/indent/token-if_expr.0.stdout \
src/tests/usr.bin/indent/token-if_expr_stmt.0 \
src/tests/usr.bin/indent/token-if_expr_stmt.0.pro \
src/tests/usr.bin/indent/token-if_expr_stmt.0.stdout \
src/tests/usr.bin/indent/token-if_expr_stmt_else.0 \
src/tests/usr.bin/indent/token-if_expr_stmt_else.0.pro \
src/tests/usr.bin/indent/token-if_expr_stmt_else.0.stdout \
src/tests/usr.bin/indent/token-keyword_do.0 \
src/tests/usr.bin/indent/token-keyword_do.0.pro \
src/tests/usr.bin/indent/token-keyword_do.0.stdout \
src/tests/usr.bin/indent/token-keyword_do_else.0 \
src/tests/usr.bin/indent/token-keyword_do_else.0.pro \
src/tests/usr.bin/indent/token-keyword_else.0.pro \
src/tests/usr.bin/indent/token-keyword_for_if_while.0 \
src/tests/usr.bin/indent/token-keyword_for_if_while.0.pro \
src/tests/usr.bin/indent/token-keyword_for_if_while.0.stdout \
src/tests/usr.bin/indent/token-keyword_struct_union_enum.0 \
src/tests/usr.bin/indent/token-keyword_struct_union_enum.0.pro \
src/tests/usr.bin/indent/token-keyword_struct_union_enum.0.stdout \
src/tests/usr.bin/indent/token-lbrace.0 \
src/tests/usr.bin/indent/token-lbrace.0.pro \
src/tests/usr.bin/indent/token-lbrace.0.stdout \
src/tests/usr.bin/indent/token-newline.0 \
src/tests/usr.bin/indent/token-newline.0.pro \
src/tests/usr.bin/indent/token-newline.0.stdout \
src/tests/usr.bin/indent/token-period.0 \
src/tests/usr.bin/indent/token-period.0.pro \
src/tests/usr.bin/indent/token-period.0.stdout \
src/tests/usr.bin/indent/token-postfix_op.0 \
src/tests/usr.bin/indent/token-postfix_op.0.pro \
src/tests/usr.bin/indent/token-postfix_op.0.stdout \
src/tests/usr.bin/indent/token-preprocessing.0.pro \
src/tests/usr.bin/indent/token-question.0 \
src/tests/usr.bin/indent/token-question.0.pro \
src/tests/usr.bin/indent/token-question.0.stdout \
src/tests/usr.bin/indent/token-rbrace.0 \
src/tests/usr.bin/indent/token-rbrace.0.pro \
src/tests/usr.bin/indent/token-rbrace.0.stdout \
src/tests/usr.bin/indent/token-rparen.0 \
src/tests/usr.bin/indent/token-rparen.0.pro \
src/tests/usr.bin/indent/token-rparen.0.stdout \
src/tests/usr.bin/indent/token-semicolon.0 \
src/tests/usr.bin/indent/token-semicolon.0.pro \
src/tests/usr.bin/indent/token-semicolon.0.stdout \
src/tests/usr.bin/indent/token-stmt.0 \
src/tests/usr.bin/indent/token-stmt.0.pro \
src/tests/usr.bin/indent/token-stmt.0.stdout \
src/tests/usr.bin/indent/token-stmt_list.0 \
src/tests/usr.bin/indent/token-stmt_list.0.pro \
src/tests/usr.bin/indent/token-stmt_list.0.stdout \
src/tests/usr.bin/indent/token-storage_class.0 \
src/tests/usr.bin/indent/token-storage_class.0.pro \
src/tests/usr.bin/indent/token-storage_class.0.stdout \
src/tests/usr.bin/indent/token-string_prefix.0 \
src/tests/usr.bin/indent/token-string_prefix.0.pro \
src/tests/usr.bin/indent/token-string_prefix.0.stdout \
src/tests/usr.bin/indent/token-switch_expr.0 \
src/tests/usr.bin/indent/token-switch_expr.0.pro \
src/tests/usr.bin/indent/token-switch_expr.0.stdout \
src/tests/usr.bin/indent/token-type_def.0 \
src/tests/usr.bin/indent/token-type_def.0.pro \
src/tests/usr.bin/indent/token-type_def.0.stdout \
src/tests/usr.bin/indent/token-unary_op.0 \
src/tests/usr.bin/indent/token-unary_op.0.pro \
src/tests/usr.bin/indent/token-unary_op.0.stdout \
src/tests/usr.bin/indent/token-while_expr.0.pro
cvs rdiff -u -r1.3 -r0 src/tests/usr.bin/indent/token-lparen.0
cvs rdiff -u -r1.5 -r0 src/tests/usr.bin/indent/token-lparen.0.stdout
cvs rdiff -u -r1.6 -r0 src/tests/usr.bin/indent/token-preprocessing.0
cvs rdiff -u -r1.8 -r0 src/tests/usr.bin/indent/token-preprocessing.0.stdout
cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/indent/token_binary_op.c \
src/tests/usr.bin/indent/token_case_label.c \
src/tests/usr.bin/indent/token_colon.c \
src/tests/usr.bin/indent/token_comma.c \
src/tests/usr.bin/indent/token_decl.c \
src/tests/usr.bin/indent/token_do_stmt.c \
src/tests/usr.bin/indent/token_end_of_file.c \
src/tests/usr.bin/indent/token_for_exprs.c \
src/tests/usr.bin/indent/token_form_feed.c \
src/tests/usr.bin/indent/token_funcname.c \
src/tests/usr.bin/indent/token_if_expr.c \
src/tests/usr.bin/indent/token_if_expr_stmt.c \
src/tests/usr.bin/indent/token_if_expr_stmt_else.c \
src/tests/usr.bin/indent/token_keyword_do.c \
src/tests/usr.bin/indent/token_keyword_do_else.c \
src/tests/usr.bin/indent/token_keyword_else.c \
src/tests/usr.bin/indent/token_keyword_for_if_while.c \
src/tests/usr.bin/indent/token_keyword_struct_union_enum.c \
src/tests/usr.bin/indent/token_lbrace.c \
src/tests/usr.bin/indent/token_lparen.c \
src/tests/usr.bin/indent/token_newline.c \
src/tests/usr.bin/indent/token_period.c \
src/tests/usr.bin/indent/token_postfix_op.c \
src/tests/usr.bin/indent/token_preprocessing.c \
src/tests/usr.bin/indent/token_question.c \
src/tests/usr.bin/indent/token_rbrace.c \
src/tests/usr.bin/indent/token_rparen.c \
src/tests/usr.bin/indent/token_semicolon.c \
src/tests/usr.bin/indent/token_stmt.c \
src/tests/usr.bin/indent/token_stmt_list.c \
src/tests/usr.bin/indent/token_storage_class.c \
src/tests/usr.bin/indent/token_string_prefix.c \
src/tests/usr.bin/indent/token_switch_expr.c \
src/tests/usr.bin/indent/token_type_def.c \
src/tests/usr.bin/indent/token_unary_op.c \
src/tests/usr.bin/indent/token_while_expr.c
cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/indent/token_comment.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1144 src/distrib/sets/lists/tests/mi:1.1145
--- src/distrib/sets/lists/tests/mi:1.1144 Mon Oct 18 20:18:00 2021
+++ src/distrib/sets/lists/tests/mi Mon Oct 18 22:30:34 2021
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1144 2021/10/18 20:18:00 rillig Exp $
+# $NetBSD: mi,v 1.1145 2021/10/18 22:30:34 rillig Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -5036,120 +5036,120 @@
./usr/tests/usr.bin/indent/t_misc tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/indent/t_options tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/indent/t_options.awk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-binary_op.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-binary_op.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-binary_op.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-case_label.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-case_label.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-case_label.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-colon.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-colon.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-colon.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-comma.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-comma.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-comma.0.stdout tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/indent/token-binary_op.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-binary_op.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-binary_op.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-case_label.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-case_label.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-case_label.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-colon.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-colon.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-colon.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-comma.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-comma.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-comma.0.stdout tests-obsolete obsolete,atf
./usr/tests/usr.bin/indent/token-comment.0 tests-obsolete obsolete,atf
./usr/tests/usr.bin/indent/token-comment.0.pro tests-obsolete obsolete,atf
./usr/tests/usr.bin/indent/token-comment.0.stdout tests-obsolete obsolete,atf
-./usr/tests/usr.bin/indent/token-decl.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-decl.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-decl.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-do_stmt.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-do_stmt.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-do_stmt.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-end_of_file.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-end_of_file.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-end_of_file.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-for_exprs.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-for_exprs.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-for_exprs.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-form_feed.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-form_feed.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-form_feed.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-funcname.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-funcname.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-funcname.0.stdout tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/indent/token-decl.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-decl.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-decl.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-do_stmt.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-do_stmt.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-do_stmt.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-end_of_file.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-end_of_file.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-end_of_file.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-for_exprs.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-for_exprs.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-for_exprs.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-form_feed.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-form_feed.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-form_feed.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-funcname.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-funcname.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-funcname.0.stdout tests-obsolete obsolete,atf
./usr/tests/usr.bin/indent/token-ident.0 tests-obsolete obsolete,atf
./usr/tests/usr.bin/indent/token-ident.0.pro tests-obsolete obsolete,atf
./usr/tests/usr.bin/indent/token-ident.0.stdout tests-obsolete obsolete,atf
-./usr/tests/usr.bin/indent/token-if_expr.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr_stmt.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr_stmt.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr_stmt.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr_stmt_else.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr_stmt_else.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-if_expr_stmt_else.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_do.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_do.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_do.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_do_else.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_do_else.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_do_else.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_else.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_else.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_else.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_for_if_while.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_for_if_while.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_for_if_while.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_struct_union_enum.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_struct_union_enum.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-keyword_struct_union_enum.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-lbrace.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-lbrace.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-lbrace.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-lparen.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-lparen.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-lparen.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-newline.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-newline.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-newline.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-period.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-period.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-period.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-postfix_op.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-postfix_op.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-postfix_op.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-preprocessing.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-preprocessing.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-preprocessing.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-question.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-question.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-question.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-rbrace.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-rbrace.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-rbrace.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-rparen.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-rparen.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-rparen.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-semicolon.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-semicolon.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-semicolon.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-stmt.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-stmt.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-stmt.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-stmt_list.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-stmt_list.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-stmt_list.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-storage_class.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-storage_class.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-storage_class.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-string_prefix.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-string_prefix.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-string_prefix.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-switch_expr.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-switch_expr.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-switch_expr.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-type_def.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-type_def.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-type_def.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-unary_op.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-unary_op.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-unary_op.0.stdout tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-while_expr.0 tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-while_expr.0.pro tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/indent/token-while_expr.0.stdout tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/indent/token-if_expr.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr_stmt.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr_stmt.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr_stmt.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr_stmt_else.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr_stmt_else.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-if_expr_stmt_else.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_do.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_do.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_do.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_do_else.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_do_else.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_do_else.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_else.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_else.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_else.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_for_if_while.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_for_if_while.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_for_if_while.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_struct_union_enum.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_struct_union_enum.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-keyword_struct_union_enum.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-lbrace.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-lbrace.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-lbrace.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-lparen.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-lparen.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-lparen.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-newline.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-newline.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-newline.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-period.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-period.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-period.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-postfix_op.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-postfix_op.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-postfix_op.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-preprocessing.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-preprocessing.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-preprocessing.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-question.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-question.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-question.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-rbrace.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-rbrace.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-rbrace.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-rparen.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-rparen.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-rparen.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-semicolon.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-semicolon.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-semicolon.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-stmt.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-stmt.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-stmt.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-stmt_list.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-stmt_list.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-stmt_list.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-storage_class.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-storage_class.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-storage_class.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-string_prefix.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-string_prefix.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-string_prefix.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-switch_expr.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-switch_expr.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-switch_expr.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-type_def.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-type_def.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-type_def.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-unary_op.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-unary_op.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-unary_op.0.stdout tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-while_expr.0 tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-while_expr.0.pro tests-obsolete obsolete,atf
+./usr/tests/usr.bin/indent/token-while_expr.0.stdout tests-obsolete obsolete,atf
./usr/tests/usr.bin/indent/token_comment.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/indent/token_ident.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/indent/types_from_file.0 tests-usr.bin-tests compattestfile,atf
Index: src/tests/usr.bin/indent/Makefile
diff -u src/tests/usr.bin/indent/Makefile:1.19 src/tests/usr.bin/indent/Makefile:1.20
--- src/tests/usr.bin/indent/Makefile:1.19 Mon Oct 18 20:18:00 2021
+++ src/tests/usr.bin/indent/Makefile Mon Oct 18 22:30:34 2021
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.19 2021/10/18 20:18:00 rillig Exp $
+# $NetBSD: Makefile,v 1.20 2021/10/18 22:30:34 rillig Exp $
.include <bsd.own.mk>
@@ -146,116 +146,44 @@ FILES+= surplusbad.0
FILES+= surplusbad.0.stdout
FILES+= surplusbad.0.pro
FILES+= t_options.awk
-FILES+= token-binary_op.0
-FILES+= token-binary_op.0.pro
-FILES+= token-binary_op.0.stdout
-FILES+= token-case_label.0
-FILES+= token-case_label.0.pro
-FILES+= token-case_label.0.stdout
-FILES+= token-colon.0
-FILES+= token-colon.0.pro
-FILES+= token-colon.0.stdout
-FILES+= token-comma.0
-FILES+= token-comma.0.pro
-FILES+= token-comma.0.stdout
-FILES+= token-decl.0
-FILES+= token-decl.0.pro
-FILES+= token-decl.0.stdout
-FILES+= token-do_stmt.0
-FILES+= token-do_stmt.0.pro
-FILES+= token-do_stmt.0.stdout
-FILES+= token-end_of_file.0
-FILES+= token-end_of_file.0.pro
-FILES+= token-end_of_file.0.stdout
-FILES+= token-for_exprs.0
-FILES+= token-for_exprs.0.pro
-FILES+= token-for_exprs.0.stdout
-FILES+= token-form_feed.0
-FILES+= token-form_feed.0.pro
-FILES+= token-form_feed.0.stdout
-FILES+= token-funcname.0
-FILES+= token-funcname.0.pro
-FILES+= token-funcname.0.stdout
-FILES+= token-if_expr.0
-FILES+= token-if_expr.0.pro
-FILES+= token-if_expr.0.stdout
-FILES+= token-if_expr_stmt.0
-FILES+= token-if_expr_stmt.0.pro
-FILES+= token-if_expr_stmt.0.stdout
-FILES+= token-if_expr_stmt_else.0
-FILES+= token-if_expr_stmt_else.0.pro
-FILES+= token-if_expr_stmt_else.0.stdout
-FILES+= token-keyword_do.0
-FILES+= token-keyword_do.0.pro
-FILES+= token-keyword_do.0.stdout
-FILES+= token-keyword_do_else.0
-FILES+= token-keyword_do_else.0.pro
-FILES+= token-keyword_do_else.0.stdout
-FILES+= token-keyword_else.0
-FILES+= token-keyword_else.0.pro
-FILES+= token-keyword_else.0.stdout
-FILES+= token-keyword_for_if_while.0
-FILES+= token-keyword_for_if_while.0.pro
-FILES+= token-keyword_for_if_while.0.stdout
-FILES+= token-keyword_struct_union_enum.0
-FILES+= token-keyword_struct_union_enum.0.pro
-FILES+= token-keyword_struct_union_enum.0.stdout
-FILES+= token-lbrace.0
-FILES+= token-lbrace.0.pro
-FILES+= token-lbrace.0.stdout
-FILES+= token-lparen.0
-FILES+= token-lparen.0.pro
-FILES+= token-lparen.0.stdout
-FILES+= token-newline.0
-FILES+= token-newline.0.pro
-FILES+= token-newline.0.stdout
-FILES+= token-period.0
-FILES+= token-period.0.pro
-FILES+= token-period.0.stdout
-FILES+= token-postfix_op.0
-FILES+= token-postfix_op.0.pro
-FILES+= token-postfix_op.0.stdout
-FILES+= token-preprocessing.0
-FILES+= token-preprocessing.0.pro
-FILES+= token-preprocessing.0.stdout
-FILES+= token-question.0
-FILES+= token-question.0.pro
-FILES+= token-question.0.stdout
-FILES+= token-rbrace.0
-FILES+= token-rbrace.0.pro
-FILES+= token-rbrace.0.stdout
-FILES+= token-rparen.0
-FILES+= token-rparen.0.pro
-FILES+= token-rparen.0.stdout
-FILES+= token-semicolon.0
-FILES+= token-semicolon.0.pro
-FILES+= token-semicolon.0.stdout
-FILES+= token-stmt.0
-FILES+= token-stmt.0.pro
-FILES+= token-stmt.0.stdout
-FILES+= token-stmt_list.0
-FILES+= token-stmt_list.0.pro
-FILES+= token-stmt_list.0.stdout
-FILES+= token-storage_class.0
-FILES+= token-storage_class.0.pro
-FILES+= token-storage_class.0.stdout
-FILES+= token-string_prefix.0
-FILES+= token-string_prefix.0.pro
-FILES+= token-string_prefix.0.stdout
-FILES+= token-switch_expr.0
-FILES+= token-switch_expr.0.pro
-FILES+= token-switch_expr.0.stdout
-FILES+= token-type_def.0
-FILES+= token-type_def.0.pro
-FILES+= token-type_def.0.stdout
-FILES+= token-unary_op.0
-FILES+= token-unary_op.0.pro
-FILES+= token-unary_op.0.stdout
-FILES+= token-while_expr.0
-FILES+= token-while_expr.0.pro
-FILES+= token-while_expr.0.stdout
+FILES+= token_binary_op.c
+FILES+= token_case_label.c
+FILES+= token_colon.c
+FILES+= token_comma.c
FILES+= token_comment.c
+FILES+= token_decl.c
+FILES+= token_do_stmt.c
+FILES+= token_end_of_file.c
+FILES+= token_for_exprs.c
+FILES+= token_form_feed.c
+FILES+= token_funcname.c
FILES+= token_ident.c
+FILES+= token_if_expr.c
+FILES+= token_if_expr_stmt.c
+FILES+= token_if_expr_stmt_else.c
+FILES+= token_keyword_do.c
+FILES+= token_keyword_do_else.c
+FILES+= token_keyword_else.c
+FILES+= token_keyword_for_if_while.c
+FILES+= token_keyword_struct_union_enum.c
+FILES+= token_lbrace.c
+FILES+= token_lparen.c
+FILES+= token_newline.c
+FILES+= token_period.c
+FILES+= token_postfix_op.c
+FILES+= token_preprocessing.c
+FILES+= token_question.c
+FILES+= token_rbrace.c
+FILES+= token_rparen.c
+FILES+= token_semicolon.c
+FILES+= token_stmt.c
+FILES+= token_stmt_list.c
+FILES+= token_storage_class.c
+FILES+= token_string_prefix.c
+FILES+= token_switch_expr.c
+FILES+= token_type_def.c
+FILES+= token_unary_op.c
+FILES+= token_while_expr.c
FILES+= types_from_file.0
FILES+= types_from_file.0.stdout
FILES+= types_from_file.0.list
Index: src/tests/usr.bin/indent/token_comment.c
diff -u src/tests/usr.bin/indent/token_comment.c:1.1 src/tests/usr.bin/indent/token_comment.c:1.2
--- src/tests/usr.bin/indent/token_comment.c:1.1 Mon Oct 18 19:36:30 2021
+++ src/tests/usr.bin/indent/token_comment.c Mon Oct 18 22:30:34 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: token_comment.c,v 1.1 2021/10/18 19:36:30 rillig Exp $ */
+/* $NetBSD: token_comment.c,v 1.2 2021/10/18 22:30:34 rillig Exp $ */
/* $FreeBSD$ */
/*
@@ -43,6 +43,330 @@
* - with/without ps.last_nl
*/
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "indent.h"
+
+static void
+com_add_char(char ch)
+{
+ if (com.e + 1 >= com.l)
+ buf_expand(&com, 1);
+ *com.e++ = ch;
+}
+
+static void
+com_add_delim(void)
+{
+ if (!opt.star_comment_cont)
+ return;
+ size_t len = 3;
+ if (com.e + len >= com.l)
+ buf_expand(&com, len);
+ memcpy(com.e, " * ", len);
+ com.e += len;
+}
+
+static void
+com_terminate(void)
+{
+ if (com.e + 1 >= com.l)
+ buf_expand(&com, 1);
+ *com.e = '\0';
+}
+
+static bool
+fits_in_one_line(int max_line_length)
+{
+ for (const char *p = inp.s; *p != '\n'; p++) {
+ assert(*p != '\0');
+ assert(inp.e - p >= 2);
+ if (!(p[0] == '*' && p[1] == '/'))
+ continue;
+
+ int len = indentation_after_range(ps.com_ind + 3, inp.s, p);
+ len += is_hspace(p[-1]) ? 2 : 3;
+ if (len <= max_line_length)
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Scan, reformat and output a single comment, which is either a block comment
+ * starting with '/' '*' or an end-of-line comment starting with '//'.
+ *
+ * Try to keep comments from going over the maximum line length. If a line is
+ * too long, move everything starting from the last blank to the next comment
+ * line. Blanks and tabs from the beginning of the input line are removed.
+ *
+ * ALGORITHM:
+ * 1) Decide where the comment should be aligned, and if lines should
+ * be broken.
+ * 2) If lines should not be broken and filled, just copy up to end of
+ * comment.
+ * 3) If lines should be filled, then scan through the input buffer,
+ * copying characters to com_buf. Remember where the last blank,
+ * tab, or newline was. When line is filled, print up to last blank
+ * and continue copying.
+ */
+void
+process_comment(void)
+{
+ int adj_max_line_length; /* Adjusted max_line_length for comments that
+ * spill over the right margin */
+ ssize_t last_blank; /* index of the last blank in com.buf */
+ bool break_delim = opt.comment_delimiter_on_blankline;
+ int l_just_saw_decl = ps.just_saw_decl;
+ int com_ind;
+
+ adj_max_line_length = opt.max_line_length;
+ ps.just_saw_decl = 0;
+ last_blank = -1; /* no blanks found so far */
+ bool may_wrap = true;
+ ps.stats.comments++;
+
+ /* Figure where to align and how to treat the comment */
+
+ if (ps.col_1 && !opt.format_col1_comments) {
+ may_wrap = false;
+ break_delim = false;
+ com_ind = 0;
+
+ } else {
+ if (*inp.s == '-' || *inp.s == '*' || token.e[-1] == '/' ||
+ (*inp.s == '\n' && !opt.format_block_comments)) {
+ may_wrap = false;
+ break_delim = false;
+ }
+
+ if (lab.s == lab.e && code.s == code.e) {
+ com_ind = (ps.ind_level - opt.unindent_displace) * opt.indent_size;
+ adj_max_line_length = opt.block_comment_max_line_length;
+ if (com_ind <= 0)
+ com_ind = opt.format_col1_comments ? 0 : 1;
+
+ } else {
+ break_delim = false;
+
+ int target_ind;
+ if (code.s != code.e)
+ target_ind = indentation_after(compute_code_indent(), code.s);
+ else if (lab.s != lab.e)
+ target_ind = indentation_after(compute_label_indent(), lab.s);
+ else
+ target_ind = 0;
+
+ com_ind = ps.decl_on_line || ps.ind_level == 0
+ ? opt.decl_comment_column - 1 : opt.comment_column - 1;
+ if (com_ind <= target_ind)
+ com_ind = next_tab(target_ind);
+ if (com_ind + 25 > adj_max_line_length)
+ adj_max_line_length = com_ind + 25;
+ }
+ }
+
+ ps.com_ind = com_ind;
+
+ if (!may_wrap) {
+ /*
+ * Find out how much indentation there was originally, because that
+ * much will have to be ignored by dump_line(). This is a box comment,
+ * so nothing changes -- not even indentation.
+ *
+ * The comment we're about to read usually comes from inp.buf,
+ * unless it has been copied into save_com.
+ */
+ const char *start;
+
+ /*
+ * XXX: ordered comparison between pointers from different objects
+ * invokes undefined behavior (C99 6.5.8).
+ */
+ start = inp.s >= save_com && inp.s < save_com + sc_size ?
+ sc_buf : inp.buf;
+ ps.n_comment_delta = -indentation_after_range(0, start, inp.s - 2);
+ } else {
+ ps.n_comment_delta = 0;
+ while (is_hspace(*inp.s))
+ inp.s++;
+ }
+
+ ps.comment_delta = 0;
+ com_add_char('/');
+ com_add_char(token.e[-1]); /* either '*' or '/' */
+ if (*inp.s != ' ' && may_wrap)
+ com_add_char(' ');
+
+ if (break_delim && fits_in_one_line(adj_max_line_length))
+ break_delim = false;
+
+ if (break_delim) {
+ char *t = com.e;
+ com.e = com.s + 2;
+ *com.e = '\0';
+ if (opt.blanklines_before_block_comments && ps.last_token != lbrace)
+ prefix_blankline_requested = true;
+ dump_line();
+ com.e = com.s = t;
+ com_add_delim();
+ }
+
+ /* Start to copy the comment */
+
+ for (;;) { /* this loop will go until the comment is
+ * copied */
+ switch (*inp.s) { /* this checks for various special cases */
+ case '\f':
+ if (may_wrap) { /* in a text comment, break the line here */
+ ps.use_ff = true;
+ dump_line();
+ last_blank = -1;
+ com_add_delim();
+ inp.s++;
+ while (is_hspace(*inp.s))
+ inp.s++;
+ } else {
+ inbuf_skip();
+ com_add_char('\f');
+ }
+ break;
+
+ case '\n':
+ if (token.e[-1] == '/')
+ goto end_of_line_comment;
+
+ if (had_eof) {
+ diag(1, "Unterminated comment");
+ dump_line();
+ return;
+ }
+
+ last_blank = -1;
+ if (!may_wrap || ps.last_nl) { /* if this is a boxed comment,
+ * we handle the newline */
+ if (com.s == com.e)
+ com_add_char(' ');
+ if (may_wrap && com.e - com.s > 3) {
+ dump_line();
+ com_add_delim();
+ }
+ dump_line();
+ if (may_wrap)
+ com_add_delim();
+
+ } else {
+ ps.last_nl = true;
+ if (!is_hspace(com.e[-1]))
+ com_add_char(' ');
+ last_blank = com.e - 1 - com.buf;
+ }
+ ++line_no;
+ if (may_wrap) {
+ bool skip_asterisk = true;
+ do { /* flush any blanks and/or tabs at start of
+ * next line */
+ inbuf_skip();
+ if (*inp.s == '*' && skip_asterisk) {
+ skip_asterisk = false;
+ inbuf_skip();
+ if (*inp.s == '/')
+ goto end_of_comment;
+ }
+ } while (is_hspace(*inp.s));
+ } else
+ inbuf_skip();
+ break; /* end of case for newline */
+
+ case '*':
+ inbuf_skip();
+ if (*inp.s == '/') {
+ end_of_comment:
+ inbuf_skip();
+
+ end_of_line_comment:
+ if (break_delim) {
+ if (com.e > com.s + 3)
+ dump_line();
+ else
+ com.s = com.e; /* XXX: why not e = s? */
+ com_add_char(' ');
+ }
+
+ if (!is_hspace(com.e[-1]) && may_wrap)
+ com_add_char(' ');
+ if (token.e[-1] != '/') {
+ com_add_char('*');
+ com_add_char('/');
+ }
+ com_terminate();
+
+ ps.just_saw_decl = l_just_saw_decl;
+ return;
+
+ } else /* handle isolated '*' */
+ com_add_char('*');
+ break;
+
+ default: /* we have a random char */
+ ;
+ int now_len = indentation_after_range(ps.com_ind, com.s, com.e);
+ for (;;) {
+ char ch = inbuf_next();
+ if (is_hspace(ch))
+ last_blank = com.e - com.buf;
+ com_add_char(ch);
+ now_len++;
+ if (memchr("*\n\r\b\t", *inp.s, 6) != NULL)
+ break;
+ if (now_len >= adj_max_line_length && last_blank != -1)
+ break;
+ }
+
+ ps.last_nl = false;
+
+ /* XXX: signed character comparison '>' does not work for UTF-8 */
+ if (now_len > adj_max_line_length &&
+ may_wrap && com.e[-1] > ' ') {
+
+ /* the comment is too long, it must be broken up */
+ if (last_blank == -1) {
+ dump_line();
+ com_add_delim();
+ break;
+ }
+
+ com_terminate(); /* mark the end of the last word */
+ com.e = com.buf + last_blank;
+ dump_line();
+
+ com_add_delim();
+
+ const char *p = com.buf + last_blank + 1;
+ while (is_hspace(*p))
+ p++;
+ last_blank = -1;
+
+ /*
+ * p still points to the last word from the previous line, in
+ * the same buffer that it is copied to, but to the right of
+ * the writing region [com.s, com.e). Calling dump_line only
+ * moved com.e back to com.s, it did not clear the contents of
+ * the buffer. This ensures that the buffer is already large
+ * enough.
+ */
+ while (*p != '\0') {
+ assert(!is_hspace(*p));
+ *com.e++ = *p++;
+ }
+ }
+ break;
+ }
+ }
+}
+
/* For variations on this theme, try some of these options: */
/* -c20 */
/* -cd20 */
Added files:
Index: src/tests/usr.bin/indent/token_binary_op.c
diff -u /dev/null src/tests/usr.bin/indent/token_binary_op.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_binary_op.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,220 @@
+/* $NetBSD: token_binary_op.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for binary operators like '+', '&&' and several others.
+ *
+ * Several binary operators can be used as unary operators as well, or in
+ * other contexts. An example for such an operator is '*', which can be a
+ * multiplication, or pointer dereference, or pointer type declaration.
+ */
+
+/* See C99 6.4.6 */
+#indent input
+void
+punctuators(void)
+{
+ int brackets = array[subscript];
+ int parentheses = function(argument);
+ int braces = { initializer };
+ int period = structure.member;
+ int arrow = structure->member;
+
+ ++prefix_increment;
+ postfix_increment++;
+ --prefix_decrement;
+ postfix_decrement--;
+ int *address = &lvalue;
+ int bitwise_and = value & mask;
+ int product = factor * factor;
+ int dereferenced = *address;
+ int positive = +number;
+ int sum = number + number;
+ int negative = -number;
+ int difference = number - number;
+ bool negated = !condition;
+
+ int quotient = number / number;
+ int modulo = number % number;
+ int shifted_left = number << number;
+ int shifted_right = number >> number;
+ bool less_than = number < number;
+ bool greater_than = number > number;
+ bool less_equal = number <= number;
+ bool greater_equal = number >= number;
+ bool equal = number == number;
+ bool unequal = number != number;
+ int bitwise_exclusive_or = number ^ number;
+ int bitwise_or = number | number;
+ bool logical_and = condition && condition;
+ bool logical_or = condition || condition;
+
+ int conditional = condition ? number : number;
+
+ /* combined assignment operators */
+ number = (expression);
+ number *= number;
+ number /= number;
+ number %= number;
+ number += number;
+ number -= number;
+ number <<= number;
+ number >>= number;
+ number &= number;
+ number ^= number;
+ number |= number;
+
+ number = function(argument1, argument2);
+ number = function(argument), number;
+
+ /* digraphs */
+ number = array<:subscript:>;
+ number = (int)<% initializer %>;
+}
+#indent end
+
+#indent run -ldi0
+void
+punctuators(void)
+{
+ int brackets = array[subscript];
+ int parentheses = function(argument);
+/* $ XXX: The spaces around the initializer are gone. */
+ int braces = {initializer};
+ int period = structure.member;
+ int arrow = structure->member;
+
+ ++prefix_increment;
+ postfix_increment++;
+ --prefix_decrement;
+ postfix_decrement--;
+ int *address = &lvalue;
+ int bitwise_and = value & mask;
+ int product = factor * factor;
+ int dereferenced = *address;
+ int positive = +number;
+ int sum = number + number;
+ int negative = -number;
+ int difference = number - number;
+ bool negated = !condition;
+
+ int quotient = number / number;
+ int modulo = number % number;
+ int shifted_left = number << number;
+ int shifted_right = number >> number;
+ bool less_than = number < number;
+ bool greater_than = number > number;
+ bool less_equal = number <= number;
+ bool greater_equal = number >= number;
+ bool equal = number == number;
+ bool unequal = number != number;
+ int bitwise_exclusive_or = number ^ number;
+ int bitwise_or = number | number;
+ bool logical_and = condition && condition;
+ bool logical_or = condition || condition;
+
+ int conditional = condition ? number : number;
+
+ /* combined assignment operators */
+ number = (expression);
+ number *= number;
+ number /= number;
+ number %= number;
+ number += number;
+ number -= number;
+ number <<= number;
+ number >>= number;
+ number &= number;
+ number ^= number;
+ number |= number;
+
+ number = function(argument1, argument2);
+ number = function(argument), number;
+
+ /* digraphs */
+/* $ XXX: indent is confused by the digraphs for '[' and ']'. */
+/* $ This probably doesn't matter since digraphs are not used in practice. */
+number = array <:subscript:>;
+ number = (int)<%initializer % >;
+}
+#indent end
+
+#indent input
+void
+peculiarities(void)
+{
+ /*
+ * When indent tokenizes some of the operators, it allows for
+ * arbitrary repetitions of the operator character, followed by an
+ * arbitrary amount of '='. This is used for operators like '&&' or
+ * '|||==='.
+ *
+ * Before 2021-03-07 22:11:01, the comment '//' was treated as an
+ * operator as well, and so was the comment '/////', leading to
+ * unexpected results; see comment-line-end.0 for more details.
+ *
+ * See lexi.c, lexi, "default:".
+ */
+ if (a &&&&&&& b)
+ return;
+ if (a |||=== b)
+ return;
+
+ /*-
+ * For '+' and '-', this does not work since the lexer has to
+ * distinguish between '++' and '+' early. The following sequence is
+ * thus tokenized as:
+ *
+ * ident 'a'
+ * postfix '++'
+ * binary_op '++'
+ * unary_op '++'
+ * unary_op '+'
+ * ident 'b'
+ *
+ * See lexi.c, lexi, "case '+':".
+ */
+ if (a +++++++ b)
+ return;
+}
+#indent end
+
+#indent run -ldi0
+void
+peculiarities(void)
+{
+ /*
+ * When indent tokenizes some of the operators, it allows for
+ * arbitrary repetitions of the operator character, followed by an
+ * arbitrary amount of '='. This is used for operators like '&&' or
+ * '|||==='.
+ *
+ * Before 2021-03-07 22:11:01, the comment '//' was treated as an
+ * operator as well, and so was the comment '/////', leading to
+ * unexpected results; see comment-line-end.0 for more details.
+ *
+ * See lexi.c, lexi, "default:".
+ */
+ if (a &&&&&&& b)
+ return;
+ if (a |||=== b)
+ return;
+
+ /*-
+ * For '+' and '-', this does not work since the lexer has to
+ * distinguish between '++' and '+' early. The following sequence is
+ * thus tokenized as:
+ *
+ * ident 'a'
+ * postfix '++'
+ * binary_op '++'
+ * unary_op '++'
+ * unary_op '+'
+ * ident 'b'
+ *
+ * See lexi.c, lexi, "case '+':".
+ */
+ if (a++ ++ +++b)
+ return;
+}
+#indent end
Index: src/tests/usr.bin/indent/token_case_label.c
diff -u /dev/null src/tests/usr.bin/indent/token_case_label.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_case_label.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,47 @@
+/* $NetBSD: token_case_label.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for formatting of case labels in switch statements.
+ */
+
+#indent input
+void function(void){switch(expr){case 1:;case 2:break;case 3:switch(
+inner){case 4:break;}}}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ switch (expr) {
+ case 1: ;
+ case 2:
+ break;
+ case 3:
+ switch (
+ inner) {
+ case 4:
+ break;
+ }
+ }
+}
+#indent end
+
+#indent run -cli0.5
+void
+function(void)
+{
+ switch (expr) {
+ case 1:;
+ case 2:
+ break;
+ case 3:
+ switch (
+ inner) {
+ case 4:
+ break;
+ }
+ }
+}
+#indent end
Index: src/tests/usr.bin/indent/token_colon.c
diff -u /dev/null src/tests/usr.bin/indent/token_colon.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_colon.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,72 @@
+/* $NetBSD: token_colon.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for formatting of the colon token, which is used in the following
+ * contexts:
+ *
+ * After a label that is the target of a goto statement.
+ *
+ * In a switch statement, after a case label or the default label.
+ *
+ * As part of the conditional expression operator '?:'.
+ *
+ * In the declaration of a struct member that is a bit-field.
+ */
+
+#indent input
+void endless(void)
+{
+label1:
+goto label2;
+
+ if (true)if (true)if (true)if (true)label2 :goto label1;
+}
+#indent end
+
+#indent run
+void
+endless(void)
+{
+label1:
+ goto label2;
+
+ if (true)
+ if (true)
+ if (true)
+ if (true)
+ label2: goto label1;
+}
+#indent end
+
+#indent input
+int constant_expression = true?4:12345;
+#indent end
+
+#indent run
+int constant_expression = true ? 4 : 12345;
+#indent end
+
+#indent input
+struct bit_field {
+bool flag:1;
+int maybe_signed : 4;
+signed int definitely_signed:3;
+signed int : 0;/* finish the storage unit for the bit-field */
+unsigned int definitely_unsigned:3;
+unsigned int:0;/* finish the storage unit for the bit-field */
+};
+#indent end
+
+#indent run
+struct bit_field {
+ bool flag:1;
+ int maybe_signed:4;
+ signed int definitely_signed:3;
+/* $ XXX: Placing the colon directly at the type looks inconsistent. */
+ signed int: 0; /* finish the storage unit for the bit-field */
+ unsigned int definitely_unsigned:3;
+/* $ XXX: Placing the colon directly at the type looks inconsistent. */
+ unsigned int: 0; /* finish the storage unit for the bit-field */
+};
+#indent end
Index: src/tests/usr.bin/indent/token_comma.c
diff -u /dev/null src/tests/usr.bin/indent/token_comma.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_comma.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,59 @@
+/* $NetBSD: token_comma.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the comma, which is used in the following contexts:
+ *
+ * The binary operator ',' inserts a sequence point between the evaluation of
+ * its operands.
+ *
+ * The parameters of a function declaration or a macro definition are
+ * separated by a comma.
+ *
+ * The arguments of a function call expression or a macro invocation are
+ * separated by a comma.
+ */
+
+#indent input
+int
+comma_expression(void)
+{
+ return 1,3;
+ return a=b,c=d;
+}
+#indent end
+
+#indent run
+int
+comma_expression(void)
+{
+ return 1, 3;
+ return a = b, c = d;
+}
+#indent end
+
+/*
+ * A comma that occurs at the beginning of a line is probably part of an
+ * initializer list, placed there for alignment.
+ */
+#indent input
+int
+comma_at_beginning_of_line(void)
+{
+ return 1,
+ 3;
+ return 1
+ ,3;
+}
+#indent end
+
+#indent run -ci4
+int
+comma_at_beginning_of_line(void)
+{
+ return 1,
+ 3;
+ return 1
+ ,3;
+}
+#indent end
Index: src/tests/usr.bin/indent/token_decl.c
diff -u /dev/null src/tests/usr.bin/indent/token_decl.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_decl.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,32 @@
+/* $NetBSD: token_decl.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for declarations.
+ *
+ * Indent distinguishes global and local declarations.
+ *
+ * Declarations can be for functions or for variables.
+ */
+
+#indent input
+int global_var;
+int global_array = [1,2,3,4];
+int global_array = [
+1
+,2,
+3,
+4,
+];
+#indent end
+
+#indent run -di0
+int global_var;
+int global_array = [1, 2, 3, 4];
+int global_array = [
+ 1
+ ,2,
+ 3,
+ 4,
+];
+#indent end
Index: src/tests/usr.bin/indent/token_do_stmt.c
diff -u /dev/null src/tests/usr.bin/indent/token_do_stmt.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_do_stmt.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,30 @@
+/* $NetBSD: token_do_stmt.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for do-while statements.
+ */
+
+#indent input
+void function(void) {
+ do stmt(); while (0);
+ do { stmt(); } while (0);
+ do /* comment */ stmt(); while (0);
+}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ do
+ stmt();
+ while (0);
+ do {
+ stmt();
+ } while (0);
+ do /* comment */
+ stmt();
+ while (0);
+}
+#indent end
Index: src/tests/usr.bin/indent/token_end_of_file.c
diff -u /dev/null src/tests/usr.bin/indent/token_end_of_file.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_end_of_file.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,17 @@
+/* $NetBSD: token_end_of_file.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the end of a file.
+ *
+ * The end of a file typically occurs after a top-level declaration, or after
+ * a preprocessing directive. Everything else is a syntax error.
+ */
+
+#indent input
+int decl;
+#indent end
+
+#indent run
+int decl;
+#indent end
Index: src/tests/usr.bin/indent/token_for_exprs.c
diff -u /dev/null src/tests/usr.bin/indent/token_for_exprs.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_for_exprs.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,58 @@
+/* $NetBSD: token_for_exprs.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Test for 'for' loops.
+ *
+ * Most 'for' loops have 3 expressions in their head. Each of these
+ * expressions is optional though.
+ *
+ * When all 3 expressions are omitted, the 'for' loop is often called a
+ * 'forever' loop.
+ */
+
+#indent input
+void
+function(void)
+{
+ for (int i = 0; i < 6; i++)
+ print_char("hello\n"[i]);
+ forever {
+ stmt();
+ }
+}
+#indent end
+
+#indent run-equals-input
+
+
+/*
+ * Indent can cope with various syntax errors, which may be caused by
+ * syntactic macros like 'forever' or 'foreach'.
+ */
+#indent input
+#define forever for (;;)
+#define foreach(list, it) for (it = list.first; it != NULL; it = it->next)
+
+void
+function(void)
+{
+ forever
+ stmt();
+
+ forever {
+ stmt();
+ }
+
+/* $ No space after 'foreach' since it looks like a function name. */
+ foreach(list, it)
+ println(it->data);
+
+/* $ No space after 'foreach' since it looks like a function name. */
+ foreach(list, it) {
+ println(it->data);
+ }
+}
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_form_feed.c
diff -u /dev/null src/tests/usr.bin/indent/token_form_feed.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_form_feed.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,14 @@
+/* $NetBSD: token_form_feed.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for form feeds, which is a control character (C99 5.2.1p3).
+ */
+
+#indent input
+void function_1(void);
+
+void function_2(void);
+#indent end
+
+#indent run-equals-input -di0
Index: src/tests/usr.bin/indent/token_funcname.c
diff -u /dev/null src/tests/usr.bin/indent/token_funcname.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_funcname.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,18 @@
+/* $NetBSD: token_funcname.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for function names.
+ */
+
+#indent input
+void
+function(void)
+{
+ func();
+ (func)();
+ func(1, 2, 3);
+}
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_if_expr.c
diff -u /dev/null src/tests/usr.bin/indent/token_if_expr.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_if_expr.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,21 @@
+/* $NetBSD: token_if_expr.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for 'if' followed by a parenthesized expression.
+ */
+
+#indent input
+void function(void) {
+ if(cond) stmt();
+}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ if (cond)
+ stmt();
+}
+#indent end
Index: src/tests/usr.bin/indent/token_if_expr_stmt.c
diff -u /dev/null src/tests/usr.bin/indent/token_if_expr_stmt.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_if_expr_stmt.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,26 @@
+/* $NetBSD: token_if_expr_stmt.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for 'if' followed by a parenthesized expression and a statement.
+ *
+ * At this point, the 'if' statement is not necessarily complete, it can be
+ * completed with the keyword 'else' followed by a statement.
+ *
+ * Any token other than 'else' completes the 'if' statement.
+ */
+
+#indent input
+void
+function(void)
+{
+ if (cond)
+ stmt();
+ if (cond)
+ stmt();
+ else /* belongs to the second 'if' */
+ stmt();
+}
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_if_expr_stmt_else.c
diff -u /dev/null src/tests/usr.bin/indent/token_if_expr_stmt_else.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_if_expr_stmt_else.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,22 @@
+/* $NetBSD: token_if_expr_stmt_else.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for 'if' followed by a parenthesized expression, a statement and the
+ * keyword 'else'.
+ *
+ * At this point, the statement needs to be completed with another statement.
+ */
+
+#indent input
+void
+function(void)
+{
+ if (cond)
+ stmt();
+ else
+ stmt();
+}
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_keyword_do.c
diff -u /dev/null src/tests/usr.bin/indent/token_keyword_do.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_keyword_do.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,25 @@
+/* $NetBSD: token_keyword_do.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keyword 'do' that begins a do-while statement.
+ */
+
+#indent input
+void function(void) {
+ do stmt(); while (0);
+ do {} while (0);
+}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ do
+ stmt();
+ while (0);
+ do {
+ } while (0);
+}
+#indent end
Index: src/tests/usr.bin/indent/token_keyword_do_else.c
diff -u /dev/null src/tests/usr.bin/indent/token_keyword_do_else.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_keyword_do_else.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,31 @@
+/* $NetBSD: token_keyword_do_else.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keyword 'do' or 'else'. These two keywords are followed by
+ * a space. In contrast to 'for', 'if' and 'while', the space is not
+ * followed by a parenthesized expression.
+ */
+
+#indent input
+void
+function(void)
+{
+ do(var)--;while(var>0);
+ if(var>0)var=0;else(var=3);
+}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ do
+ (var)--;
+ while (var > 0);
+ if (var > 0)
+ var = 0;
+ else
+ (var = 3);
+}
+#indent end
Index: src/tests/usr.bin/indent/token_keyword_else.c
diff -u /dev/null src/tests/usr.bin/indent/token_keyword_else.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_keyword_else.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,47 @@
+/* $NetBSD: token_keyword_else.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keyword 'else'.
+ *
+ * When parsing nested incomplete 'if' statements, the problem of the
+ * 'dangling else' occurs. It is resolved by binding the 'else' to the
+ * innermost incomplete 'if' statement.
+ */
+
+/*
+ * In 'parse', an if_expr_stmt is reduced to a simple statement, unless the
+ * next token is 'else'. The comment does not influence this since it never
+ * reaches 'parse'.
+ */
+#indent input
+void
+example(bool cond)
+{
+ if (cond)
+ if (cond)
+ if (cond)
+ stmt();
+ else
+ stmt();
+ /* comment */
+ else
+ stmt();
+}
+#indent end
+
+#indent run
+void
+example(bool cond)
+{
+ if (cond)
+ if (cond)
+ if (cond)
+ stmt();
+ else
+ stmt();
+ /* comment */
+ else
+ stmt();
+}
+#indent end
Index: src/tests/usr.bin/indent/token_keyword_for_if_while.c
diff -u /dev/null src/tests/usr.bin/indent/token_keyword_for_if_while.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_keyword_for_if_while.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,36 @@
+/* $NetBSD: token_keyword_for_if_while.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keywords 'for', 'if' and 'while'. These keywords have in
+ * common that they are followed by a space and a parenthesized statement
+ * head. For 'if' and 'while', this head is a single expression. For 'for',
+ * the head is 0 to 3 expressions, separated by semicolons.
+ */
+
+#indent input
+void
+function(void)
+{
+ if(cond)stmt();
+ while(cond)stmt();
+ for(;cond;)stmt();
+ do stmt();while(cond);
+}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ if (cond)
+ stmt();
+ while (cond)
+ stmt();
+ for (; cond;)
+ stmt();
+ do
+ stmt();
+ while (cond);
+}
+#indent end
Index: src/tests/usr.bin/indent/token_keyword_struct_union_enum.c
diff -u /dev/null src/tests/usr.bin/indent/token_keyword_struct_union_enum.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_keyword_struct_union_enum.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,23 @@
+/* $NetBSD: token_keyword_struct_union_enum.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keywords 'struct', 'union' and 'enum'.
+ */
+
+#indent input
+struct stat {
+ mode_t st_mode;
+};
+
+union variant {
+ enum {
+ } tag;
+ int v_int;
+ long v_long;
+ bool v_bool;
+ void *v_pointer;
+};
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_lbrace.c
diff -u /dev/null src/tests/usr.bin/indent/token_lbrace.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_lbrace.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,26 @@
+/* $NetBSD: token_lbrace.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the token '{'.
+ *
+ * It is used as the start marker of a block of statements.
+ *
+ * It is used in initializers.
+ *
+ * In macro arguments, a '{' is an ordinary character, it does not need to be
+ * balanced. This is in contrast to '(', which must be balanced with ')'.
+ */
+
+#indent input
+void
+function(void)
+{
+ struct person p = {
+ .name = "Name",
+ .age = {{{35}}}, /* C11 6.7.9 allows this. */
+ };
+}
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_lparen.c
diff -u /dev/null src/tests/usr.bin/indent/token_lparen.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_lparen.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,94 @@
+/* $NetBSD: token_lparen.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the tokens '(', which has several possible meanings, and for '['.
+ *
+ * In an expression, '(' overrides the precedence rules by explicitly grouping
+ * a subexpression in parentheses.
+ *
+ * In an expression, '(' marks the beginning of a type cast or conversion.
+ *
+ * In a function call expression, '(' marks the beginning of the function
+ * arguments.
+ *
+ * In a type declaration, '(' marks the beginning of the function parameters.
+ */
+
+/* This is the maximum supported number of parentheses. */
+#indent input
+int zero = (((((((((((((((((((0)))))))))))))))))));
+#indent end
+
+#indent run-equals-input -di0
+
+
+#indent input
+void (*action)(void);
+#indent end
+
+#indent run-equals-input -di0
+
+
+#indent input
+#define macro(arg) ((arg) + 1)
+#indent end
+#indent run-equals-input -di0
+
+
+#indent input
+void
+function(void)
+{
+ other_function();
+ other_function("first", 2, "last argument"[4]);
+
+ if (false)(void)x;
+ if (false)(func)(arg);
+ if (false)(cond)?123:456;
+
+ /* C99 compound literal */
+ origin = (struct point){0,0};
+
+ /* GCC statement expression */
+ /* expr = ({if(expr)debug();expr;}); */
+/* $ XXX: Generates wrong 'Error@36: Unbalanced parens'. */
+}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ other_function();
+ other_function("first", 2, "last argument"[4]);
+
+ if (false)
+ (void)x;
+ if (false)
+ (func)(arg);
+ if (false)
+ (cond) ? 123 : 456;
+
+ /* C99 compound literal */
+ origin = (struct point){
+ 0, 0
+ };
+
+ /* GCC statement expression */
+ /* expr = ({if(expr)debug();expr;}); */
+}
+#indent end
+
+
+/*
+ * C99 designator initializers are the rare situation where there is a space
+ * before a '['.
+ */
+#indent input
+int array[] = {
+ 1, 2, [2] = 3, [3] = 4,
+};
+#indent end
+
+#indent run-equals-input -di0
Index: src/tests/usr.bin/indent/token_newline.c
diff -u /dev/null src/tests/usr.bin/indent/token_newline.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_newline.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,30 @@
+/* $NetBSD: token_newline.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*-
+ * Tests for the token '\n', which ends a line.
+ *
+ * A newline ends an end-of-line comment that has been started with '//'.
+ *
+ * When a line ends with a backslash immediately followed by '\n', these two
+ * characters are merged and continue the logical line (C11 5.1.1.2p1i2).
+ *
+ * In other contexts, a newline is an ordinary space character from a
+ * compiler's point of view. Indent preserves line breaks though.
+ */
+
+#indent input
+int var=
+1
+ +2
+ +3
+ +4;
+#indent end
+
+#indent run
+int var =
+1
++ 2
++ 3
++ 4;
+#indent end
Index: src/tests/usr.bin/indent/token_period.c
diff -u /dev/null src/tests/usr.bin/indent/token_period.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_period.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,33 @@
+/* $NetBSD: token_period.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the token '.'.
+ *
+ * The '.' in numbers such as 3.14159265358979 is not a token '.'.
+ *
+ * The token '.' is used to access a member of a struct or union.
+ */
+
+
+/*
+ * The ellipsis for the function parameter is a sequence of three '.' tokens.
+ * It would have been more intuitive to model them as a single token, but it
+ * doesn't make any difference for formatting the code.
+ */
+#indent input
+void my_printf(const char *, ...);
+#indent end
+
+#indent run-equals-input -di0
+
+
+#indent input
+int var = str.member;
+int var = str . member;
+#indent end
+
+#indent run -di0
+int var = str.member;
+int var = str.member;
+#indent end
Index: src/tests/usr.bin/indent/token_postfix_op.c
diff -u /dev/null src/tests/usr.bin/indent/token_postfix_op.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_postfix_op.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,19 @@
+/* $NetBSD: token_postfix_op.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the postfix increment and decrement operators '++' and '--'.
+ */
+
+#indent input
+void
+function(void)
+{
+ counter++;
+ ++counter; /* this is a prefix unary operator instead */
+ counter--;
+ --counter; /* this is a prefix unary operator instead */
+}
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_preprocessing.c
diff -u /dev/null src/tests/usr.bin/indent/token_preprocessing.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_preprocessing.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,183 @@
+/* $NetBSD: token_preprocessing.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*-
+ * Tests for indenting preprocessing directives:
+ *
+ * #define
+ * #ifdef
+ * #pragma
+ * #line
+ */
+
+
+#indent input
+#include <system-header.h>
+#include "local-header.h"
+#indent end
+
+#indent run-equals-input
+
+
+/*
+ * Nested conditional compilation.
+ */
+#indent input
+#if 0
+#else
+#endif
+
+#if 0 /* if comment */
+#else /* else comment */
+#endif /* endif comment */
+
+#if 0 /* outer if comment */
+# if nested /* inner if comment */
+# else /* inner else comment */
+# endif /* inner endif comment */
+#endif /* outer endif comment */
+#indent end
+
+#indent run
+#if 0
+#else
+#endif
+
+#if 0 /* if comment */
+#else /* else comment */
+#endif /* endif comment */
+
+#if 0 /* outer if comment */
+/* $ XXX: The indentation is removed, which can get confusing */
+#if nested /* inner if comment */
+#else /* inner else comment */
+#endif /* inner endif comment */
+#endif /* outer endif comment */
+#indent end
+
+
+#indent input
+#define multi_line_definition /* first line
+ * middle
+ * final line
+ */ actual_value
+#indent end
+
+#indent run-equals-input
+
+
+/*
+ * Before indent.c 1.129 from 2021-10-08, indent mistakenly interpreted quotes
+ * in comments as starting a string literal. The '"' in the comment started a
+ * string, the next '"' finished the string, and the following '/' '*' was
+ * interpreted as the beginning of a comment. This comment lasted until the
+ * next '*' '/', which in this test is another preprocessor directive, solely
+ * for symmetry.
+ *
+ * The effect was that the extra space after d2 was not formatted, as that
+ * line was considered part of the comment.
+ */
+#indent input
+#define comment_in_string_literal "/* no comment "
+int this_is_an_ordinary_line_again;
+
+int d1 ;
+#define confuse_d /*"*/ "/*"
+int d2 ;
+#define resolve_d "*/"
+int d3 ;
+
+int s1 ;
+#define confuse_s /*'*/ '/*'
+int s2 ;
+#define resolve_s '*/'
+int s3 ;
+#indent end
+
+#indent run
+#define comment_in_string_literal "/* no comment "
+int this_is_an_ordinary_line_again;
+
+int d1;
+#define confuse_d /*"*/ "/*"
+int d2;
+#define resolve_d "*/"
+int d3;
+
+int s1;
+#define confuse_s /*'*/ '/*'
+int s2;
+#define resolve_s '*/'
+int s3;
+#indent end
+
+
+/*
+ * A preprocessing directive inside an expression keeps the state about
+ * whether the next operator is unary or binary.
+ */
+#indent input
+int binary_plus = 3
+#define intermediate 1
+ +4;
+int unary_plus =
+#define intermediate 1
+ + 4;
+#indent end
+
+#indent run
+int binary_plus = 3
+#define intermediate 1
++ 4;
+int unary_plus =
+#define intermediate 1
++4;
+#indent end
+
+
+/*
+ * Preprocessing lines that don't expect an argument but have one are fixed.
+ * They are indented with a single tab.
+ */
+#indent input
+#if 0
+#elif 1
+#else if 3
+#endif 0
+#indent end
+
+#indent run
+#if 0
+#elif 1
+#else /* if 3 */
+#endif /* 0 */
+#indent end
+
+
+/*
+ * Existing comments are indented just like code comments.
+ *
+ * This means that the above wrong preprocessing lines (#else with argument)
+ * need to be fed through indent twice until they become stable. Since
+ * compilers issue warnings about these invalid lines, not much code still has
+ * these, making this automatic fix an edge case.
+ */
+#indent input
+#if 0 /* comment */
+#else /* comment */
+#endif /* comment */
+
+#if 0/* comment */
+#else/* comment */
+#endif/* comment */
+#indent end
+
+#indent run
+#if 0 /* comment */
+#else /* comment */
+#endif /* comment */
+
+#if 0 /* comment */
+#else /* comment */
+#endif /* comment */
+#indent end
Index: src/tests/usr.bin/indent/token_question.c
diff -u /dev/null src/tests/usr.bin/indent/token_question.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_question.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,14 @@
+/* $NetBSD: token_question.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the '?:' operator.
+ */
+
+#indent input
+int var = cond ? 1 : 0;
+
+int multi = cond ? 1 : cond ? 2 : cond ? 3 : 4;
+#indent end
+
+#indent run-equals-input -di0
Index: src/tests/usr.bin/indent/token_rbrace.c
diff -u /dev/null src/tests/usr.bin/indent/token_rbrace.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_rbrace.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,17 @@
+/* $NetBSD: token_rbrace.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the token '}', which ends the corresponding '{' token.
+ */
+
+#indent input
+void function(void){}
+#indent end
+
+#indent run
+void
+function(void)
+{
+}
+#indent end
Index: src/tests/usr.bin/indent/token_rparen.c
diff -u /dev/null src/tests/usr.bin/indent/token_rparen.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_rparen.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,18 @@
+/* $NetBSD: token_rparen.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the token ')', which ends the corresponding ')', as well as ']',
+ * which ends the corresponding ']'.
+ */
+
+#indent input
+int var = (3);
+int cast = (int)3;
+int cast = (int)(3);
+int call = function(3);
+int array[3] = {1, 2, 3};
+int array[3] = {[2] = 3};
+#indent end
+
+#indent run-equals-input -di0
Index: src/tests/usr.bin/indent/token_semicolon.c
diff -u /dev/null src/tests/usr.bin/indent/token_semicolon.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_semicolon.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,43 @@
+/* $NetBSD: token_semicolon.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the token ';'.
+ *
+ * The ';' ends a declaration.
+ *
+ * The ';' ends a statement.
+ *
+ * The ';' separates the 3 expressions in the head of the 'for' loop.
+ */
+
+#indent input
+struct {
+ int member;
+} global_var;
+#indent end
+
+#indent run-equals-input -di0
+
+
+#indent input
+void
+function(void)
+{
+ for ( ; ; )
+ stmt();
+ for (;;)
+ stmt();
+}
+#indent end
+
+#indent run
+void
+function(void)
+{
+ for (;;)
+ stmt();
+ for (;;)
+ stmt();
+}
+#indent end
Index: src/tests/usr.bin/indent/token_stmt.c
diff -u /dev/null src/tests/usr.bin/indent/token_stmt.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_stmt.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,26 @@
+/* $NetBSD: token_stmt.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for statements.
+ */
+
+#indent input
+#define unless(cond) if (!(cond))
+
+void
+function(void)
+{
+ stmt();
+ stmt; /* probably some macro */
+
+ unless(cond)
+ stmt();
+}
+#indent end
+
+/*
+ * There is no space after 'unless' since indent cannot know that it is a
+ * syntactic macro, especially not when its definition is in a header file.
+ */
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_stmt_list.c
diff -u /dev/null src/tests/usr.bin/indent/token_stmt_list.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_stmt_list.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,26 @@
+/* $NetBSD: token_stmt_list.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for lists of statements.
+ *
+ * Since C99, in such a statement list, statements can be intermixed with
+ * declarations in arbitrary ways.
+ */
+
+#indent input
+void
+function(void)
+{
+ stmt();
+ int var;
+ stmt();
+ {
+ stmt();
+ int var;
+ stmt();
+ }
+}
+#indent end
+
+#indent run-equals-input -ldi0
Index: src/tests/usr.bin/indent/token_storage_class.c
diff -u /dev/null src/tests/usr.bin/indent/token_storage_class.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_storage_class.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,14 @@
+/* $NetBSD: token_storage_class.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for storage classes such as 'extern', 'static', but not 'typedef'.
+ */
+
+#indent input
+static int var;
+extern int var;
+int var;
+#indent end
+
+#indent run-equals-input -di0
Index: src/tests/usr.bin/indent/token_string_prefix.c
diff -u /dev/null src/tests/usr.bin/indent/token_string_prefix.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_string_prefix.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,18 @@
+/* $NetBSD: token_string_prefix.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for strings of wide characters, which are prefixed with 'L'.
+ */
+
+#indent input
+wchar_t wide_string[] = L"wide string";
+#indent end
+
+/*
+ * Regardless of the line length, the 'L' must never be separated from the
+ * string literal.
+ */
+#indent run-equals-input -di0
+#indent run-equals-input -di0 -l25
+#indent run-equals-input -di0 -l1
Index: src/tests/usr.bin/indent/token_switch_expr.c
diff -u /dev/null src/tests/usr.bin/indent/token_switch_expr.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_switch_expr.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,17 @@
+/* $NetBSD: token_switch_expr.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keyword 'switch' followed by a parenthesized expression.
+ */
+
+#indent input
+void
+function(void)
+{
+ switch (expr) {
+ }
+}
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_type_def.c
diff -u /dev/null src/tests/usr.bin/indent/token_type_def.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_type_def.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,16 @@
+/* $NetBSD: token_type_def.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keyword 'typedef'.
+ */
+
+/*
+ * Contrary to declarations, type definitions are not affected by the option
+ * '-di'.
+ */
+#indent input
+typedef int number;
+#indent end
+
+#indent run-equals-input
Index: src/tests/usr.bin/indent/token_unary_op.c
diff -u /dev/null src/tests/usr.bin/indent/token_unary_op.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_unary_op.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,22 @@
+/* $NetBSD: token_unary_op.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for unary operators, such as '+', '-', '*', '&'.
+ */
+
+#indent input
+int var=+3;
+int mixed=+-+-+-+-+-+-+-+-+-+-+-+-+-3;
+int count=~-~-~-~-~-~-~-~-~-~-~-~-~-3;
+int same = + + + + + - - - - - 3;
+#indent end
+
+#indent run -di0
+int var = +3;
+int mixed = +-+-+-+-+-+-+-+-+-+-+-+-+-3;
+int count = ~-~-~-~-~-~-~-~-~-~-~-~-~-3;
+/* $ FIXME: There must be spaces between adjacent '+'. */
+/* $ FIXME: There must be spaces between adjacent '-'. */
+int same = +++++-----3;
+#indent end
Index: src/tests/usr.bin/indent/token_while_expr.c
diff -u /dev/null src/tests/usr.bin/indent/token_while_expr.c:1.1
--- /dev/null Mon Oct 18 22:30:35 2021
+++ src/tests/usr.bin/indent/token_while_expr.c Mon Oct 18 22:30:34 2021
@@ -0,0 +1,30 @@
+/* $NetBSD: token_while_expr.c,v 1.1 2021/10/18 22:30:34 rillig Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Tests for the keyword 'while', followed by a parenthesized expression.
+ */
+
+#indent input
+int main(int argc,char**argv){int o;while((o=getopt(argc,argv,"x:"))!=-1)
+switch(o){case'x':do{o++;}while(o<5);break;default:usage();}return 0;}
+#indent end
+
+#indent run
+int
+main(int argc, char **argv)
+{
+ int o;
+ while ((o = getopt(argc, argv, "x:")) != -1)
+ switch (o) {
+ case 'x':
+ do {
+ o++;
+ } while (o < 5);
+ break;
+ default:
+ usage();
+/* $ XXX: The 'return' should be in a separate line. */
+ } return 0;
+}
+#indent end