root/tests/usr.bin/indent/opt_badp.c
/* $NetBSD: opt_badp.c,v 1.16 2023/06/27 04:41:23 rillig Exp $ */

/*
 * Tests for the options '-badp' and '-nbadp'.
 *
 * The option '-badp' forces a blank line between the first set of declarations
 * in a function and the next comment or statement. It produces a blank line
 * even if there are no declarations.
 */


/* An empty function body does not need a blank line. */
//indent input
void
empty(void)
{
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/* If an empty function body already has a blank line, it is kept. */
//indent input
void
blank(void)
{

}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/*
 * If a function body has only declarations (doesn't occur in practice), it
 * does not need an empty line.
 */
//indent input
void
declaration(void)
{
        int             decl;
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/*
 * A function body without declarations gets an empty line above the first
 * statement.
 */
//indent input
void
statement(void)
{
        stmt();
}
//indent end

//indent run -badp
void
statement(void)
{

        stmt();
}
//indent end

//indent run-equals-input -nbadp


/*
 * A function body with a declaration and a statement gets a blank line between
 * those.
 */
//indent input
void
declaration_statement(void)
{
        int             decl;
        stmt();
}
//indent end

//indent run -badp
void
declaration_statement(void)
{
        int             decl;

        stmt();
}
//indent end

//indent run-equals-input -nbadp


/* If there already is a blank line in the right place, it is kept. */
//indent input
static void
declaration_blank_statement(void)
{
        int             decl;

        stmt();
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/* Additional blank lines are kept. To remove them, see the '-sob' option. */
//indent input
static void
declaration_blank_blank_statement(void)
{
        int             decl;



        stmt();
}
//indent end

//indent run-equals-input -badp

//indent run-equals-input -nbadp


/*
 * The blank line is only inserted at the top of a function body, not in nested
 * block statements.
 */
//indent input
static void
nested(void)
{
        {
                int             decl;
                stmt();
        }
}
//indent end

//indent run -badp
static void
nested(void)
{

        {
                int             decl;
                stmt();
        }
}
//indent end

//indent run-equals-input -nbadp


/*
 * A struct declaration or an initializer are not function bodies, so don't
 * add a blank line after them.
 */
//indent input
struct {
        int member[2];
} s = {
        {
                0,
                0,
        }
};
//indent end

//indent run-equals-input -di0 -badp

//indent run-equals-input -di0 -nbadp


/* Single-line function definitions must be handled correctly as well. */
//indent input
void f(void) { int decl; stmt; }
//indent end

//indent run -badp
void
f(void)
{
        int             decl;

        stmt;
}
//indent end

//indent run -nfbs -badp
void
f(void) {
        int             decl;

        stmt;
}
//indent end


/* The '}' of an initializer does not end a block. */
//indent input
void
f(void)
{
        int decl1[2][2] = {
                {1, 2},
                {3, 4},
        };
        int decl2 = 5;
        stmt;
}
//indent end

//indent run -di0 -badp
void
f(void)
{
        int decl1[2][2] = {
                {1, 2},
                {3, 4},
        };
        int decl2 = 5;

        stmt;
}
//indent end


/*
 * Due to its limited lookahead, indent cannot know whether the comment is
 * followed by a declaration or a statement, so it assumes that the comment is
 * part of the declaration block.
 */
//indent input
void f(void) {
        int             decl1;
        /* comment */
        int             decl2;
        stmt;
}
//indent end

//indent run -badp
void
f(void)
{
        int             decl1;
        /* comment */
        int             decl2;

        stmt;
}
//indent end


/* Combining -bad and -badp only adds a single blank line. */
//indent input
void f(void) { int decl; stmt1; stmt2; }
//indent end

//indent run -bad -badp
void
f(void)
{
        int             decl;

        stmt1;
        stmt2;
}
//indent end