svn commit: r303735 - head/usr.bin/indent

Pedro F. Giffuni pfg at FreeBSD.org
Wed Aug 3 22:08:08 UTC 2016


Author: pfg
Date: Wed Aug  3 22:08:07 2016
New Revision: 303735
URL: https://svnweb.freebsd.org/changeset/base/303735

Log:
  indent(1): add new -sac and -U options.
  
  Add -sac (space after cast) and -nsac options.
  These control whether space character is put after a cast operator or not.
  Default is -nsac.
  
  Add -U option for providing a file containing list of types.
  This is needed for properly deciding which asterisks denote unary
  operation and which denote binary.
  
  These come from PostgreSQL.
  
  Reference:
  https://github.com/pstef/freebsd_indent/commit/84b00e3d46dfd6d955b2f481a1f3b275de9ad6d1
  https://github.com/pstef/freebsd_indent/commit/49c52cf383fa2a246a1a22c6640a5a21b0f1fd90
  
  Differential Revision: https://reviews.freebsd.org/D6966  (Partial)
  Submitted by:	Piotr Stefaniak

Modified:
  head/usr.bin/indent/args.c
  head/usr.bin/indent/indent.1
  head/usr.bin/indent/indent.c
  head/usr.bin/indent/indent_globs.h
  head/usr.bin/indent/lexi.c

Modified: head/usr.bin/indent/args.c
==============================================================================
--- head/usr.bin/indent/args.c	Wed Aug  3 20:21:58 2016	(r303734)
+++ head/usr.bin/indent/args.c	Wed Aug  3 22:08:07 2016	(r303735)
@@ -74,8 +74,12 @@ __FBSDID("$FreeBSD$");
 
 static void scan_profile(FILE *);
 
+#define	KEY_FILE		5	/* only used for args */
+
 const char *option_source = "?";
 
+void add_typedefs_from_file(const char *str);
+
 /*
  * N.B.: because of the way the table here is scanned, options whose names are
  * substrings of other options must occur later; that is, with -lp vs -l, -lp
@@ -91,6 +95,7 @@ struct pro {
 }           pro[] = {
 
     {"T", PRO_SPECIAL, 0, KEY, 0},
+    {"U", PRO_SPECIAL, 0, KEY_FILE, 0},
     {"bacc", PRO_BOOL, false, ON, &blanklines_around_conditional_compilation},
     {"badp", PRO_BOOL, false, ON, &blanklines_after_declarations_at_proctop},
     {"bad", PRO_BOOL, false, ON, &blanklines_after_declarations},
@@ -147,6 +152,7 @@ struct pro {
     {"npro", PRO_SPECIAL, 0, IGN, 0},
     {"npsl", PRO_BOOL, true, OFF, &procnames_start_line},
     {"nps", PRO_BOOL, false, OFF, &pointer_as_binop},
+    {"nsac", PRO_BOOL, false, OFF, &space_after_cast},
     {"nsc", PRO_BOOL, true, OFF, &star_comment_cont},
     {"nsob", PRO_BOOL, false, OFF, &swallow_optional_blanklines},
     {"nut", PRO_BOOL, true, OFF, &use_tabs},
@@ -154,6 +160,7 @@ struct pro {
     {"pcs", PRO_BOOL, false, ON, &proc_calls_space},
     {"psl", PRO_BOOL, true, ON, &procnames_start_line},
     {"ps", PRO_BOOL, false, ON, &pointer_as_binop},
+    {"sac", PRO_BOOL, false, ON, &space_after_cast},
     {"sc", PRO_BOOL, true, ON, &star_comment_cont},
     {"sob", PRO_BOOL, false, ON, &swallow_optional_blanklines},
     {"st", PRO_SPECIAL, 0, STDIN, 0},
@@ -295,6 +302,12 @@ found:
 	    }
 	    break;
 
+	case KEY_FILE:
+	    if (*param_start == 0)
+		goto need_param;
+	    add_typedefs_from_file(param_start);
+	    break;
+
 	default:
 	    errx(1, "set_option: internal error: p_special %d", p->p_special);
 	}
@@ -323,3 +336,21 @@ found:
 	errx(1, "set_option: internal error: p_type %d", p->p_type);
     }
 }
+
+void
+add_typedefs_from_file(const char *str)
+{
+    FILE *file;
+    char line[BUFSIZ];
+
+    if ((file = fopen(str, "r")) == NULL) {
+	fprintf(stderr, "indent: cannot open file %s\n", str);
+	exit(1);
+    }
+    while ((fgets(line, BUFSIZ, file)) != NULL) {
+	/* Remove trailing whitespace */
+	*(line + strcspn(line, " \t\n\r")) = '\0';
+	addkey(strdup(line), 4);
+    }
+    fclose(file);
+}

Modified: head/usr.bin/indent/indent.1
==============================================================================
--- head/usr.bin/indent/indent.1	Wed Aug  3 20:21:58 2016	(r303734)
+++ head/usr.bin/indent/indent.1	Wed Aug  3 22:08:07 2016	(r303735)
@@ -30,7 +30,7 @@
 .\"	@(#)indent.1	8.1 (Berkeley) 7/1/93
 .\" $FreeBSD$
 .\"
-.Dd March 3, 2012
+.Dd August 3, 2016
 .Dt INDENT 1
 .Os
 .Sh NAME
@@ -74,6 +74,7 @@
 .Op Fl npro
 .Op Fl pcs | Fl npcs
 .Op Fl psl | Fl npsl
+.Op Fl sac | Fl nsac
 .Op Fl \&sc | Fl nsc
 .Bk -words
 .Op Fl sob | Fl nsob
@@ -81,6 +82,7 @@
 .Op Fl \&st
 .Op Fl \&ta
 .Op Fl troff
+.Op Fl U Ns Ar file
 .Op Fl ut | Fl nut
 .Op Fl v | Fl \&nv
 .Sh DESCRIPTION
@@ -378,6 +380,11 @@ column 1 \- their types, if any, will be
 The
 default is
 .Fl psl .
+.It Fl sac , nsac
+Control whether parenthesized type names in casts are followed by a space or
+not.
+The default is
+.Fl nsac .
 .It Fl \&sc , nsc
 Enables (disables) the placement of asterisks (`*'s) at the left edge of all
 comments.
@@ -430,6 +437,10 @@ listing in much the same spirit as
 .Xr vgrind 1 .
 If the output file is not specified, the default is standard output,
 rather than formatting in place.
+.It Fl U Ns Ar file
+Adds type names from
+.Ar file
+to the list of type keywords.
 .It Fl ut , nut
 Enables (disables) the use of tab characters in the output.
 Tabs are assumed to be aligned on columns divisible by 8.

Modified: head/usr.bin/indent/indent.c
==============================================================================
--- head/usr.bin/indent/indent.c	Wed Aug  3 20:21:58 2016	(r303734)
+++ head/usr.bin/indent/indent.c	Wed Aug  3 22:08:07 2016	(r303735)
@@ -555,7 +555,7 @@ check_type:
 	    if (ps.cast_mask & (1 << ps.p_l_follow) & ~ps.not_cast_mask) {
 		ps.last_u_d = true;
 		ps.cast_mask &= (1 << ps.p_l_follow) - 1;
-		ps.want_blank = false;
+		ps.want_blank = space_after_cast;
 	    } else
 		ps.want_blank = true;
 	    ps.not_cast_mask &= (1 << ps.p_l_follow) - 1;

Modified: head/usr.bin/indent/indent_globs.h
==============================================================================
--- head/usr.bin/indent/indent_globs.h	Wed Aug  3 20:21:58 2016	(r303734)
+++ head/usr.bin/indent/indent_globs.h	Wed Aug  3 22:08:07 2016	(r303735)
@@ -212,6 +212,7 @@ int	    use_tabs;			/* set true to use t
 					 * false uses all spaces */
 int	    auto_typedefs;		/* set true to recognize identifiers
 					 * ending in "_t" like typedefs */
+int	    space_after_cast;		/* "b = (int) a" vs "b = (int)a" */
 
 /* -troff font state information */
 

Modified: head/usr.bin/indent/lexi.c
==============================================================================
--- head/usr.bin/indent/lexi.c	Wed Aug  3 20:21:58 2016	(r303734)
+++ head/usr.bin/indent/lexi.c	Wed Aug  3 22:08:07 2016	(r303735)
@@ -64,7 +64,7 @@ struct templ {
     int         rwcode;
 };
 
-struct templ specials[1000] =
+struct templ specials[16384] =
 {
     {"switch", 7},
     {"case", 8},
@@ -595,9 +595,10 @@ addkey(char *key, int val)
 	    return;
 	else
 	    p++;
-    if (p >= specials + sizeof specials / sizeof specials[0])
-	return;			/* For now, table overflows are silently
-				 * ignored */
+    if (p >= specials + sizeof(specials) / sizeof(specials[0])) {
+	fprintf(stderr, "indent: typedef table overflow\n");
+	exit(1);
+    }
     p->rwd = key;
     p->rwcode = val;
     p[1].rwd = NULL;


More information about the svn-src-head mailing list