From owner-freebsd-hackers@FreeBSD.ORG Fri Jun 11 02:53:22 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 324D616A4CE for ; Fri, 11 Jun 2004 02:53:22 +0000 (GMT) Received: from mail.teleri.net (teleri.net [216.193.194.32]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1C25343D2D for ; Fri, 11 Jun 2004 02:53:22 +0000 (GMT) (envelope-from wd@teleri.net) Received: by mail.teleri.net (Postfix, from userid 501) id 2834F11448; Thu, 10 Jun 2004 19:53:07 -0700 (PDT) Date: Thu, 10 Jun 2004 21:53:07 -0500 From: Chip Norkus To: hackers@freebsd.org Message-ID: <20040611025307.GG17367@teleri.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="3MwIy2ne0vdjdPXF" Content-Disposition: inline User-Agent: Mutt/1.4.1i Subject: indent bugfix / added features X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Jun 2004 02:53:22 -0000 --3MwIy2ne0vdjdPXF Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi all, I've been working on a major project, and decided to use indent to normalize the code a bit. In doing so I discovered a few deficencies in the stock FreeBSD (5.2-CURRENT) indent and decided to fix them, I thought these might be fairly common wishes (and one of them is a bugfix) and have attached a patch which does the following: * Adds an option to control tab use in output code (-ut and -nut) (This is in the GNU indent) * Adds an option to control brace placement after function declaration (-fbs and -nfbs). What this does, specifically, is allow you to have indent produce 'func(args..) {' instead of 'func(args..)\n{'. The old behavior is the default. * Fixes the indent bug when aligning variable names with an indentation level that is not a multiple of 8. This works for both the 'tab use' and 'no tab use' varieties of code output. I don't know if anyone would be interested in committing the bugfix (I believe it is correct) or added features, but I hope someone else finds this useful. -chip -- personal: chip norkus; renaissance hacker; wd@teleri.net work: systems engineer @ lunarpages, inc.; chip@lunarpages.com info: finger wd@teleri.net for plan or keys; http://telekinesis.org --3MwIy2ne0vdjdPXF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="indent.patch" diff -u /usr/src/usr.bin/indent/args.c ./args.c --- /usr/src/usr.bin/indent/args.c Tue Mar 23 13:33:16 2004 +++ ./args.c Thu Jun 10 19:01:10 2004 @@ -111,6 +111,7 @@ {"eei", PRO_BOOL, false, ON, &extra_expression_indent}, {"ei", PRO_BOOL, true, ON, &ps.else_if}, {"fbc", PRO_FONT, 0, 0, (int *) &blkcomf}, + {"fbs", PRO_BOOL, true, ON, &function_brace_split}, {"fbx", PRO_FONT, 0, 0, (int *) &boxcomf}, {"fb", PRO_FONT, 0, 0, (int *) &bodyf}, {"fc1", PRO_BOOL, true, ON, &format_col1_comments}, @@ -136,6 +137,7 @@ {"ndj", PRO_BOOL, false, OFF, &ps.ljust_decl}, {"neei", PRO_BOOL, false, OFF, &extra_expression_indent}, {"nei", PRO_BOOL, true, OFF, &ps.else_if}, + {"nfbs", PRO_BOOL, true, OFF, &function_brace_split}, {"nfc1", PRO_BOOL, true, OFF, &format_col1_comments}, {"nfcb", PRO_BOOL, true, OFF, &format_block_comments}, {"nip", PRO_BOOL, true, OFF, &ps.indent_parameters}, @@ -146,6 +148,7 @@ {"nps", PRO_BOOL, false, OFF, &pointer_as_binop}, {"nsc", PRO_BOOL, true, OFF, &star_comment_cont}, {"nsob", PRO_BOOL, false, OFF, &swallow_optional_blanklines}, + {"nut", PRO_BOOL, true, OFF, &use_tabs}, {"nv", PRO_BOOL, false, OFF, &verbose}, {"pcs", PRO_BOOL, false, ON, &proc_calls_space}, {"psl", PRO_BOOL, true, ON, &procnames_start_line}, @@ -154,6 +157,7 @@ {"sob", PRO_BOOL, false, ON, &swallow_optional_blanklines}, {"st", PRO_SPECIAL, 0, STDIN, 0}, {"troff", PRO_BOOL, false, ON, &troff}, + {"ut", PRO_BOOL, true, ON, &use_tabs}, {"v", PRO_BOOL, false, ON, &verbose}, /* whew! */ {0, 0, 0, 0, 0} diff -u /usr/src/usr.bin/indent/indent.c ./indent.c --- /usr/src/usr.bin/indent/indent.c Tue Feb 17 02:33:36 2004 +++ ./indent.c Thu Jun 10 21:45:58 2004 @@ -91,7 +91,7 @@ int squest; /* when this is positive, we have seen a ? * without the matching : in a ?: * construct */ - int use_tabs; /* true if using tabs to indent to var name */ + int loc_use_tabs; /* true if using tabs to indent to var name */ const char *t_ptr; /* used for copying tokens */ int type_code; /* the type of token, returned by lexi */ @@ -765,8 +765,13 @@ } else if (ps.in_parameter_declaration && !ps.in_or_st) { ps.i_l_follow = 0; - dump_line(); - ps.want_blank = false; + if (function_brace_split) { + /* dump the line prior to the brace ... */ + dump_line(); + ps.want_blank = false; + } else + /* add a space between the decl and brace */ + ps.want_blank = true; } } if (ps.in_parameter_declaration) @@ -914,11 +919,11 @@ if (ps.ind_level == 0 || ps.dec_nest > 0) { /* global variable or struct member in local variable */ dec_ind = ps.decl_indent > 0 ? ps.decl_indent : i; - use_tabs = ps.decl_indent > 0; + loc_use_tabs = (use_tabs ? ps.decl_indent > 0 : 0); } else { /* local variable */ dec_ind = ps.local_decl_indent > 0 ? ps.local_decl_indent : i; - use_tabs = ps.local_decl_indent > 0; + loc_use_tabs = (use_tabs ? ps.local_decl_indent > 0 : 0); } goto copy_id; @@ -936,17 +941,31 @@ e_code += strlen(e_code); } else { int pos, startpos; + int loc_dec_ind; + /* In order to get the tab math right for + * indentations that are not multiples of 8 we + * need to modify both startpos and dec_ind + * (loc_dec_ind) here by eight minus the + * remainder of the current starting column + * divided by eight. This seems to be a + * properly working fix. */ startpos = e_code - s_code; + loc_dec_ind = dec_ind; + if ((ps.ind_level * ps.ind_size) % 8 != 0) { + startpos += (ps.ind_level * ps.ind_size) % 8; + loc_dec_ind += (ps.ind_level * ps.ind_size) % 8; + } + pos = startpos; - if (use_tabs) { - while ((pos & ~7) + 8 <= dec_ind) { + if (loc_use_tabs) { + while ((pos & ~7) + 8 <= loc_dec_ind) { CHECK_SIZE_CODE; *e_code++ = '\t'; pos = (pos & ~7) + 8; } } - while (pos < dec_ind) { + while (pos < loc_dec_ind) { CHECK_SIZE_CODE; *e_code++ = ' '; pos++; diff -u /usr/src/usr.bin/indent/indent_globs.h ./indent_globs.h --- /usr/src/usr.bin/indent/indent_globs.h Tue Feb 17 02:33:36 2004 +++ ./indent_globs.h Thu Jun 10 21:43:42 2004 @@ -199,6 +199,10 @@ * indented an extra tab stop so that * they don't conflict with the code * that follows */ +int function_brace_split; /* split function declaration and + * brace onto separate lines? */ +int use_tabs; /* Set true to use tabs for spacing, + * false uses all spaces. */ /* -troff font state information */ diff -u /usr/src/usr.bin/indent/io.c ./io.c --- /usr/src/usr.bin/indent/io.c Tue Feb 17 02:33:36 2004 +++ ./io.c Thu Jun 10 21:44:28 2004 @@ -472,11 +472,13 @@ if (current >= target) return (current); /* line is already long enough */ curr = current; - while ((tcur = ((curr - 1) & tabmask) + tabsize + 1) <= target) { - putc('\t', output); - curr = tcur; - } - while (curr++ < target) + if (use_tabs) { + while ((tcur = ((curr - 1) & tabmask) + tabsize + 1) <= target) { + putc('\t', output); + curr = tcur; + } + } + while (curr++ < target) putc(' ', output); /* pad with final blanks */ } return (target); --3MwIy2ne0vdjdPXF--