annotate STYLE.md @ 8:51b272eab08a 0.2.0

misc: update before 0.2.0
author David Demelier <markand@malikania.fr>
date Thu, 26 Nov 2020 19:18:30 +0100
parents 1cf90affaa33
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
1cf90affaa33 misc: rename the project to imgup
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
1 imgup CODING STYLE
1cf90affaa33 misc: rename the project to imgup
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
2 ==================
0
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 File content
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 ============
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 - Use UTF-8 charset,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 - Use Unix line endings,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 - Never write two consecutives blank lines.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 Indent
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 ======
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 Use tabs to indent and spaces for alignment. Tabs are meant and designed for
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 indenting code and have the advantage of being configurable. On the other hand
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 to keep code clean, you must align content with spaces only *within* a line.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 Note: we recommend 8 columns to avoid high number of indentations.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 Example (show whitespace in your editor)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 ```cpp
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 class foo {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 public:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 enum type {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 dummy_value, // dummy comment
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 other_value // other comment
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 };
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 void long_function_name(very_long_type x1,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 very_long_type x2)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 const map<string, string> m{
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 { "hostname", "127.0.0.1" },
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 { "port", "6667" }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 };
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 };
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 As a rule of thumb, tabs must always be all length.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 Example of incorrect usage:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 ```cpp
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 { "hostname", "127.0.0.1" },
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 { "port", "6667" }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 This example will not align correctly if tabstops are not set to 8.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 C
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 =
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 Style
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 -----
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 - Do not exceed 80 columns.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 ### Braces
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 Braces follow the K&R style, they are never placed on their own lines except for
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 function definitions.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 Do not put braces for single line statements.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 if (condition) {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 apply();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 add();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 } else
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 ok();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 if (condition)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 validate();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 if (foo)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 state = long + conditional + that + requires + several + lines +
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 to + complete;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 Functions require braces on their own lines.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 void
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 function()
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 Note: the type of a function is broken into its own line.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 ### Spaces
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 Each reserved keyword (e.g. `if`, `for`, `while`) requires a single space before
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 its argument.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 Normal function calls do not require it.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 if (foo)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 destroy(sizeof (int));
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 ### Pointers
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 Pointers are always next variable name.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 void
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 cleanup(struct owner *owner);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 ### Typedefs
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 Do not use typedef for non-opaque objects. It is allowed for function pointers.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 struct pack {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 int x;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 int y;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 };
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 typedef void (*logger)(const char *line);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 Note: do never add `_t` suffix to typedef's.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 ### Naming
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 - English names,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 - No hungarian notation,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 Almost everything is in `underscore_case` except macros and enumeration
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 constants.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 #if defined(FOO)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 # include <foo.hpp>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 #endif
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 #define MAJOR 1
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 #define MINOR 0
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 #define PATCH 0
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 enum color {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 COLOR_RED,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 COLOR_GREEN,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 COLOR_BLUE
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 };
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 void
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 add_widget(const struct widget *widget_to_add);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 ### Header guards
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 Do not use `#pragma once`.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 Header guards are usually named `PROJECT_COMPONENT_FILENAME_H`.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
161
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 #ifndef FOO_COMMON_UTIL_H
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 #define FOO_COMMON_UTIL_H
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 #endif /* !FOO_COMMON_UTIL_HPP */
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 ### Enums
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 Enumerations constants are always defined in separate line to allow commenting
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 them as doxygen.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 Note: enumeration constants are prefixed with its name.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 enum color {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 COLOR_RED,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 COLOR_GREEN,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 COLOR_BLUE
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 };
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 ### Switch
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 In a switch case statement, you **must** not declare variables and not indent
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 cases.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 switch (variable) {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 case foo:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 do_some_stuff();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 break;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 default:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 break;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 ### Files
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 - Use `.c` and `.h` as file extensions,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 - Filenames are all lowercase.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 ### Comments
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 Avoid useless comments in source files. Comment complex things or why it is done
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 like this. However any public function in the .h **must** be documented as
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 doxygen without exception.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
209
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 /*
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 * Multi line comments look like
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 * this.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 */
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 // Short comment
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 Use `#if 0` to comment blocks of code.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 #if 0
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 broken_stuff();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 #endif
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 ### Includes
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 The includes should always come in the following order.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 1. System headers (POSIX mostly)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 2. C header
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 3. Third party libraries
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 4. Application headers in ""
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
235
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 #include <sys/types.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 #include <sys/stat.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 #include <string.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
240
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 #include <libircclient.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 #include "foo.h"
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 Programming
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 -----------
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 ### C Standard
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 Use C99 standard without extensions.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 ### Assertions
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 Use the `assert` macro from the assert.h header file to verify programming
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 errors.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
257
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 For example, you may use `assert` to verify that the developer access the data
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 between the bounds of an array:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
260
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 int
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 get(struct data *data, unsigned index)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 assert(index < data->length);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
266
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 return data->buffer[index];
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
270
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 The `assert` macro is not meant to check that a function succeeded, this code
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 must not be written that way:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
273
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 assert(listen(10));
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
277
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 ### Return
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
279
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 The preferred style is to return early in case of errors. That makes the code
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 more linear and not highly indented.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 This code is preferred:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
284
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 ```c
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 if (a_condition_is_not_valid)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 return false;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 if (an_other_condition)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 return false;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
290
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 start();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 save();
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 return true;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
296
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 Additional rules:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
298
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 - Do never put parentheses between the returned value,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 - Do not put a else branch after a return.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
301
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 Markdown
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 ========
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 Headers
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 -------
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
307
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 For 1st and 2nd level headers, use `===` and `---` delimiters and underline the
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 whole title. Otherwise use `###`.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
310
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 ```markdown
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 Top level title
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 ===============
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
314
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 Sub title
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 ---------
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
317
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 ### Header 3
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
319
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 #### Header 4
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
321
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 ##### Header 5
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
323
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 ###### Header 6
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
326
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 Lists
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 -----
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 Use hyphens for unordered lists for consistency, do not indent top level lists,
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 then indent by two spaces each level
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
332
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 ```markdown
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 - unordered list 1
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 - unordered list 2
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 - sub unordered item
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
337
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 1. unordered list 1
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 2. unordered list 2
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 2.1. sub unordered item
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
342
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 Code blocks
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 -----------
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
345
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 You can use three backticks and the language specifier or just indent a block by
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 for leading spaces if you don't need syntax.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
348
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 ```cpp
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 std::cout << "hello world" << std::endl;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
352
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 And without syntax:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
354
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 ```markdown
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 This is simple code block.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
358
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 Tables
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 ------
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
361
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 Tables are supported and formatted as following:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
363
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 ```markdown
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 | header 1 | header 2 |
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 |----------|----------|
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 | item 1 | item 2 |
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 ```
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
369
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 Alerts
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 ------
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
372
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 It's possible to prefix a paragraph by one of the following topic, it renders a
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 different block depending on the output format:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
375
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 - Note:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 - Warning:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 - Danger:
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
379
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 Then, if the paragraph is too long, indent the text correctly.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
381
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 ```markdown
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 Note: this is an information block that is too long to fit between the limits so
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 it is split and indented.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 ```