[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 11/11] Fix formatting of struct initializer lists, and add -sar
From: |
Tim Hentenaar |
Subject: |
[PATCH 11/11] Fix formatting of struct initializer lists, and add -sar |
Date: |
Mon, 15 Jun 2015 21:53:02 +0200 |
Initializer lists wern't being properly detected as block
initializers and thus were being formatted with a newline forced after
the opening brace.
The newly added -sar option will add spaces between the braces and the
inner part of the initializer for those who prefer it. I've alwo added
this to the K&R style, as this style can be clearly seen in The C
Programming Language 2nd Ed.
---
ChangeLog | 3 +++
doc/indent.texi | 46 ++++++++++++++++++++++++++++++++++++++++++++++
regression/TEST | 3 ++-
src/args.c | 6 +++++-
src/handletoken.c | 19 +++++++++++++++++--
src/indent.h | 1 +
6 files changed, 74 insertions(+), 4 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 3807fe2..facc512 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2015-06-15 Tim Hentenaar <address@hidden>
* Added -par to -kr.
+ * Fixed detection of struct initializer lists as block_init.
+ * Added an option (-sar/--spaces-around-initializers) to add a space
+ after the lbrace and before the rbrace of struct initializers.
2015-06-14 Tim Hentenaar <address@hidden>
* Added an option (-as/--align-with-spaces) which if indenting with
diff --git a/doc/indent.texi b/doc/indent.texi
index 68ea82d..858c632 100644
--- a/doc/indent.texi
+++ b/doc/indent.texi
@@ -1214,6 +1214,45 @@ int one(void)
@end group
@end example
address@hidden
address@hidden -sar
address@hidden --spaces-around-initializers
+
+The @option{-sar} option affects how @command{indent} will render initializer
+lists. Without @option{-sar} they are formatted like this:
+
address@hidden
address@hidden
+int a[] = @{1, 2, 3, address@hidden;
+
+struct s @{
+ const char *name;
+ int x;
address@hidden a[] = @{
+ @{"name", address@hidden,
+ @{"a", address@hidden
address@hidden;
address@hidden group
address@hidden example
+
address@hidden
+With @option{-sar} they are formatted like this, with spaces inside the
+braces:
+
address@hidden
address@hidden
+int a[] = @{ 1, 2, 3, 4 @};
+
+struct s @{
+ const char *name;
+ int x;
address@hidden a[] = @{
+ @{ "name", 0 @},
+ @{ "a", 1 @}
address@hidden;
address@hidden group
address@hidden example
+
@kindex -ut
@kindex --use-tabs
@kindex -nut
@@ -2211,6 +2250,11 @@ Put a space after each @address@hidden
Put a space after each @address@hidden
@xref{Statements}.
address@hidden -sar
address@hidden --spaces-around-initializers
+Put a space after the @address@hidden and before the @address@hidden in
address@hidden
address@hidden
+
@item -saw
@itemx --space-after-while
Put a space after each @address@hidden
@@ -2367,6 +2411,7 @@ the corresponding short option.
\line{ --space-after-procedure-calls \leaderfill -pcs\ }
\line{ --space-after-while \leaderfill -saw\ }
\line{ --space-special-semicolon \leaderfill -ss\ \ }
+\line{ --spaces-around-initializers \leaderfill -sar\ \ }
\line{ --standard-output \leaderfill -st\ \ }
\line{ --start-left-side-of-comments \leaderfill -sc\ \ }
\line{ --struct-brace-indentation \leaderfill address@hidden
@@ -2460,6 +2505,7 @@ the corresponding short option.
--space-after-procedure-calls -pcs
--space-after-while -saw
--space-special-semicolon -ss
+--spaces-around-initializers -sar
--standard-output -st
--start-left-side-of-comments -sc
--struct-brace-indentation address@hidden
diff --git a/regression/TEST b/regression/TEST
index 53eb374..e532967 100755
--- a/regression/TEST
+++ b/regression/TEST
@@ -68,7 +68,7 @@ SPECIALS="typedef-bug.c bug-hp.c bug-di.c newlined-parms.c
indent.pro.c \
bad-comment.c unknown-type.c unknown-type-npsl.c bug-npsl.c bug-psl.c
do-cdw.c \
label.c goto-1.c goto-2.c line-count.c decl_block.c pointer-pal.c
else-comment-2-br.c else-comment-2-bl.c \
else-comment-2-br-ce.c preserve-newline-after-right-brace.c
gettext-strings.c single-line-conditionals.c \
- align-with-spaces.c no-space-after-fp-name.c"
+ align-with-spaces.c no-space-after-fp-name.c
spaces-around-initializers.c"
ARGS="-bad"
$INDENT -npro $ARGS input/bad-break.c -o output/bad-break.c
@@ -178,6 +178,7 @@ ARGS=""
$INDENT -npro -slc input/single-line-conditionals.c -o
output/single-line-conditionals.c
$INDENT -npro -br -ut -i8 -l70 -ts8 -as input/align-with-spaces.c -o
output/align-with-spaces.c
$INDENT -npro -npcs input/fp.c -o output/no-space-after-fp-name.c
+$INDENT -npro -sar input/spaces-around-initializers.c -o
output/spaces-around-initializers.c
ARGS="-kr -cp0 -l132 -lps -br -psl"
$INDENT -npro $ARGS input/const.c -o output/const.c
diff --git a/src/args.c b/src/args.c
index baadefc..853c535 100644
--- a/src/args.c
+++ b/src/args.c
@@ -83,7 +83,7 @@ RCSTAG_CC ("$Id$");
"-nbad\0-bap\0-nbc\0-bbo\0-hnl\0-br\0-brs\0-c33\0-cd33\0" \
"-ncdb\0-ce\0-ci4\0-cli0\0-d0\0-di1\0-nfc1\0-i4\0-ip0\0-l75\0-lp\0" \
"-npcs\0-nprs\0-npsl\0-sai\0-saf\0-saw\0-cs\0-nsc\0-nsob\0-nfca\0-cp33\0"\
- "-nss\0-par\0"
+ "-nss\0-par\0-sar\0"
#define GNU_SETTINGS_STRING (int *) \
"-nbad\0-bap\0-bbo\0-hnl\0-nbc\0-bl\0-bls\0-ncdb\0-cs\0-nce\0" \
@@ -201,6 +201,7 @@ static int exp_version = 0;
static int exp_par = 0;
static int exp_slc = 0;
static int exp_as = 0;
+static int exp_sar = 0;
/**
* The following structure is controlled by command line parameters and
@@ -367,6 +368,7 @@ const pro_ty pro[] =
{"par", PRO_BOOL, true, ON,
&settings.pointer_align_right, &exp_par},
{"slc", PRO_BOOL, false, ON,
&settings.allow_single_line_conditionals, &exp_slc},
{"as", PRO_BOOL, false, ON,
&settings.align_with_spaces, &exp_as},
+ {"sar", PRO_BOOL, false, ON,
&settings.spaces_around_initializers, &exp_sar},
/* Signify end of structure. */
{0, PRO_IGN, 0, ONOFF_NA, 0,
0}
@@ -494,6 +496,7 @@ const pro_ty pro[] =
{"par", PRO_BOOL, true, ON,
&settings.pointer_align_right, &exp_par},
{"slc", PRO_BOOL, false, ON,
&settings.allow_single_line_conditionals, &exp_slc},
{"as", PRO_BOOL, false, ON,
&settings.align_with_spaces, &exp_as},
+ {"sar", PRO_BOOL, false, ON,
&settings.spaces_around_initializers, &exp_sar},
/* Signify end of structure. */
{0, PRO_IGN, 0, ONOFF_NA, 0,
0}
@@ -631,6 +634,7 @@ const long_option_conversion_ty option_conversions[] =
{"pointer-align-left", "pal"},
{"single-line-conditionals", "slc"},
{"align-with-spaces", "as"},
+ {"spaces-around-initializers", "sar"},
/* Signify end of structure. */
{0, 0},
diff --git a/src/handletoken.c b/src/handletoken.c
index 5250cc0..6effe59 100644
--- a/src/handletoken.c
+++ b/src/handletoken.c
@@ -1023,6 +1023,12 @@ static void handle_token_lbrace(
{
parser_state_tos->saw_double_colon = false;
+ /* If the last token was a binary_op (probably =) then we're
+ * likely starting an initializer or initializer list.
+ */
+ if (parser_state_tos->last_token == binary_op)
+ parser_state_tos->block_init = 1;
+
if (!parser_state_tos->block_init)
{
*force_nl = true; /* force other stuff on same line as '{' onto
@@ -1132,7 +1138,6 @@ static void handle_token_lbrace(
if (parser_state_tos->in_decl && parser_state_tos->in_or_st)
{
/* This is a structure declaration. */
-
if (parser_state_tos->dec_nest >= di_stack_alloc)
{
di_stack_alloc *= 2;
@@ -1207,6 +1212,8 @@ static void handle_token_lbrace(
++parser_state_tos->paren_depth;
parser_state_tos->paren_indents[parser_state_tos->p_l_follow -
1] = e_code - s_code;
+ if (settings.spaces_around_initializers)
+ parser_state_tos->want_blank = true;
}
else if (parser_state_tos->block_init &&
(parser_state_tos->block_init_level == 1))
@@ -1246,8 +1253,9 @@ static void handle_token_rbrace(
parser_state_tos->just_saw_decl = 0;
parser_state_tos->ind_stmt = false;
parser_state_tos->in_stmt = false;
+ parser_state_tos->block_init_level--;
- if ((parser_state_tos->block_init_level-- == 1)
+ if ((parser_state_tos->block_init_level == 0)
&& (s_code != e_code))
{
/* Found closing brace of declaration initialisation, with
@@ -1267,6 +1275,13 @@ static void handle_token_rbrace(
*(e_code++) = ' ';
}
}
+ else if (parser_state_tos->block_init_level == 1
+ && settings.spaces_around_initializers)
+ {
+ /* Put a space before the '}' */
+ set_buf_break (bb_rbrace, paren_target);
+ *(e_code++) = ' ';
+ }
*(e_code++) = '}';
parser_state_tos->want_blank = true;
diff --git a/src/indent.h b/src/indent.h
index 12c4e04..82c5e49 100644
--- a/src/indent.h
+++ b/src/indent.h
@@ -329,6 +329,7 @@ typedef struct user_options_st
int gettext_strings; /*!< true: _("...") is a string, false: it's a
function */
int allow_single_line_conditionals; /*!< Don't indent the body of an
unbraced if, else, etc. */
int align_with_spaces; /*!< Align with spaces if indenting with tabs. */
+ int spaces_around_initializers; /*!< Place spaces after { and before } in
initializers. */
} user_options_ty;
extern user_options_ty settings;
--
2.3.6
- [PATCH 00/11] Bugfixes and a few new options, Tim Hentenaar, 2015/06/15
- [PATCH 06/11] Automatically include 'size_t', 'wchar_t' and 'ptrdiff_t' as a rw_decl tokens, since they're guaranteed to be available in ANSI C., Tim Hentenaar, 2015/06/15
- [PATCH 04/11] parse: Write out token names when dumping the parser's stack, Tim Hentenaar, 2015/06/15
- [PATCH 01/11] lexi.c: Fix conditionals around the GNU inline attribute, Tim Hentenaar, 2015/06/15
- [PATCH 02/11] Fix html doc generation, Tim Hentenaar, 2015/06/15
- [PATCH 03/11] Fix regression introduced in hg revision 25c27d429590, Tim Hentenaar, 2015/06/15
- [PATCH 09/11] Fix handling of block comments after braces, Tim Hentenaar, 2015/06/15
- [PATCH 07/11] Add an option to use spaces for aligment when using tabs, Tim Hentenaar, 2015/06/15
- [PATCH 08/11] Adjust -npcs so that if set, no space will be added between a function pointer's name and its argument list., Tim Hentenaar, 2015/06/15
- [PATCH 05/11] Add an option to allow single-line conditionals, Tim Hentenaar, 2015/06/15
- [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar,
Tim Hentenaar <=
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Daniel P. Valentine, 2015/06/15
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Andrew Shadura, 2015/06/15
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Tim Hentenaar, 2015/06/15
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, clarkw, 2015/06/16
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Tim Hentenaar, 2015/06/16
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Clark Wang, 2015/06/17
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Tim Hentenaar, 2015/06/17
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Clark Wang, 2015/06/17
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Tim Hentenaar, 2015/06/17
- Re: [PATCH 11/11] Fix formatting of struct initializer lists, and add -sar, Clark Wang, 2015/06/18