indent: implement blank lines around conditional compilation
This commit is contained in:
parent
29d8ffc91f
commit
4d19140d48
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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") &&
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue