style
[RRG-proxmark3.git] / HACKING.md
blobdcbdfd34f3ebcb9a5f2e193ad2c9f7a14ecb7786
1 _"Coding styles are like assholes, everyone has one and no one likes anyone elses."_
2 --Eric Warmenhoven
4 # Overview
6 The Proxmark3 codebase is pretty messy and in the process of being cleaned up,
7 so we don't have clear guidelines on how to place new code just yet. However,
8 please don't make things worse.
10 However, we have established a set of coding style guidelines in order to
11 clean up the code consistently and keep it consistent in the future.
12 Look around and respect the same style.
14 Helper script to get some uniformity in the style:
16 `$ make style`
18 It makes use of `astyle` so be sure to install it first.
21 # Indentation
23 Don't use tabs, editors are messing them up too easily.
24 Increment unit is four spaces.
26 If you use `make style`, this will be done for you.
28 # Width
30 Try to keep lines to a reasonable length. 80 characters is a good mark; using an
31 editor that shows a vertical line is a great idea. However, don't break a line
32 just because you're slightly over, it's not worth it. No 200-character lines,
33 though.
35 # Macros
37 `#define`, function-like or not, are all UPPERCASE unless you're emulating a
38 well-known function name.
40 # Identifiers
42 Functions, local variables, and arguments are all named using
43 `underscores_as_spaces`. Global variables are Evil and are prepended with `g_` to
44 distinguish them. Avoid them.
46 Single-character variables are a bad idea. Exceptions: loop iterators and maybe
47 simple byte pointers (`*p`) in very obvious places. If you have more than one
48 such pointer, use a real name. If you have more than a couple nested loops,
49 complex logic, or indices that differ in interpretation or purpose, use real
50 names instead of i,j,k.
52 # Data types
54 Use `stdint.h` types (`uint32_t` and friends) unless you have a reason not to. Don't
55 use microsoft-style `DWORD` and the like, we're getting rid of those. Avoid char
56 for buffers, `uint8_t` is more obvious when you're not working with strings. Use
57 `const` where things are const. Try to use `size_t` for sizes.
59 Pointers and reference operators are attached to the variable name:
60 ```
61     void *ptr;
62 ```
63 not:
64 ```
65     void* ptr;
66 ```
67 otherwise you're tempted to write:
68 ```
69     void* in, out;
70 ```
71 and you'll fail.
73 `make style` will take care of pointers & reference operators.
75 # Expressions
77 In general, use whitespace around binary operators - no unspaced blobs of an
78 expression. `make style` will take care of whitespaces around operators.
80 For example,
81 ```
82     if (5 * a < b && some_bool_var)
83 ```
84 but not
85 ```
86     if (5*a<b&&some_bool_var)
87 ```
88 For equality with constants, use `i == 0xF00`, not `0xF00 == i`. The compiler warns
89 you about `=` vs `==` anyway, and you shouldn't be screwing that one up by now
90 anyway.
92 # If / for / while etc
94 Put the opening brace on the same line, with a space before it.
95 There should be a space between the construct name (if/for/whatever) and the
96 opening parenthesis, and there should be a space between the closing parenthesis
97 and the opening brace, and no space between parenthesis and expression.
98 `make style` will take care of all that.
100 If you do split the condition, put the binary operators that join the lines at
101 the beginning of the following lines, not at the end of the prior lines.
103 For generic `for()` iterator variables, declare them in-line:
105     for (int i = 0; i < 10; i++) {
106         ...
107     }
109 Note the spaces after the semicolons.
111 if/else should be laid out as follows:
113     if (foo) {
114         ...
115     } else if (bar) {
116         ...
117     } else {
118         ...
119     }
121 You can skip braces around 1-line statements but don't mix braces vs. no braces.
123 # Functions
125 Put the return type on the same line.
126 Put a space after a comma in argument lists.
127 Open the brace after the declaration (after a space).
128 `make style` will take care of all that.
130 void foo(int a_thing, int something_else) {
131     ...
134 Functions with no arguments are declared as `f(void)`, not `f()`.
135 Use static for functions that aren't exported, and put exported functions
136 in a header file (one header file per source file with exported functions
137 usually, no huge headers with all functions). 
139 void baz(void) {
140     foo(bluh, blah);
143 Function names should be `separated_with_underscores()`, except for standard
144 functions (`memcpy`, etc.). It may make sense to break this rule for very common,
145 generic functions that look like library functions (e.g. `dprintf()`).
147 Don't use single-character arguments.
148 Exception: very short functions with one argument that's really obvious:
150 static int ascii(char c) {
151     if (c < 0x20 || c >= 0x7f)
152         return '.';
153     else
154         return c;
159 static void hexdump(void *buf, size_t len) {
160     ...
163 As a general guideline, functions shouldn't usually be much more than 30-50
164 lines. Above, the general algorithm won't be easily apparent, and you're
165 probably missing some factoring/restructuring opportunity.
167 # Structs / unions / enums
169 Use typedefs when defining structs. The type should be named something_t.
171 typedef struct {
172     blah blah;
173 } prox_cmd_t;
175 You can use anonymous enums to replace lots of sequential or mostly-sequential
176 #defines.
178 # Switch
180 Indent once for the `case:` labels, then again for the body. Like this:
182 switch(bar) {
183     case OPTION_A:
184         do_stuff();
185         break;
186     case OPTION_B:
187         do_other_stuff();
188         break;
191 `make style` will take care of the indentation.
193 If you fall through into another case, add an explicit comment;
194 otherwise, it can look confusing.
196 If your `switch()` is too long or has too many cases, it should be cleaned up.
197 Split off the cases into functions, break the switch() into parent and children
198 switches (e.g. command and subcommand), or use an array of function pointers or
199 the like. In other words, use common sense and your brain.
201 If you need local scope variables for a case, you can add braces:
203 switch(bar) {
204     case OPTION_A: {
205         int baz = 5 * bar;
206         do_stuff(baz);
207         break;
208     }
209     ...
211 But at that point you should probably consider using a separate function.
213 # Comments
215 Use //, it's shorter:
217 // this does foo
220 // baz:
221 // This does blah blah blah .....
222 // blah blah...
224 `/* */` can be used to comment blocks of code, but you should probably remove
225 them anyway - we have version control, it's easy to fetch old code if needed,
226 so avoid committing commented out chunks of code. The same goes for `#if 0`.
228 # File
230 Please use common sense and restrain yourself from having a thousands line
231 file. Functions in a file should have something *specific* in common. Over time
232 sub-categories can arise and should therefore yield to file splitting.
234 For these reasons, vague and general filenames (e.g. `util.*`, `global.*`, `misc.*`,
235 `main.*`, and the like) should be very limited, if not prohibited.
237 # File headers
239 License/description header first:
241 //-----------------------------------------------------------------------------
242 // YOUR COPYRIGHT LINE GOES HERE
244 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
245 // at your option, any later version. See the LICENSE.txt file for the text of
246 // the license.
247 //-----------------------------------------------------------------------------
248 // FILE DESCRIPTION GOES HERE
249 //-----------------------------------------------------------------------------
251 If you modify a file in any non-trivial way (add code, etc.), add your copyright
252 to the top with the current year.
254 # Header files
256 Use the following include guard format:
258 #ifndef FOOBAR_H__
259 #define FOOBAR_H__
263 #endif // FOOBAR_H__
265 Keep in mind that `__FOOBAR_H` would be reserved by the implementation and thus
266 you shouldn't use it (same for `_FOOBAR_H`).
268 # Whitespace
270 Avoid trailing whitespace (no line should end in tab or space).
271 Keep a newline (blank line) at the end of each file.
273 `make style` will take care of both.