/* $NetBSD: opt_bc.c,v 1.13 2023/06/17 22:09:24 rillig Exp $ */

/*
* Tests for the options '-bc' and '-nbc'.
*
* The option '-bc' forces a newline after each comma in a declaration.
*
* The option '-nbc' removes line breaks between declarators.  In most other
* places, indent preserves line breaks.
*/

//indent input
int a,b,c;
void function_declaration(int a,int b,int c);
int m1,
m2,
m3;
char plain, *pointer;
//indent end

//indent run -bc
int             a,
               b,
               c;
void            function_declaration(int a, int b, int c);
int             m1,
               m2,
               m3;
char            plain,
              *pointer;
//indent end

//indent run -nbc
int             a, b, c;
void            function_declaration(int a, int b, int c);
int             m1, m2, m3;
char            plain, *pointer;
//indent end


//indent input
old_style_definition(a, b, c)
double a,b,c;
{
   return a+b+c;
}
//indent end

//indent run -bc
old_style_definition(a, b, c)
double          a,
               b,
               c;
{
       return a + b + c;
}
//indent end

//indent run -nbc
old_style_definition(a, b, c)
double          a, b, c;
{
       return a + b + c;
}
//indent end


/*
* Before indent.c 1.311 from 2023-06-02, indent formatted the two '#if'
* branches differently and merged the 'b, c' with the preceding preprocessing
* line.
*/
//indent input
int a,
#if 0
b, c; int d;
#else
b, c; int d;
#endif
//indent end

//indent run -bc
int             a,
#if 0
               b,
               c;
int             d;
#else
               b,
               c;
int             d;
#endif
//indent end

//indent run -nbc
int             a,
#if 0
               b, c;
int             d;
#else
               b, c;
int             d;
#endif
//indent end


/*
* Before 2023-06-10, a '(' at the top level started a function definition,
* leaving variable declaration mode.
*/
//indent input
int a = 1, b = 2;
int a = (1), b = 2;
//indent end

//indent run -bc
int             a = 1,
               b = 2;
int             a = (1),
               b = 2;
//indent end


//indent input
int a,
b,
c;
//indent end

//indent run -nbc -di0
int a, b, c;
//indent end


/*
* When declarations are too long to fit in a single line, they should not be
* joined.
*/
//indent input
{
       const struct paren_level *prev = state.prev_ps.paren.item,
           *curr = ps.paren.item;
}
//indent end

//indent run
// $ FIXME: The line becomes too long.
{
       const struct paren_level *prev = state.prev_ps.paren.item, *curr = ps.paren.item;
}
//indent end


/*
* In struct or union declarations, the declarators are split onto separate
* lines, just like in ordinary declarations.
*
* In enum declarations and in initializers, no line breaks are added or
* removed.
*/
//indent input
struct triple_struct {
       int a, b, c;
};
union triple_union {
       int a, b, c;
};
enum triple_enum {
       triple_a, triple_b,

       triple_c,
};
//indent end

//indent run -bc
struct triple_struct {
       int             a,
                       b,
                       c;
};
union triple_union {
       int             a,
                       b,
                       c;
};
enum triple_enum {
       triple_a, triple_b,

       triple_c,
};
//indent end

//indent run -nbc
struct triple_struct {
       int             a, b, c;
};
union triple_union {
       int             a, b, c;
};
enum triple_enum {
       triple_a, triple_b,

       triple_c,
};
//indent end