Home | History | Annotate | Line # | Download | only in misc
style revision 1.1
      1 /*
      2  * Style guide for BSD's KNF (Kernel Normal Form).
      3  *
      4  *	from: @(#)style	1.10 (Berkeley) 2/11/92
      5  *	$Id: style,v 1.1 1993/08/06 07:30:52 cgd Exp $
      6  */
      7 
      8 /*
      9  * VERY important single-line comments look like this.
     10  */
     11 
     12 /* Most single-line comments look like this. */
     13 
     14 /*
     15  * Multi-line comments look like this.  Make them real sentences.  Fill
     16  * them so they look like real paragraphs.
     17  */
     18 
     19 /* Include files go at the top of the source module. */
     20 #include <stdio.h>		/* Non-local includes in brackets. */
     21 
     22 /*
     23  * Global pathnames are defined in /usr/include/paths.h.  Pathnames local
     24  * to the program go in pathnames.h in the local directory.
     25  */
     26 #include <paths.h>		/* Non-local includes in brackets. */
     27 #include "pathnames.h"		/* Local includes in quotes. */
     28 
     29 /*
     30  * All ANSI function decls go at the top of the source module.  Use the
     31  * __P macro from include file <sys/cdefs.h>.  Only the kernel has a name
     32  * associated with the types, i.e. in the kernel use:
     33  *
     34  *	void function __P((int a));
     35  *
     36  * in user land use:
     37  *
     38  *	void function __P((int));
     39  */
     40 void function __P((int, const char *));
     41 
     42 /*
     43  * Macros are capitalized, parenthesized, and should avoid side-effects.
     44  * If they are an inline expansion of a function, the function is defined
     45  * all in lowercase, the macro has the same name all in uppercase. If the
     46  * macro needs more than a single line, use braces.  Put a space before
     47  * the backslashes.
     48  */
     49 #define	MACRO(x, y) { \
     50 	variable = (x) + (y); \
     51 	line two; \
     52 }
     53 
     54 /* Enum types are capitalized. */
     55 enum enumtype { ONE, TWO } et;
     56 
     57 /*
     58  * When declaring variables in structures, declare them sorted by use, then
     59  * by size, and then by alphabetical order.  The first category normally
     60  * doesn't apply, but there are exceptions.  Each one gets its own line.
     61  * Put a tab after the first word, i.e. use "int^Ix;" and "struct^Ifoo *x;".
     62  *
     63  * Major structures should be declared at the top of the file they are
     64  * used in, or in separate header files, if they are used in multiple
     65  * source files. Use of the structures should be by separate declarations
     66  * and should be "extern" if they are declared in a header file.
     67  */
     68 struct foo {
     69 	struct	foo *next;	/* List of active foo */
     70 	struct	mumble amumble;	/* Comment for mumble */
     71 	int	bar;
     72 };
     73 struct foo *foohead;		/* Head of global foo list */
     74 
     75 /*
     76  * All major routines should have a comment briefly describing what
     77  * they do. The comment before the "main" routine should describe
     78  * what the program does.
     79  */
     80 main(argc, argv)
     81 	int argc;
     82 	char *argv[];
     83 {
     84 	extern char *optarg;
     85 	extern int optind;
     86 	long num;
     87 	int ch;
     88 	char *ep;
     89 
     90 	/*
     91 	 * For consistency, getopt should be used to parse options.
     92 	 * Options should be sorted in the getopt call and the switch
     93 	 * statement, unless they fall through.  Elements in a switch
     94 	 * statement that fall through should have a FALLTHROUGH comment.
     95 	 * Numerical arguments should be checked for accuracy.
     96 	 */
     97 	while ((ch = getopt(argc, argv, "abn")) != EOF)
     98 		switch (ch) {		/* Indent the switch. */
     99 		case 'a':		/* Don't indent the case. */
    100 			aflag = 1;
    101 			/* FALLTHROUGH */
    102 		case 'b':
    103 			bflag = 1;
    104 			break;
    105 		case 'n':
    106 			num = strtol(optarg, &ep, 10);
    107                         if (num <= 0 || *ep)
    108                                 err("illegal number -- %s", optarg);
    109 			break;
    110 		case '?':
    111 		default:
    112 			usage();
    113 		}
    114 	argc -= optind;
    115 	argv += optind;
    116 
    117 	/*
    118 	 * Space after keywords (while, for, return, switch).  No braces are
    119 	 * used for single statement block.
    120 	 *
    121 	 * Forever loops are done with for's, not while's.
    122 	 */
    123 	for (;;)
    124 		stmt;
    125 
    126 	/*
    127 	 * Parts of a for loop may be left empty.  Avoid declarations in
    128 	 * blocks unless the routine is unusually complicated.
    129 	 */
    130 	for (; cnt < 15; cnt++) {
    131 		stmt1;
    132 		stmt2;
    133 	}
    134 
    135 	while (cnt < 20) {
    136 		stmt1;		/* Second level indents are four spaces. */
    137 		z = a + really + long + statment + that + needs + two lines +
    138 		    gets + indented + four + spaces + on + the + second +
    139 		    and + subsequent + lines.
    140 	}
    141 
    142 	/*
    143 	 * Try to put shorter part first.  The closing and opening braces
    144 	 * go on the same line as the else.
    145 	 */
    146 	if (test)
    147 		stmt;
    148 	else if (bar) {
    149 		stmt;
    150 		stmt;
    151 	} else
    152 		stmt;
    153 
    154 	/* No space after function names. */
    155 	if (error = function(a1, a2))
    156 		exit(error);
    157 
    158 	/*
    159 	 * Unary operators do not require spaces, binary operators do.
    160 	 * Try not to use too many parenthesis unless the statement is
    161 	 * really confusing without them.
    162 	 */
    163 	a = b->c[0] + ~d == (e || f) || g && h ? i : j >> 1;
    164 	k = l & FLAGS;
    165 
    166 	/*
    167 	 * Exits should be 0 on success, and 1 on failure.  Don't denote
    168 	 * all the possible exit points, using the integers 1 through 300.
    169 	 */
    170 	exit(0);    /* Avoid obvious comments such as "Exit 0 on success." */
    171 }
    172 
    173 /*
    174  * If a function type is declared, it should be on a line
    175  * by itself preceeding the function.
    176  */
    177 static char *
    178 function(a1, a2, a3, a4)
    179 	int a1, a2, a4;	/* Declare ints too. */
    180 	float a3;	/* List in order declared, as much as possible. */
    181 {
    182 	/*
    183 	 * When declaring variables in functions declare them sorted by size,
    184 	 * then in alphabetical order; multiple ones per line are okay.  Old
    185 	 * style function declarations can go on the same line.  ANSI style
    186 	 * function declarations should go in the include file "externs.h".
    187 	 * If a line overflows reuse the type keyword.
    188 	 *
    189 	 * Try not to initialize variables in the declarations.
    190 	 */
    191 	extern u_char one;
    192 	extern char two;
    193 	struct foo three, *four;
    194 	double five;
    195 	int *six, seven, eight();
    196 	char *nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen;
    197 	char *overflow __P((void));
    198 	void *mymalloc __P((u_int));
    199 
    200 	/*
    201 	 * Casts and sizeof's are not followed by a space.  NULL is any
    202 	 * pointer type, and doesn't need to be cast, so use NULL instead
    203 	 * of (struct foo *)0 or (struct foo *)NULL.  Also, test pointers
    204 	 * against NULL, i.e. use:
    205 	 *
    206 	 * 	(p = f()) == NULL
    207 	 * not:
    208 	 *	!(p = f())
    209  	 *
    210 	 * Routines returning void * should not have their return values cast
    211 	 * to any pointer type.
    212 	 */
    213 	if ((four = malloc(sizeof(struct foo))) == NULL)
    214 		return (NULL);
    215 	if ((six = (int *)overflow()) == NULL)
    216 		return (NULL);
    217 	return (eight);
    218 }
    219 
    220 /* ANSI function braces look like regular function braces. */
    221 function(int a1, int a2)
    222 {
    223 	...
    224 }
    225 
    226 static void
    227 usage()
    228 {	/* Insert an empty line if the function has no local variables. */
    229 
    230 	/*
    231 	 * Use printf(3), not fputs/puts/putchar/whatever, it's faster and
    232 	 * usually cleaner, not to mention avoiding stupid bugs.
    233 	 *
    234 	 * Usage statements should look like the manual pages.  Options w/o
    235 	 * operands come first, in alphabetical order inside a single set of
    236 	 * braces.  Followed by options with operands, in alphabetical order,
    237 	 * each in braces.  Followed by required arguments in the order they
    238 	 * are specified, followed by optional arguments in the order they
    239 	 * are specified.  A bar ('|') separates either/or options/arguments,
    240 	 * and multiple options/arguments which are specified together are
    241 	 * placed in a single set of braces.
    242 	 *
    243 	 * "usage: f [-ade] [-b b_arg] [-m m_arg] req1 req2 [opt1 [opt2]]\n"
    244 	 * "usage: f [-a | -b] [-c [-de] [-n number]]\n"
    245 	 */
    246 	(void)fprintf(stderr, "usage: f [-ab]\n");
    247 	exit(1);
    248 }
    249