jef@ace.ee.lbl.gov (Jef Poskanzer) (03/23/89)
I use a somewhat unusual style in C, so I wasn't surprised that indent couldn't be configured to do quite what I wanted. But I was surprised that I only had to add three flags; and I was also surprised at how easy the flags were to add. Appended are diffs that add: -brr (brace right right), which goes along with -bl and -br, and does brace indentation like this: if ( foo ) { bar } -ccin (case code indent), which specifies the indentation of case code relative to the case label. The default is -cci1, but I like cci0, like this: switch ( foo ) { case bar: bletch; } -prs (paren spaces), which adds spaces after '(' and before ')'. The default behaviour should be completely unmodified. Enjoy. --- Jef Jef Poskanzer jef@helios.ee.lbl.gov ...well!pokey *** /tmp/,RCSt1a04112 Wed Mar 22 22:52:33 1989 --- indent.1 Wed Mar 22 22:51:55 1989 *************** *** 31,36 **** --- 31,37 ---- [\ \fB\-bc\fR\ |\ \fB\-nbc\fR\ ] [\ \fB\-bl\fR\ ] [\ \fB\-br\fR\ ] + [\ \fB\-brr\fR\ ] [\ \fB\-c\fIn\fR\ ] [\ \fB\-cd\fIn\fR\ ] [\ \fB\-cdb\fR\ |\ \fB\-ncdb\fR\ ] *************** *** 37,42 **** --- 38,44 ---- [\ \fB\-ce\fR\ |\ \fB\-nce\fR\ ] [\ \fB\-ci\fIn\fR\ ] [\ \fB\-cli\fIn\fR\ ] + [\ \fB\-cci\fIn\fR\ ] [\ \fB\-d\fIn\fR\ ] [\ \fB\-di\fIn\fR\ ] [\ \fB\-fc1\fR\ |\ \fB\-nfc1\fR\ ] *************** *** 47,52 **** --- 49,55 ---- [\ \fB\-lp\fR\ |\ \fB\-nlp\fR\ ] [\ \fB\-pcs\fR\ |\ \fB\-npcs\fR\ ] [\ \fB\-npro\fR\ ] + [\ \fB\-prs\fR\ |\ \fB\-nprs\fR\ ] [\ \fB\-psl\fR\ |\ \fB\-npsl\fR\ ] [\ \fB\-sc\fR\ |\ \fB\-nsc\fR\ ] [\ \fB\-sob\fR\ |\ \fB\-nsob\fR\ ] *************** *** 108,114 **** turns off this option. The default is .BR \-bc . .TP 15 ! .BR \-br , \-bl Specifying .B \-bl lines up compound statements like this: --- 111,117 ---- turns off this option. The default is .BR \-bc . .TP 15 ! .BR \-br , \-bl , \-brr Specifying .B \-bl lines up compound statements like this: *************** *** 132,137 **** --- 135,152 ---- } .ft R .fi + And specifying + .B \-brr + makes them look like this: + .ne 3 + .nf + .ft L + if (...) + { + code + } + .ft R + .fi .LP .TP 15 .BI \-c n *************** *** 181,186 **** --- 196,209 ---- default is .B \-cli0 . .TP 15 + .BI \-cci n + Causes case code to be indented + .I n + tab stops to the right of the corresponding case label. + \fB-cci0.5\fR causes case code to be indented half a tab stop. The + default is + .B \-cci1 . + .TP 15 .BI \-d n Controls the placement of comments which are not to the right of code. The default *************** *** 270,275 **** --- 293,303 ---- If true (\fB-pcs\fR) all procedure calls will have a space inserted between the name and the '('. The default is .B \-npcs + .TP 15 + .B \-prs , \-nprs + If true (\fB-prs\fR) all parentheses will have a space inserted + after the '(' and before the ')'. The default is + .B \-nprs .TP 15 .B \-psl , \-npsl If true (\fB-psl\fR) the names of procedures being defined are placed in *** /tmp/,RCSt1a04112 Wed Mar 22 22:52:35 1989 --- indent_globs.h Wed Mar 22 22:52:02 1989 *************** *** 94,99 **** --- 94,101 ---- * comma */ int btype_2; /* when true, brace should be on same line as * if, while, etc */ + int btype_3; /* when true, braces are not only on the next + * line but indented with the enclosed code */ float case_ind; /* indentation level to be used for a "case * n:" */ int code_lines; /* count of lines with code */ *************** *** 114,119 **** --- 116,122 ---- * name) */ int proc_calls_space; /* If true, procedure calls look like: * foo(bar) rather than foo (bar) */ + int parens_space; /* If true, parens gets spaces inside them */ int format_col1_comments; /* If comments which start in column 1 * are to be magically reformatted * (just like comments that begin in *************** *** 256,261 **** --- 259,266 ---- int dumped_decl_indent; float case_indent; /* The distance to indent case labels from the * switch statement */ + float case_code_indent; /* The distance to indent case code + * from the case label */ int in_parameter_declaration; int indent_parameters; int tos; /* pointer to top of stack */ *** /tmp/,RCSt1a04112 Wed Mar 22 22:52:37 1989 --- args.c Wed Mar 22 22:51:53 1989 *************** *** 48,53 **** --- 48,54 ---- #define CLI 2 /* case label indent (float) */ #define STDIN 3 /* use stdin */ #define KEY 4 /* type (keyword) */ + #define CCI 5 /* case code indent (float) */ /* * N.B.: because of the way the table here is scanned, options whose names are *************** *** 72,77 **** --- 73,79 ---- "bc", PRO_BOOL, true, OFF, &ps.leave_comma, "bl", PRO_BOOL, true, OFF, &btype_2, "br", PRO_BOOL, true, ON, &btype_2, + "brr", PRO_BOOL, true, ON, &btype_3, "bs", PRO_BOOL, false, ON, &Bill_Shannon, "cdb", PRO_BOOL, true, ON, &comment_delimiter_on_blankline, "cd", PRO_INT, 0, 0, &ps.decl_com_ind, *************** *** 78,83 **** --- 80,86 ---- "ce", PRO_BOOL, true, ON, &cuddle_else, "ci", PRO_INT, 0, 0, &continuation_indent, "cli", PRO_SPECIAL, 0, CLI, 0, + "cci", PRO_SPECIAL, 0, CCI, 0, "c", PRO_INT, 33, 0, &ps.com_ind, "di", PRO_INT, 16, 0, &ps.decl_indent, "dj", PRO_BOOL, false, ON, &ps.ljust_decl, *************** *** 113,118 **** --- 116,122 ---- "nlp", PRO_BOOL, true, OFF, &lineup_to_parens, "npcs", PRO_BOOL, false, OFF, &proc_calls_space, "npro", PRO_SPECIAL, 0, IGN, 0, + "nprs", PRO_BOOL, false, OFF, &parens_space, "npsl", PRO_BOOL, true, OFF, &procnames_start_line, "nps", PRO_BOOL, false, OFF, &pointer_as_binop, "nsc", PRO_BOOL, true, OFF, &star_comment_cont, *************** *** 119,124 **** --- 123,129 ---- "nsob", PRO_BOOL, false, OFF, &swallow_optional_blanklines, "nv", PRO_BOOL, false, OFF, &verbose, "pcs", PRO_BOOL, false, ON, &proc_calls_space, + "prs", PRO_BOOL, false, ON, &parens_space, "psl", PRO_BOOL, true, ON, &procnames_start_line, "ps", PRO_BOOL, false, ON, &pointer_as_binop, "sc", PRO_BOOL, true, ON, &star_comment_cont, *************** *** 193,202 **** register struct pro *p; /* ! * Because ps.case_indent is a float, we can't initialize it from the ! * table: */ ps.case_indent = 0.0; /* -cli0.0 */ for (p = pro; p->p_name; p++) if (p->p_type != PRO_SPECIAL && p->p_type != PRO_FONT) *p->p_obj = p->p_default; --- 198,208 ---- register struct pro *p; /* ! * Because ps.case_indent and ps.case_code_indent are floats, we can't ! * initialize them from the table: */ ps.case_indent = 0.0; /* -cli0.0 */ + ps.case_code_indent = 1.0; /* -cci1.0 */ for (p = pro; p->p_name; p++) if (p->p_type != PRO_SPECIAL && p->p_type != PRO_FONT) *p->p_obj = p->p_default; *************** *** 227,232 **** --- 233,244 ---- if (*param_start == 0) goto need_param; ps.case_indent = atof(param_start); + break; + + case CCI: + if (*param_start == 0) + goto need_param; + ps.case_code_indent = atof(param_start); break; case STDIN: *** /tmp/,RCSt1a04112 Wed Mar 22 22:52:40 1989 --- indent.c Wed Mar 22 22:52:00 1989 *************** *** 130,141 **** --- 130,144 ---- * by an arg, we will set this equal to * ps.com_ind */ btype_2 = 1; /* -br */ + btype_3 = 0; /* not -brr */ cuddle_else = 1; /* -ce */ ps.unindent_displace = 0; /* -d0 */ ps.case_indent = 0; /* -cli0 */ + ps.case_code_indent = 1; /* -cci1 */ format_col1_comments = 1; /* -fc1 */ procnames_start_line = 1; /* -psl */ proc_calls_space = 0; /* -npcs */ + parens_space = 0; /* -nprs */ comment_delimiter_on_blankline = 1; /* -cdb */ ps.leave_comma = 1; /* -nbc */ #endif *************** *** 411,417 **** (type_code != form_feed)) { if (force_nl && (type_code != semicolon) && ! (type_code != lbrace || !btype_2)) { /* we should force a broken line here */ if (verbose && !flushed_nl) diag(0, "Line broken"); --- 414,420 ---- (type_code != form_feed)) { if (force_nl && (type_code != semicolon) && ! (type_code != lbrace || btype_3 || !btype_2)) { /* we should force a broken line here */ if (verbose && !flushed_nl) diag(0, "Line broken"); *************** *** 484,489 **** --- 487,494 ---- } else *e_code++ = token[0]; + if (parens_space && *token != '[') + *e_code++ = ' '; ps.paren_indents[ps.p_l_follow - 1] = e_code - s_code; if (sp_sw && ps.p_l_follow == 1 && extra_expression_indent && ps.paren_indents[0] < 2 * ps.ind_size) *************** *** 516,521 **** --- 521,528 ---- if (e_code == s_code) /* if the paren starts the line */ ps.paren_level = ps.p_l_follow; /* then indent it */ + if (parens_space && *token != ']') + *e_code++ = ' '; *e_code++ = token[0]; ps.want_blank = true; *************** *** 530,539 **** parse(hd_type); /* let parser worry about if, or whatever */ } ! ps.search_brace = btype_2; /* this should insure that constructs ! * such as main(){...} and int[]{...} ! * have their braces put in the right ! * place */ break; case unary_op: /* this could be any unary operation */ --- 537,547 ---- parse(hd_type); /* let parser worry about if, or whatever */ } ! ps.search_brace = btype_2 && !btype_3; ! /* ! * this should insure that constructs such as main(){...} and ! * int[]{...} have their braces put in the right place ! */ break; case unary_op: /* this could be any unary operation */ *************** *** 716,722 **** ps.block_init_level++; if (s_code != e_code && !ps.block_init) { ! if (!btype_2) { dump_line(); ps.want_blank = false; } --- 724,730 ---- ps.block_init_level++; if (s_code != e_code && !ps.block_init) { ! if (btype_3 || !btype_2) { dump_line(); ps.want_blank = false; } *************** *** 739,745 **** ps.ind_level = ps.i_l_follow; } } ! if (s_code == e_code) ps.ind_stmt = false; /* dont put extra indentation on line * with '{' */ if (ps.in_decl && ps.in_or_st) { /* this is either a structure --- 747,755 ---- ps.ind_level = ps.i_l_follow; } } ! if (btype_3) ! ps.ind_stmt = true; ! else if (s_code == e_code) ps.ind_stmt = false; /* dont put extra indentation on line * with '{' */ if (ps.in_decl && ps.in_or_st) { /* this is either a structure *************** *** 801,806 **** --- 811,822 ---- && ps.il[ps.tos] >= ps.ind_level; if (ps.tos <= 1 && blanklines_after_procs && ps.dec_nest <= 0) postfix_blankline_requested = 1; + if (btype_3 && ps.p_stack[ps.tos] == dohead) { + if (verbose) + diag(0, "Line broken"); + dump_line(); + ps.want_blank = false; + } break; case swstmt: /* got keyword "switch" */ *** /tmp/,RCSt1a04112 Wed Mar 22 22:52:43 1989 --- io.c Wed Mar 22 22:52:05 1989 *************** *** 73,82 **** while (--n_real_blanklines >= 0) putc('\n', output); n_real_blanklines = 0; ! if (ps.ind_level == 0) ! ps.ind_stmt = 0; /* this is a class A kludge. dont do ! * additional statement indentation if we are ! * at bracket level 0 */ if (e_lab != s_lab || e_code != s_code) ++code_lines; /* keep count of lines with code */ --- 73,89 ---- while (--n_real_blanklines >= 0) putc('\n', output); n_real_blanklines = 0; ! if (ps.ind_level == 0) { ! if (!btype_3) ! ps.ind_stmt = 0; /* this is a class A kludge. dont do ! * additional statement indentation ! * if we are at bracket level 0 */ ! else ! if (*s_code != '{') ! ps.ind_stmt = 0; /* this one is a class AA kludge: ! * defeat the class A kludge if ! * the statement is '{' */ ! } if (e_lab != s_lab || e_code != s_code) ++code_lines; /* keep count of lines with code */ *** /tmp/,RCSt1a04112 Wed Mar 22 22:52:45 1989 --- parse.c Wed Mar 22 22:52:07 1989 *************** *** 49,55 **** * input */ case decl: /* scanned a declaration word */ ! ps.search_brace = btype_2; /* indicate that following brace should be on same line */ if (ps.p_stack[ps.tos] != decl) { /* only put one declaration * onto stack */ --- 49,55 ---- * input */ case decl: /* scanned a declaration word */ ! ps.search_brace = btype_2 && !btype_3; /* indicate that following brace should be on same line */ if (ps.p_stack[ps.tos] != decl) { /* only put one declaration * onto stack */ *************** *** 78,84 **** ps.p_stack[++ps.tos] = tk; ps.il[ps.tos] = ps.ind_level = ps.i_l_follow; ++ps.i_l_follow; /* subsequent statements should be indented 1 */ ! ps.search_brace = btype_2; break; case lbrace: /* scanned { */ --- 78,84 ---- ps.p_stack[++ps.tos] = tk; ps.il[ps.tos] = ps.ind_level = ps.i_l_follow; ++ps.i_l_follow; /* subsequent statements should be indented 1 */ ! ps.search_brace = btype_2 && !btype_3; break; case lbrace: /* scanned { */ *************** *** 96,102 **** /* * it is a group as part of a while, for, etc. */ ! if (ps.p_stack[ps.tos] == swstmt && ps.case_indent >= 1) --ps.ind_level; /* * for a switch, brace should be two levels out from the code --- 96,103 ---- /* * it is a group as part of a while, for, etc. */ ! if (ps.p_stack[ps.tos] == swstmt && ps.case_indent >= 1 && ! ps.case_code_indent >= 1) --ps.ind_level; /* * for a switch, brace should be two levels out from the code *************** *** 122,128 **** ps.p_stack[++ps.tos] = whilestmt; ps.il[ps.tos] = ps.i_l_follow; ++ps.i_l_follow; ! ps.search_brace = btype_2; } break; --- 123,129 ---- ps.p_stack[++ps.tos] = whilestmt; ps.il[ps.tos] = ps.i_l_follow; ++ps.i_l_follow; ! ps.search_brace = btype_2 && !btype_3; } break; *************** *** 138,144 **** * be in 1 level */ ps.p_stack[ps.tos] = elsehead; /* remember if with else */ ! ps.search_brace = btype_2 | ps.else_if; } break; --- 139,145 ---- * be in 1 level */ ps.p_stack[ps.tos] = elsehead; /* remember if with else */ ! ps.search_brace = (btype_2 && !btype_3) | ps.else_if; } break; *************** *** 145,151 **** case rbrace: /* scanned a } */ /* stack should have <lbrace> <stmt> or <lbrace> <stmtl> */ if (ps.p_stack[ps.tos - 1] == lbrace) { ! ps.ind_level = ps.i_l_follow = ps.il[--ps.tos]; ps.p_stack[ps.tos] = stmt; } else --- 146,155 ---- case rbrace: /* scanned a } */ /* stack should have <lbrace> <stmt> or <lbrace> <stmtl> */ if (ps.p_stack[ps.tos - 1] == lbrace) { ! if (btype_3) ! ps.i_l_follow = ps.il[--ps.tos]; ! else ! ps.ind_level = ps.i_l_follow = ps.il[--ps.tos]; ps.p_stack[ps.tos] = stmt; } else *************** *** 157,168 **** ps.cstk[ps.tos] = case_ind; /* save current case indent level */ ps.il[ps.tos] = ps.i_l_follow; ! case_ind = ps.i_l_follow + ps.case_indent; /* cases should be one ! * level down from ! * switch */ ! ps.i_l_follow += ps.case_indent + 1; /* statements should be two ! * levels in */ ! ps.search_brace = btype_2; break; case semicolon: /* this indicates a simple stmt */ --- 161,175 ---- ps.cstk[ps.tos] = case_ind; /* save current case indent level */ ps.il[ps.tos] = ps.i_l_follow; ! case_ind = ps.i_l_follow + ps.case_indent; ! /* ! * cases should be one level down from switch ! */ ! ps.i_l_follow += ps.case_indent + ps.case_code_indent; ! /* ! * statements should be two levels in ! */ ! ps.search_brace = btype_2 && !btype_3; break; case semicolon: /* this indicates a simple stmt */