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