Module Name: src Committed By: rillig Date: Sat May 20 10:09:03 UTC 2023
Modified Files: src/tests/usr.bin/indent: opt_bacc.c src/usr.bin/indent: debug.c indent.c indent.h io.c Log Message: indent: implement blank lines around conditional compilation To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/indent/opt_bacc.c cvs rdiff -u -r1.15 -r1.16 src/usr.bin/indent/debug.c cvs rdiff -u -r1.296 -r1.297 src/usr.bin/indent/indent.c cvs rdiff -u -r1.152 -r1.153 src/usr.bin/indent/indent.h cvs rdiff -u -r1.178 -r1.179 src/usr.bin/indent/io.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/indent/opt_bacc.c diff -u src/tests/usr.bin/indent/opt_bacc.c:1.11 src/tests/usr.bin/indent/opt_bacc.c:1.12 --- src/tests/usr.bin/indent/opt_bacc.c:1.11 Thu May 11 18:13:55 2023 +++ src/tests/usr.bin/indent/opt_bacc.c Sat May 20 10:09:03 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: opt_bacc.c,v 1.11 2023/05/11 18:13:55 rillig Exp $ */ +/* $NetBSD: opt_bacc.c,v 1.12 2023/05/20 10:09:03 rillig Exp $ */ /* * Tests for the options '-bacc' and '-nbacc' ("blank line around conditional @@ -8,7 +8,7 @@ * block. For example, in front of every #ifdef and after every #endif. * Other blank lines surrounding such blocks are swallowed. * - * The option '-nbacc' TODO. + * The option '-nbacc' leaves the vertical spacing as-is. */ @@ -21,24 +21,17 @@ int b; int c; //indent end -/* - * XXX: As of 2021-11-19, the option -bacc has no effect on declarations since - * process_type resets out.blank_line_before unconditionally. - */ //indent run -bacc int a; -/* $ FIXME: expecting a blank line here */ + #if 0 int b; #endif -/* $ FIXME: expecting a blank line here */ + int c; //indent end -/* - * With '-nbacc' the code is unchanged since there are no blank lines to - * remove. - */ +/* The option '-nbacc' does not remove anything. */ //indent run-equals-input -nbacc @@ -80,13 +73,13 @@ os_name(void) const char * os_name(void) { -/* $ FIXME: expecting a blank line here. */ + #if defined(__NetBSD__) || defined(__FreeBSD__) return "BSD"; #else return "unknown"; #endif -/* $ FIXME: expecting a blank line here. */ + } //indent end @@ -122,6 +115,16 @@ int outer_below; #endif //indent end -//indent run-equals-input -di0 -bacc +//indent run -di0 -bacc +#ifdef outer +int outer_above; + +#ifdef inner +int inner; +#endif + +int outer_below; +#endif +//indent end //indent run-equals-input -di0 -nbacc Index: src/usr.bin/indent/debug.c diff -u src/usr.bin/indent/debug.c:1.15 src/usr.bin/indent/debug.c:1.16 --- src/usr.bin/indent/debug.c:1.15 Sat May 20 02:47:35 2023 +++ src/usr.bin/indent/debug.c Sat May 20 10:09:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.15 2023/05/20 02:47:35 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.16 2023/05/20 10:09:02 rillig Exp $ */ /*- * Copyright (c) 2023 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: debug.c,v 1.15 2023/05/20 02:47:35 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.16 2023/05/20 10:09:02 rillig Exp $"); #include <stdarg.h> @@ -117,6 +117,12 @@ const char *const paren_level_cast_name[ "(no cast)", }; +static const char *const line_kind_name[] = { + "other", + "#if", + "#endif", +}; + void debug_printf(const char *fmt, ...) { @@ -320,6 +326,9 @@ debug_parser_state(lexer_symbol lsym) debug_ps_enum(spaced_expr_psym, psym_name); debug_ps_int(quest_level); + debug_ps_enum(line_kind, line_kind_name); + debug_ps_enum(prev_line_kind, line_kind_name); + prev_ps = ps; } Index: src/usr.bin/indent/indent.c diff -u src/usr.bin/indent/indent.c:1.296 src/usr.bin/indent/indent.c:1.297 --- src/usr.bin/indent/indent.c:1.296 Sat May 20 02:47:35 2023 +++ src/usr.bin/indent/indent.c Sat May 20 10:09:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.c,v 1.296 2023/05/20 02:47:35 rillig Exp $ */ +/* $NetBSD: indent.c,v 1.297 2023/05/20 10:09:02 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: indent.c,v 1.296 2023/05/20 02:47:35 rillig Exp $"); +__RCSID("$NetBSD: indent.c,v 1.297 2023/05/20 10:09:02 rillig Exp $"); #include <sys/param.h> #include <err.h> @@ -975,6 +975,7 @@ process_preprocessing(void) state_stack[ifdef_level++] = ps; else diag(1, "#if stack overflow"); + ps.line_kind = lk_if; } else if (substring_starts_with(dir, "el")) { /* else, elif */ if (ifdef_level <= 0) @@ -988,6 +989,7 @@ process_preprocessing(void) diag(1, "Unmatched #endif"); else ifdef_level--; + ps.line_kind = lk_endif; } else { if (!substring_equals(dir, "pragma") && Index: src/usr.bin/indent/indent.h diff -u src/usr.bin/indent/indent.h:1.152 src/usr.bin/indent/indent.h:1.153 --- src/usr.bin/indent/indent.h:1.152 Sat May 20 02:47:35 2023 +++ src/usr.bin/indent/indent.h Sat May 20 10:09:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.h,v 1.152 2023/05/20 02:47:35 rillig Exp $ */ +/* $NetBSD: indent.h,v 1.153 2023/05/20 10:09:02 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD @@ -394,6 +394,14 @@ extern struct parser_state { } declaration; bool blank_line_after_decl; + enum line_kind { + lk_other, + lk_if, /* #if, #ifdef, #ifndef */ + lk_endif, /* #endif */ + } line_kind; /* kind of the current line, is reset to + * lk_other at the beginning of each line */ + enum line_kind prev_line_kind; + /* Comments */ bool curr_col_1; /* whether the current token started in column @@ -436,7 +444,6 @@ void clear_indent_off_text(void); lexer_symbol lexi(void); void diag(int, const char *, ...) __printflike(2, 3); void output_line(void); -void output_line_ff(void); void inp_read_line(void); void parse(parser_symbol); void process_comment(void); Index: src/usr.bin/indent/io.c diff -u src/usr.bin/indent/io.c:1.178 src/usr.bin/indent/io.c:1.179 --- src/usr.bin/indent/io.c:1.178 Thu May 18 05:33:27 2023 +++ src/usr.bin/indent/io.c Sat May 20 10:09:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: io.c,v 1.178 2023/05/18 05:33:27 rillig Exp $ */ +/* $NetBSD: io.c,v 1.179 2023/05/20 10:09:02 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,16 +38,18 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: io.c,v 1.178 2023/05/18 05:33:27 rillig Exp $"); +__RCSID("$NetBSD: io.c,v 1.179 2023/05/20 10:09:02 rillig Exp $"); #include <stdio.h> -#include <string.h> #include "indent.h" struct buffer inp; -static struct buffer indent_off_text; - +static struct buffer indent_off_text; /* text from between 'INDENT OFF' and + * 'INDENT ON', both inclusive */ +static unsigned wrote_newlines = 2; /* 0 in the middle of a line, 1 after + * a single '\n', > 1 means there were + * (n - 1) blank lines above */ static int paren_indent; @@ -92,10 +94,11 @@ inp_read_next_line(FILE *f) } static void -output_char(char ch) +output_newline(void) { - fputc(ch, output); - debug_vis_range("output_char '", &ch, 1, "'\n"); + fputc('\n', output); + debug_println("output_newline"); + wrote_newlines++; } static void @@ -103,6 +106,8 @@ output_range(const char *s, size_t len) { fwrite(s, 1, len, output); debug_vis_range("output_range \"", s, len, "\"\n"); + for (size_t i = 0; i < len; i++) + wrote_newlines = s[i] == '\n' ? wrote_newlines + 1 : 0; } static int @@ -118,16 +123,41 @@ output_indent(int old_ind, int new_ind) for (int i = 0; i < n; i++) { fputc('\t', output); ind += tabsize; + wrote_newlines = 0; } } - for (; ind < new_ind; ind++) + for (; ind < new_ind; ind++) { fputc(' ', output); + wrote_newlines = 0; + } debug_println("output_indent %d", ind); return ind; } +static void +maybe_output_blank_line(void) +{ + bool want_blank_line = false; + + if (ps.blank_line_after_decl && ps.declaration == decl_no) { + ps.blank_line_after_decl = false; + want_blank_line = true; + } + + if (opt.blanklines_around_conditional_compilation) { + if (ps.prev_line_kind != lk_if && ps.line_kind == lk_if) + want_blank_line = true; + if (ps.prev_line_kind == lk_endif && ps.line_kind != lk_endif) + want_blank_line = true; + } + + if (want_blank_line && wrote_newlines < 2 + && (lab.len > 0 || code.len > 0 || com.len > 0)) + output_newline(); +} + static int output_line_label(void) { @@ -190,7 +220,7 @@ output_line_comment(int ind) /* if comment can't fit on this line, put it on the next line */ if (ind > target_ind) { - output_char('\n'); + output_newline(); ind = 0; } @@ -218,11 +248,7 @@ output_line(void) ps.is_function_definition = false; - if (ps.blank_line_after_decl && ps.declaration == decl_no) { - ps.blank_line_after_decl = false; - if (lab.len > 0 || code.len > 0 || com.len > 0) - output_char('\n'); - } + maybe_output_blank_line(); if (indent_enabled == indent_on) { if (ps.ind_level == 0) @@ -243,7 +269,7 @@ output_line(void) if (com.len > 0) output_line_comment(ind); - output_char('\n'); + output_newline(); } if (indent_enabled == indent_last_off_line) { @@ -272,6 +298,8 @@ output_line(void) } ps.want_blank = false; + ps.prev_line_kind = ps.line_kind; + ps.line_kind = lk_other; } static int