include: reduce default stack size
[minix.git] / share / misc / style
blob858a93c7565142e1a08a9854643d5a2a0bd70500
1 /* $NetBSD: style,v 1.49 2011/09/01 09:33:01 christos Exp $ */
3 /*
4  * The revision control tag appears first, with a blank line after it.
5  * Copyright text appears after the revision control tag.
6  */
8 /*
9  * The NetBSD source code style guide.
10  * (Previously known as KNF - Kernel Normal Form).
11  *
12  *      from: @(#)style 1.12 (Berkeley) 3/18/94
13  */
15  * An indent(1) profile approximating the style outlined in
16  * this document lives in /usr/share/misc/indent.pro.  It is a
17  * useful tool to assist in converting code to KNF, but indent(1)
18  * output generated using this profile must not be considered to
19  * be an authoritative reference.
20  */
23  * Source code revision control identifiers appear after any copyright
24  * text.  Use the appropriate macros from <sys/cdefs.h>.  Usually only one
25  * source file per program contains a __COPYRIGHT() section.
26  * Historic Berkeley code may also have an __SCCSID() section.
27  * Only one instance of each of these macros can occur in each file.
28  * Don't use newlines in the identifiers.
29  */
30 #include <sys/cdefs.h>
31 __COPYRIGHT("@(#) Copyright (c) 2008\
32  The NetBSD Foundation, inc. All rights reserved.");
33 __RCSID("$NetBSD: style,v 1.49 2011/09/01 09:33:01 christos Exp $");
36  * VERY important single-line comments look like this.
37  */
39 /* Most single-line comments look like this. */
42  * Multi-line comments look like this.  Make them real sentences.  Fill
43  * them so they look like real paragraphs.
44  */
47  * Attempt to wrap lines longer than 80 characters appropriately.
48  * Refer to the examples below for more information.
49  */
52  * EXAMPLE HEADER FILE:
53  *
54  * A header file should protect itself against multiple inclusion.
55  * E.g, <sys/socket.h> would contain something like:
56  */
57 #ifndef _SYS_SOCKET_H_
58 #define _SYS_SOCKET_H_
60  * Contents of #include file go between the #ifndef and the #endif at the end.
61  */
62 #endif /* !_SYS_SOCKET_H_ */
64  * END OF EXAMPLE HEADER FILE.
65  */
68  * If a header file requires structures, defines, typedefs, etc. from
69  * another header file it should include that header file and not depend
70  * on the including file for that header including both.  If there are
71  * exceptions to this for specific headers it should be clearly documented
72  * in the headers and, if appropriate, the documentation.  Nothing in this
73  * rule should suggest relaxation of the multiple inclusion rule and the
74  * application programmer should be free to include both regardless.
75  */
78  * Kernel include files come first.
79  */
80 #include <sys/types.h>          /* Non-local includes in brackets. */
83  * If it's a network program, put the network include files next.
84  * Group the includes files by subdirectory.
85  */
86 #include <net/if.h>
87 #include <net/if_dl.h>
88 #include <net/route.h>
89 #include <netinet/in.h>
90 #include <protocols/rwhod.h>
93  * Then there's a blank line, followed by the /usr include files.
94  * The /usr include files should be sorted!
95  */
96 #include <assert.h>
97 #include <errno.h>
98 #include <inttypes.h>
99 #include <stdio.h>
100 #include <stdlib.h>
103  * Global pathnames are defined in /usr/include/paths.h.  Pathnames local
104  * to the program go in pathnames.h in the local directory.
105  */
106 #include <paths.h>
108 /* Then, there's a blank line, and the user include files. */
109 #include "pathnames.h"          /* Local includes in double quotes. */
112  * ANSI function declarations for private functions (i.e. functions not used
113  * elsewhere) and the main() function go at the top of the source module.
114  * Don't associate a name with the types.  I.e. use:
115  *      void function(int);
116  * Use your discretion on indenting between the return type and the name, and
117  * how to wrap a prototype too long for a single line.  In the latter case,
118  * lining up under the initial left parenthesis may be more readable.
119  * In any case, consistency is important!
120  */
121 static char *function(int, int, float, int);
122 static int dirinfo(const char *, struct stat *, struct dirent *,
123                    struct statfs *, int *, char **[]);
124 static void usage(void) __dead; /* declare functions that don't return dead */
127  * Macros are capitalized, parenthesized, and should avoid side-effects.
128  * Spacing before and after the macro name may be any whitespace, though
129  * use of TABs should be consistent through a file.
130  * If they are an inline expansion of a function, the function is defined
131  * all in lowercase, the macro has the same name all in uppercase.
132  * If the macro is an expression, wrap the expression in parenthesis.
133  * If the macro is more than a single statement, use ``do { ... } while (0)'',
134  * so that a trailing semicolon works.  Right-justify the backslashes; it
135  * makes it easier to read. The CONSTCOND comment is to satisfy lint(1).
136  */
137 #define MACRO(v, w, x, y)                                               \
138 do {                                                                    \
139         v = (x) + (y);                                                  \
140         w = (y) + 2;                                                    \
141 } while (/* CONSTCOND */ 0)
143 #define DOUBLE(x) ((x) * 2)
145 /* Enum types are capitalized.  No comma on the last element. */
146 enum enumtype {
147         ONE,
148         TWO
149 } et;
152  * When declaring variables in structures, declare them organized by use in
153  * a manner to attempt to minimize memory wastage because of compiler alignment
154  * issues, then by size, and then by alphabetical order. E.g, don't use
155  * ``int a; char *b; int c; char *d''; use ``int a; int b; char *c; char *d''.
156  * Each variable gets its own type and line, although an exception can be made
157  * when declaring bitfields (to clarify that it's part of the one bitfield).
158  * Note that the use of bitfields in general is discouraged.
160  * Major structures should be declared at the top of the file in which they
161  * are used, or in separate header files, if they are used in multiple
162  * source files.  Use of the structures should be by separate declarations
163  * and should be "extern" if they are declared in a header file.
165  * It may be useful to use a meaningful prefix for each member name.
166  * E.g, for ``struct softc'' the prefix could be ``sc_''.
167  */
168 struct foo {
169         struct foo *next;       /* List of active foo */
170         struct mumble amumble;  /* Comment for mumble */
171         int bar;
172         unsigned int baz:1,     /* Bitfield; line up entries if desired */
173                      fuz:5,
174                      zap:2;
175         uint8_t flag;
177 struct foo *foohead;            /* Head of global foo list */
179 /* Make the structure name match the typedef. */
180 typedef struct BAR {
181         int level;
182 } BAR;
184 /* C99 uintN_t is preferred over u_intN_t. */
185 uint32_t zero;
188  * All major routines should have a comment briefly describing what
189  * they do.  The comment before the "main" routine should describe
190  * what the program does.
191  */
193 main(int argc, char *argv[])
195         long num;
196         int ch;
197         char *ep;
199         /*
200          * At the start of main(), call setprogname() to set the program
201          * name.  This does nothing on NetBSD, but increases portability
202          * to other systems.
203          */
204         setprogname(argv[0]);
206         /*
207          * For consistency, getopt should be used to parse options.
208          * Options should be sorted in the getopt call and the switch
209          * statement, unless parts of the switch cascade.  For the
210          * sorting order, see the usage() example below.  Don't forget
211          * to add option descriptions to the usage and the manpage.
212          * Elements in a switch statement that cascade should have a
213          * FALLTHROUGH comment.  Numerical arguments should be checked
214          * for accuracy.  Code that cannot be reached should have a
215          * NOTREACHED comment.
216          */
217         while ((ch = getopt(argc, argv, "abn:")) != -1) {
218                 switch (ch) {           /* Indent the switch. */
219                 case 'a':               /* Don't indent the case. */
220                         aflag = 1;
221                         /* FALLTHROUGH */
222                 case 'b':
223                         bflag = 1;
224                         break;
225                 case 'n':
226                         errno = 0;
227                         num = strtol(optarg, &ep, 10);
228                         if (num <= 0 || *ep != '\0' || (errno == ERANGE &&
229                             (num == LONG_MAX || num == LONG_MIN)) )
230                                 errx(1, "illegal number -- %s", optarg);
231                         break;
232                 case '?':
233                 default:
234                         usage();
235                         /* NOTREACHED */
236                 }
237         }
238         argc -= optind;
239         argv += optind;
241         /*
242          * Space after keywords (while, for, return, switch).  No braces are
243          * required for control statements with only a single statement,
244          * unless it's a long statement.
245          *
246          * Forever loops are done with for's, not while's.
247          */
248         for (p = buf; *p != '\0'; ++p)
249                 continue;               /* Explicit no-op */
250         for (;;)
251                 stmt;
253         /*
254          * Braces are required for control statements with a single statement
255          * that may expand to nothing.
256          */
257 #ifdef DEBUG_FOO
258 #define DPRINTF(a) printf a
259 #else
260 #define DPRINTF(a)
261 #endif
262         if (broken) {
263                 DPRINTF(("broken is %d\n", broken));
264         }
266         /*
267          * Parts of a for loop may be left empty.  Don't put declarations
268          * inside blocks unless the routine is unusually complicated.
269          */
270         for (; cnt < 15; cnt++) {
271                 stmt1;
272                 stmt2;
273         }
275         /* Second level indents are four spaces. */
276         while (cnt < 20)
277                 z = a + really + long + statement + that + needs + two + lines +
278                     gets + indented + four + spaces + on + the + second +
279                     and + subsequent + lines;
281         /*
282          * Closing and opening braces go on the same line as the else.
283          * Don't add braces that aren't necessary except in cases where
284          * there are ambiguity or readability issues.
285          */
286         if (test) {
287                 /*
288                  * I have a long comment here.
289                  */
290 #ifdef zorro
291                 z = 1;
292 #else
293                 b = 3;
294 #endif
295         } else if (bar) {
296                 stmt;
297                 stmt;
298         } else
299                 stmt;
301         /* No spaces after function names. */
302         if ((result = function(a1, a2, a3, a4)) == NULL)
303                 exit(1);
305         /*
306          * Unary operators don't require spaces, binary operators do.
307          * Don't excessively use parenthesis, but they should be used if
308          * statement is really confusing without them, such as:
309          * a = b->c[0] + ~d == (e || f) || g && h ? i : j >> 1;
310          */
311         a = ((b->c[0] + ~d == (e || f)) || (g && h)) ? i : (j >> 1);
312         k = !(l & FLAGS);
314         /*
315          * Exits should be EXIT_SUCCESS on success, and EXIT_FAILURE on
316          * failure.  Don't denote all the possible exit points, using the
317          * integers 1 through 127.  Avoid obvious comments such as "Exit
318          * 0 on success.". Since main is a function that returns an int,
319          * prefer returning from it, than calling exit.
320          */
321         return EXIT_SUCCESS;
325  * The function type must be declared on a line by itself
326  * preceding the function.
327  */
328 static char *
329 function(int a1, int a2, float fl, int a4)
331         /*
332          * When declaring variables in functions declare them sorted by size,
333          * then in alphabetical order; multiple ones per line are okay.
334          * Function prototypes should go in the include file "extern.h".
335          * If a line overflows reuse the type keyword.
336          *
337          * DO NOT initialize variables in the declarations.
338          */
339         extern u_char one;
340         extern char two;
341         struct foo three, *four;
342         double five;
343         int *six, seven;
344         char *eight, *nine, ten, eleven, twelve, thirteen;
345         char fourteen, fifteen, sixteen;
347         /*
348          * Casts and sizeof's are not followed by a space.  NULL is any
349          * pointer type, and doesn't need to be cast, so use NULL instead
350          * of (struct foo *)0 or (struct foo *)NULL.  Also, test pointers
351          * against NULL.  I.e. use:
352          *
353          *      (p = f()) == NULL
354          * not:
355          *      !(p = f())
356          *
357          * The notable exception here is varyadic functions. Since our
358          * code is designed to compile and work on different environments
359          * where we don't have control over the NULL definition (on NetBSD
360          * it is defined as ((void *)0), but on other systems it can be
361          * defined as (0) and both definitions are valid under ANSI C), it
362          * it advised to cast NULL to a pointer on varyadic functions,
363          * because on machines where sizeof(pointer) != sizeof(int) and in
364          * the absence of a prototype in scope, passing an un-casted NULL,
365          * will result in passing an int on the stack instead of a pointer.
366          *
367          * Don't use `!' for tests unless it's a boolean.
368          * E.g. use "if (*p == '\0')", not "if (!*p)".
369          *
370          * Routines returning ``void *'' should not have their return
371          * values cast to more specific pointer types.
372          *
373          * Prefer sizeof(*var) over sizeof(type) because if type changes,
374          * the change needs to be done in one place.
375          *
376          * Use err/warn(3), don't roll your own!
377          */
378         if ((four = malloc(sizeof(*four))) == NULL)
379                 err(1, NULL);
380         if ((six = (int *)overflow()) == NULL)
381                 errx(1, "Number overflowed.");
383         /* No parentheses are needed around the return value. */
384         return eight;
388  * Use ANSI function declarations.  ANSI function braces look like
389  * old-style (K&R) function braces.
390  * As per the wrapped prototypes, use your discretion on how to format
391  * the subsequent lines.
392  */
393 static int
394 dirinfo(const char *p, struct stat *sb, struct dirent *de, struct statfs *sf,
395         int *rargc, char **rargv[])
396 {       /* Insert an empty line if the function has no local variables. */
398         /*
399          * In system libraries, catch obviously invalid function arguments
400          * using _DIAGASSERT(3).
401          */
402         _DIAGASSERT(p != NULL);
403         _DIAGASSERT(filedesc != -1);
405         if (stat(p, sb) < 0)
406                 err(1, "Unable to stat %s", p);
408         /*
409          * To printf quantities that might be larger that "long", include
410          * <inttypes.h>, cast quantities to intmax_t or uintmax_t and use
411          * PRI?MAX constants.
412          */
413         (void)printf("The size of %s is %" PRIdMAX " (%#" PRIxMAX ")\n", p,
414             (intmax_t)sb->st_size, (uintmax_t)sb->st_size);
416         /*
417          * To printf quantities of known bit-width, use the corresponding
418          * defines (generally only done within NetBSD for quantities that
419          * exceed 32-bits).
420          */
421         (void)printf("%s uses %" PRId64 " blocks and has flags %#" PRIx32 "\n",
422             p, sb->st_blocks, sb->st_flags);
424         /*
425          * There are similar constants that should be used with the *scanf(3)
426          * family of functions: SCN?MAX, SCN?64, etc.
427          */
431  * Functions that support variable numbers of arguments should look like this.
432  * (With the #include <stdarg.h> appearing at the top of the file with the
433  * other include files.)
434  */
435 #include <stdarg.h>
437 void
438 vaf(const char *fmt, ...)
440         va_list ap;
442         va_start(ap, fmt);
443         STUFF;
444         va_end(ap);
445                                 /* No return needed for void functions. */
448 static void
449 usage(void)
452         /*
453          * Use printf(3), not fputs/puts/putchar/whatever, it's faster and
454          * usually cleaner, not to mention avoiding stupid bugs.
455          * Use snprintf(3) or strlcpy(3)/strlcat(3) instead of sprintf(3);
456          * again to avoid stupid bugs.
457          *
458          * Usage statements should look like the manual pages.
459          * Options w/o operands come first, in alphabetical order
460          * inside a single set of braces, upper case before lower case
461          * (AaBbCc...).  Next are options with operands, in the same
462          * order, each in braces.  Then required arguments in the
463          * order they are specified, followed by optional arguments in
464          * the order they are specified.  A bar (`|') separates
465          * either/or options/arguments, and multiple options/arguments
466          * which are specified together are placed in a single set of
467          * braces.
468          *
469          * Use getprogname() instead of hardcoding the program name.
470          *
471          * "usage: f [-aDde] [-b b_arg] [-m m_arg] req1 req2 [opt1 [opt2]]\n"
472          * "usage: f [-a | -b] [-c [-de] [-n number]]\n"
473          */
474         (void)fprintf(stderr, "usage: %s [-ab]\n", getprogname());
475         exit(EXIT_FAILURE);