annotate STYLE.md @ 50:520f57836ff3

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