--- /dev/null
+Name
+ style/c - C coding style
+
+Description
+ Indentation
+ Use 4 spaces. Ideally, tabs would be preferred; however, they
+ cause 5 spaces in manual pages, which is weird, so we use 4
+ spaces.
+
+ if (foo)
+ bar();
+
+ Indent preprocessor directives after the hash by 1 space.
+
+ #ifndef FOO
+ # define FOO
+ #endif
+
+ 'case' is not indented within a 'switch'.
+
+ switch (x) {
+ case 1:
+ foo();
+ break;
+ default:
+ break;
+ }
+
+ Line length
+ Lines should not be longer than 80 columns. Except that if they
+ contain string literals, they can be longer; don't break
+ user-visible string literals.
+
+ When breaking a function prototype, start the continuation line
+ with 4 spaces.
+
+ When breaking a function call, align at the opening parenthesis.
+
+ Braces and spaces
+ Use K&R style for braces. But if the controlling expression of
+ an if/for/while is broken, the opening brace goes on a line of
+ its own.
+
+ if (foo)
+ bar();
+
+ if (foooooooooooooooooooooooooo
+ || baaaaaaaaaaaaaaaaaaaaaaaaaar)
+ {
+ baz();
+ }
+
+ Treat sizeof() and similar operators as functions, not keywords.
+ Use a space after keywords, but not after functions.
+
+ Use a space to separate binary and ternary operators (except
+ `.` and `->`), but not to separate unary operators.
+
+ Use a space between a cast and the expression it converts.
+
+ Naming
+ Use short names. Long names should be an exception, and
+ indicate that something probably isn't well designed.
+
+ Functions
+ Functions should be short and sweet.
+
+ All functions should have prototypes.
+
+ Macros
+ Don't be worried about using macros. They can and do improve
+ safety, if used judiciously.
+
+ Error handling
+ goto is good for error handling. It's certainly better than the
+ alternatives most of the time.
+
+ Check for explicit error codes (connect(sfd, &sa, len) == -1)
+ instead of vague comparisons (connect(sfd, &sa, len) < 0).
+
+ Includes
+ Follow include-what-you-use guidelines.
+
+ Comments
+ Comments lie; don't write comments. If you need to comment
+ code, do it in the commit message. If that's not enough, maybe
+ the code isn't good.
+
+ In most cases, a function with an appropriate name is better
+ than a comment. A function is also better than a named loop.
+
+ Variables
+ Variable should be declared at the top of the block in which
+ they are used. That is, use C89 declarations. The exception is
+ loop variables; we use C99 for-loop variable declarations.
+
+ The '*' goes with the variable name, not with the type name.
+ Except if the pointer is qualified, in which case the '*' goes
+ with the type name.
+
+ Variable declarations should be sorted by type-name length, and
+ then by type-name alphabetic order. The variable names should
+ all be aligned. There should be at least two spaces between a
+ type name and the variable name. Declarations should be
+ separate from statements by a blank line.
+
+ int i;
+ char c;
+ char *p;
+ size_t size;
+
+ Dialect
+ We use the latest GNU C dialect. Feel free to use new language
+ features, unless they are evil.
+
+See also
+ For anything not explicitly covered above, you can check the
+ following coding styles, roughly in order of appearance:
+
+ <https://include-what-you-use.org/>
+ <https://doc.cat-v.org/bell_labs/pikestyle>
+ <https://www.kernel.org/doc/html/latest/process/coding-style.html>
+ <https://git.kernel.org/pub/scm/git/git.git/tree/Documentation/CodingGuidelines>
+ <https://mbsd.evolvis.org/htman/i386/man9/style.htm>
+ <https://nginx.org/en/docs/dev/development_guide.html#code_style>
+ <https://google.github.io/styleguide/>
+ <https://www.gnu.org/prep/standards/standards.html>
+ <https://www.cis.upenn.edu/~lee/06cse480/data/cstyle.ms.pdf>