xref: /aosp_15_r20/external/curl/docs/internals/CODE_STYLE.md (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker<!--
2*6236dae4SAndroid Build Coastguard WorkerCopyright (C) Daniel Stenberg, <[email protected]>, et al.
3*6236dae4SAndroid Build Coastguard Worker
4*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl
5*6236dae4SAndroid Build Coastguard Worker-->
6*6236dae4SAndroid Build Coastguard Worker
7*6236dae4SAndroid Build Coastguard Worker# curl C code style
8*6236dae4SAndroid Build Coastguard Worker
9*6236dae4SAndroid Build Coastguard WorkerSource code that has a common style is easier to read than code that uses
10*6236dae4SAndroid Build Coastguard Workerdifferent styles in different places. It helps making the code feel like one
11*6236dae4SAndroid Build Coastguard Workersingle code base. Easy-to-read is an important property of code and helps
12*6236dae4SAndroid Build Coastguard Workermaking it easier to review when new things are added and it helps debugging
13*6236dae4SAndroid Build Coastguard Workercode when developers are trying to figure out why things go wrong. A unified
14*6236dae4SAndroid Build Coastguard Workerstyle is more important than individual contributors having their own personal
15*6236dae4SAndroid Build Coastguard Workertastes satisfied.
16*6236dae4SAndroid Build Coastguard Worker
17*6236dae4SAndroid Build Coastguard WorkerOur C code has a few style rules. Most of them are verified and upheld by the
18*6236dae4SAndroid Build Coastguard Worker`scripts/checksrc.pl` script. Invoked with `make checksrc` or even by default
19*6236dae4SAndroid Build Coastguard Workerby the build system when built after `./configure --enable-debug` has been
20*6236dae4SAndroid Build Coastguard Workerused.
21*6236dae4SAndroid Build Coastguard Worker
22*6236dae4SAndroid Build Coastguard WorkerIt is normally not a problem for anyone to follow the guidelines, as you just
23*6236dae4SAndroid Build Coastguard Workerneed to copy the style already used in the source code and there are no
24*6236dae4SAndroid Build Coastguard Workerparticularly unusual rules in our set of rules.
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard WorkerWe also work hard on writing code that are warning-free on all the major
27*6236dae4SAndroid Build Coastguard Workerplatforms and in general on as many platforms as possible. Code that obviously
28*6236dae4SAndroid Build Coastguard Workercauses warnings is not accepted as-is.
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Worker## Naming
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard WorkerTry using a non-confusing naming scheme for your new functions and variable
33*6236dae4SAndroid Build Coastguard Workernames. It does not necessarily have to mean that you should use the same as in
34*6236dae4SAndroid Build Coastguard Workerother places of the code, just that the names should be logical,
35*6236dae4SAndroid Build Coastguard Workerunderstandable and be named according to what they are used for. File-local
36*6236dae4SAndroid Build Coastguard Workerfunctions should be made static. We like lower case names.
37*6236dae4SAndroid Build Coastguard Worker
38*6236dae4SAndroid Build Coastguard WorkerSee the [INTERNALS](https://curl.se/dev/internals.html#symbols) document on
39*6236dae4SAndroid Build Coastguard Workerhow we name non-exported library-global symbols.
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard Worker## Indenting
42*6236dae4SAndroid Build Coastguard Worker
43*6236dae4SAndroid Build Coastguard WorkerWe use only spaces for indentation, never TABs. We use two spaces for each new
44*6236dae4SAndroid Build Coastguard Workeropen brace.
45*6236dae4SAndroid Build Coastguard Worker
46*6236dae4SAndroid Build Coastguard Worker```c
47*6236dae4SAndroid Build Coastguard Workerif(something_is_true) {
48*6236dae4SAndroid Build Coastguard Worker  while(second_statement == fine) {
49*6236dae4SAndroid Build Coastguard Worker    moo();
50*6236dae4SAndroid Build Coastguard Worker  }
51*6236dae4SAndroid Build Coastguard Worker}
52*6236dae4SAndroid Build Coastguard Worker```
53*6236dae4SAndroid Build Coastguard Worker
54*6236dae4SAndroid Build Coastguard Worker## Comments
55*6236dae4SAndroid Build Coastguard Worker
56*6236dae4SAndroid Build Coastguard WorkerSince we write C89 code, **//** comments are not allowed. They were not
57*6236dae4SAndroid Build Coastguard Workerintroduced in the C standard until C99. We use only __/* comments */__.
58*6236dae4SAndroid Build Coastguard Worker
59*6236dae4SAndroid Build Coastguard Worker```c
60*6236dae4SAndroid Build Coastguard Worker/* this is a comment */
61*6236dae4SAndroid Build Coastguard Worker```
62*6236dae4SAndroid Build Coastguard Worker
63*6236dae4SAndroid Build Coastguard Worker## Long lines
64*6236dae4SAndroid Build Coastguard Worker
65*6236dae4SAndroid Build Coastguard WorkerSource code in curl may never be wider than 79 columns and there are two
66*6236dae4SAndroid Build Coastguard Workerreasons for maintaining this even in the modern era of large and high
67*6236dae4SAndroid Build Coastguard Workerresolution screens:
68*6236dae4SAndroid Build Coastguard Worker
69*6236dae4SAndroid Build Coastguard Worker1. Narrower columns are easier to read than wide ones. There is a reason
70*6236dae4SAndroid Build Coastguard Worker   newspapers have used columns for decades or centuries.
71*6236dae4SAndroid Build Coastguard Worker
72*6236dae4SAndroid Build Coastguard Worker2. Narrower columns allow developers to easier show multiple pieces of code
73*6236dae4SAndroid Build Coastguard Worker   next to each other in different windows. It allows two or three source
74*6236dae4SAndroid Build Coastguard Worker   code windows next to each other on the same screen - as well as multiple
75*6236dae4SAndroid Build Coastguard Worker   terminal and debugging windows.
76*6236dae4SAndroid Build Coastguard Worker
77*6236dae4SAndroid Build Coastguard Worker## Braces
78*6236dae4SAndroid Build Coastguard Worker
79*6236dae4SAndroid Build Coastguard WorkerIn if/while/do/for expressions, we write the open brace on the same line as
80*6236dae4SAndroid Build Coastguard Workerthe keyword and we then set the closing brace on the same indentation level as
81*6236dae4SAndroid Build Coastguard Workerthe initial keyword. Like this:
82*6236dae4SAndroid Build Coastguard Worker
83*6236dae4SAndroid Build Coastguard Worker```c
84*6236dae4SAndroid Build Coastguard Workerif(age < 40) {
85*6236dae4SAndroid Build Coastguard Worker  /* clearly a youngster */
86*6236dae4SAndroid Build Coastguard Worker}
87*6236dae4SAndroid Build Coastguard Worker```
88*6236dae4SAndroid Build Coastguard Worker
89*6236dae4SAndroid Build Coastguard WorkerYou may omit the braces if they would contain only a one-line statement:
90*6236dae4SAndroid Build Coastguard Worker
91*6236dae4SAndroid Build Coastguard Worker```c
92*6236dae4SAndroid Build Coastguard Workerif(!x)
93*6236dae4SAndroid Build Coastguard Worker  continue;
94*6236dae4SAndroid Build Coastguard Worker```
95*6236dae4SAndroid Build Coastguard Worker
96*6236dae4SAndroid Build Coastguard WorkerFor functions the opening brace should be on a separate line:
97*6236dae4SAndroid Build Coastguard Worker
98*6236dae4SAndroid Build Coastguard Worker```c
99*6236dae4SAndroid Build Coastguard Workerint main(int argc, char **argv)
100*6236dae4SAndroid Build Coastguard Worker{
101*6236dae4SAndroid Build Coastguard Worker  return 1;
102*6236dae4SAndroid Build Coastguard Worker}
103*6236dae4SAndroid Build Coastguard Worker```
104*6236dae4SAndroid Build Coastguard Worker
105*6236dae4SAndroid Build Coastguard Worker## 'else' on the following line
106*6236dae4SAndroid Build Coastguard Worker
107*6236dae4SAndroid Build Coastguard WorkerWhen adding an **else** clause to a conditional expression using braces, we
108*6236dae4SAndroid Build Coastguard Workeradd it on a new line after the closing brace. Like this:
109*6236dae4SAndroid Build Coastguard Worker
110*6236dae4SAndroid Build Coastguard Worker```c
111*6236dae4SAndroid Build Coastguard Workerif(age < 40) {
112*6236dae4SAndroid Build Coastguard Worker  /* clearly a youngster */
113*6236dae4SAndroid Build Coastguard Worker}
114*6236dae4SAndroid Build Coastguard Workerelse {
115*6236dae4SAndroid Build Coastguard Worker  /* probably grumpy */
116*6236dae4SAndroid Build Coastguard Worker}
117*6236dae4SAndroid Build Coastguard Worker```
118*6236dae4SAndroid Build Coastguard Worker
119*6236dae4SAndroid Build Coastguard Worker## No space before parentheses
120*6236dae4SAndroid Build Coastguard Worker
121*6236dae4SAndroid Build Coastguard WorkerWhen writing expressions using if/while/do/for, there shall be no space
122*6236dae4SAndroid Build Coastguard Workerbetween the keyword and the open parenthesis. Like this:
123*6236dae4SAndroid Build Coastguard Worker
124*6236dae4SAndroid Build Coastguard Worker```c
125*6236dae4SAndroid Build Coastguard Workerwhile(1) {
126*6236dae4SAndroid Build Coastguard Worker  /* loop forever */
127*6236dae4SAndroid Build Coastguard Worker}
128*6236dae4SAndroid Build Coastguard Worker```
129*6236dae4SAndroid Build Coastguard Worker
130*6236dae4SAndroid Build Coastguard Worker## Use boolean conditions
131*6236dae4SAndroid Build Coastguard Worker
132*6236dae4SAndroid Build Coastguard WorkerRather than test a conditional value such as a bool against TRUE or FALSE, a
133*6236dae4SAndroid Build Coastguard Workerpointer against NULL or != NULL and an int against zero or not zero in
134*6236dae4SAndroid Build Coastguard Workerif/while conditions we prefer:
135*6236dae4SAndroid Build Coastguard Worker
136*6236dae4SAndroid Build Coastguard Worker```c
137*6236dae4SAndroid Build Coastguard Workerresult = do_something();
138*6236dae4SAndroid Build Coastguard Workerif(!result) {
139*6236dae4SAndroid Build Coastguard Worker  /* something went wrong */
140*6236dae4SAndroid Build Coastguard Worker  return result;
141*6236dae4SAndroid Build Coastguard Worker}
142*6236dae4SAndroid Build Coastguard Worker```
143*6236dae4SAndroid Build Coastguard Worker
144*6236dae4SAndroid Build Coastguard Worker## No assignments in conditions
145*6236dae4SAndroid Build Coastguard Worker
146*6236dae4SAndroid Build Coastguard WorkerTo increase readability and reduce complexity of conditionals, we avoid
147*6236dae4SAndroid Build Coastguard Workerassigning variables within if/while conditions. We frown upon this style:
148*6236dae4SAndroid Build Coastguard Worker
149*6236dae4SAndroid Build Coastguard Worker```c
150*6236dae4SAndroid Build Coastguard Workerif((ptr = malloc(100)) == NULL)
151*6236dae4SAndroid Build Coastguard Worker  return NULL;
152*6236dae4SAndroid Build Coastguard Worker```
153*6236dae4SAndroid Build Coastguard Worker
154*6236dae4SAndroid Build Coastguard Workerand instead we encourage the above version to be spelled out more clearly:
155*6236dae4SAndroid Build Coastguard Worker
156*6236dae4SAndroid Build Coastguard Worker```c
157*6236dae4SAndroid Build Coastguard Workerptr = malloc(100);
158*6236dae4SAndroid Build Coastguard Workerif(!ptr)
159*6236dae4SAndroid Build Coastguard Worker  return NULL;
160*6236dae4SAndroid Build Coastguard Worker```
161*6236dae4SAndroid Build Coastguard Worker
162*6236dae4SAndroid Build Coastguard Worker## New block on a new line
163*6236dae4SAndroid Build Coastguard Worker
164*6236dae4SAndroid Build Coastguard WorkerWe never write multiple statements on the same source line, even for short
165*6236dae4SAndroid Build Coastguard Workerif() conditions.
166*6236dae4SAndroid Build Coastguard Worker
167*6236dae4SAndroid Build Coastguard Worker```c
168*6236dae4SAndroid Build Coastguard Workerif(a)
169*6236dae4SAndroid Build Coastguard Worker  return TRUE;
170*6236dae4SAndroid Build Coastguard Workerelse if(b)
171*6236dae4SAndroid Build Coastguard Worker  return FALSE;
172*6236dae4SAndroid Build Coastguard Worker```
173*6236dae4SAndroid Build Coastguard Worker
174*6236dae4SAndroid Build Coastguard Workerand NEVER:
175*6236dae4SAndroid Build Coastguard Worker
176*6236dae4SAndroid Build Coastguard Worker```c
177*6236dae4SAndroid Build Coastguard Workerif(a) return TRUE;
178*6236dae4SAndroid Build Coastguard Workerelse if(b) return FALSE;
179*6236dae4SAndroid Build Coastguard Worker```
180*6236dae4SAndroid Build Coastguard Worker
181*6236dae4SAndroid Build Coastguard Worker## Space around operators
182*6236dae4SAndroid Build Coastguard Worker
183*6236dae4SAndroid Build Coastguard WorkerPlease use spaces on both sides of operators in C expressions. Postfix **(),
184*6236dae4SAndroid Build Coastguard Worker[], ->, ., ++, --** and Unary **+, -, !, ~, &** operators excluded they should
185*6236dae4SAndroid Build Coastguard Workerhave no space.
186*6236dae4SAndroid Build Coastguard Worker
187*6236dae4SAndroid Build Coastguard WorkerExamples:
188*6236dae4SAndroid Build Coastguard Worker
189*6236dae4SAndroid Build Coastguard Worker```c
190*6236dae4SAndroid Build Coastguard Workerbla = func();
191*6236dae4SAndroid Build Coastguard Workerwho = name[0];
192*6236dae4SAndroid Build Coastguard Workerage += 1;
193*6236dae4SAndroid Build Coastguard Workertrue = !false;
194*6236dae4SAndroid Build Coastguard Workersize += -2 + 3 * (a + b);
195*6236dae4SAndroid Build Coastguard Workerptr->member = a++;
196*6236dae4SAndroid Build Coastguard Workerstruct.field = b--;
197*6236dae4SAndroid Build Coastguard Workerptr = &address;
198*6236dae4SAndroid Build Coastguard Workercontents = *pointer;
199*6236dae4SAndroid Build Coastguard Workercomplement = ~bits;
200*6236dae4SAndroid Build Coastguard Workerempty = (!*string) ? TRUE : FALSE;
201*6236dae4SAndroid Build Coastguard Worker```
202*6236dae4SAndroid Build Coastguard Worker
203*6236dae4SAndroid Build Coastguard Worker## No parentheses for return values
204*6236dae4SAndroid Build Coastguard Worker
205*6236dae4SAndroid Build Coastguard WorkerWe use the 'return' statement without extra parentheses around the value:
206*6236dae4SAndroid Build Coastguard Worker
207*6236dae4SAndroid Build Coastguard Worker```c
208*6236dae4SAndroid Build Coastguard Workerint works(void)
209*6236dae4SAndroid Build Coastguard Worker{
210*6236dae4SAndroid Build Coastguard Worker  return TRUE;
211*6236dae4SAndroid Build Coastguard Worker}
212*6236dae4SAndroid Build Coastguard Worker```
213*6236dae4SAndroid Build Coastguard Worker
214*6236dae4SAndroid Build Coastguard Worker## Parentheses for sizeof arguments
215*6236dae4SAndroid Build Coastguard Worker
216*6236dae4SAndroid Build Coastguard WorkerWhen using the sizeof operator in code, we prefer it to be written with
217*6236dae4SAndroid Build Coastguard Workerparentheses around its argument:
218*6236dae4SAndroid Build Coastguard Worker
219*6236dae4SAndroid Build Coastguard Worker```c
220*6236dae4SAndroid Build Coastguard Workerint size = sizeof(int);
221*6236dae4SAndroid Build Coastguard Worker```
222*6236dae4SAndroid Build Coastguard Worker
223*6236dae4SAndroid Build Coastguard Worker## Column alignment
224*6236dae4SAndroid Build Coastguard Worker
225*6236dae4SAndroid Build Coastguard WorkerSome statements cannot be completed on a single line because the line would be
226*6236dae4SAndroid Build Coastguard Workertoo long, the statement too hard to read, or due to other style guidelines
227*6236dae4SAndroid Build Coastguard Workerabove. In such a case the statement spans multiple lines.
228*6236dae4SAndroid Build Coastguard Worker
229*6236dae4SAndroid Build Coastguard WorkerIf a continuation line is part of an expression or sub-expression then you
230*6236dae4SAndroid Build Coastguard Workershould align on the appropriate column so that it is easy to tell what part of
231*6236dae4SAndroid Build Coastguard Workerthe statement it is. Operators should not start continuation lines. In other
232*6236dae4SAndroid Build Coastguard Workercases follow the 2-space indent guideline. Here are some examples from
233*6236dae4SAndroid Build Coastguard Workerlibcurl:
234*6236dae4SAndroid Build Coastguard Worker
235*6236dae4SAndroid Build Coastguard Worker```c
236*6236dae4SAndroid Build Coastguard Workerif(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) &&
237*6236dae4SAndroid Build Coastguard Worker   (handle->set.httpversion != CURL_HTTP_VERSION_1_0) &&
238*6236dae4SAndroid Build Coastguard Worker   (handle->set.httpreq == HTTPREQ_GET ||
239*6236dae4SAndroid Build Coastguard Worker    handle->set.httpreq == HTTPREQ_HEAD))
240*6236dae4SAndroid Build Coastguard Worker  /* did not ask for HTTP/1.0 and a GET or HEAD */
241*6236dae4SAndroid Build Coastguard Worker  return TRUE;
242*6236dae4SAndroid Build Coastguard Worker```
243*6236dae4SAndroid Build Coastguard Worker
244*6236dae4SAndroid Build Coastguard WorkerIf no parenthesis, use the default indent:
245*6236dae4SAndroid Build Coastguard Worker
246*6236dae4SAndroid Build Coastguard Worker```c
247*6236dae4SAndroid Build Coastguard Workerdata->set.http_disable_hostname_check_before_authentication =
248*6236dae4SAndroid Build Coastguard Worker  (0 != va_arg(param, long)) ? TRUE : FALSE;
249*6236dae4SAndroid Build Coastguard Worker```
250*6236dae4SAndroid Build Coastguard Worker
251*6236dae4SAndroid Build Coastguard WorkerFunction invoke with an open parenthesis:
252*6236dae4SAndroid Build Coastguard Worker
253*6236dae4SAndroid Build Coastguard Worker```c
254*6236dae4SAndroid Build Coastguard Workerif(option) {
255*6236dae4SAndroid Build Coastguard Worker  result = parse_login_details(option, strlen(option),
256*6236dae4SAndroid Build Coastguard Worker                               (userp ? &user : NULL),
257*6236dae4SAndroid Build Coastguard Worker                               (passwdp ? &passwd : NULL),
258*6236dae4SAndroid Build Coastguard Worker                               NULL);
259*6236dae4SAndroid Build Coastguard Worker}
260*6236dae4SAndroid Build Coastguard Worker```
261*6236dae4SAndroid Build Coastguard Worker
262*6236dae4SAndroid Build Coastguard WorkerAlign with the "current open" parenthesis:
263*6236dae4SAndroid Build Coastguard Worker
264*6236dae4SAndroid Build Coastguard Worker```c
265*6236dae4SAndroid Build Coastguard WorkerDEBUGF(infof(data, "Curl_pp_readresp_ %d bytes of trailing "
266*6236dae4SAndroid Build Coastguard Worker             "server response left\n",
267*6236dae4SAndroid Build Coastguard Worker             (int)clipamount));
268*6236dae4SAndroid Build Coastguard Worker```
269*6236dae4SAndroid Build Coastguard Worker
270*6236dae4SAndroid Build Coastguard Worker## Platform dependent code
271*6236dae4SAndroid Build Coastguard Worker
272*6236dae4SAndroid Build Coastguard WorkerUse **#ifdef HAVE_FEATURE** to do conditional code. We avoid checking for
273*6236dae4SAndroid Build Coastguard Workerparticular operating systems or hardware in the #ifdef lines. The HAVE_FEATURE
274*6236dae4SAndroid Build Coastguard Workershall be generated by the configure script for Unix-like systems and they are
275*6236dae4SAndroid Build Coastguard Workerhard-coded in the `config-[system].h` files for the others.
276*6236dae4SAndroid Build Coastguard Worker
277*6236dae4SAndroid Build Coastguard WorkerWe also encourage use of macros/functions that possibly are empty or defined
278*6236dae4SAndroid Build Coastguard Workerto constants when libcurl is built without that feature, to make the code
279*6236dae4SAndroid Build Coastguard Workerseamless. Like this example where the **magic()** function works differently
280*6236dae4SAndroid Build Coastguard Workerdepending on a build-time conditional:
281*6236dae4SAndroid Build Coastguard Worker
282*6236dae4SAndroid Build Coastguard Worker```c
283*6236dae4SAndroid Build Coastguard Worker#ifdef HAVE_MAGIC
284*6236dae4SAndroid Build Coastguard Workervoid magic(int a)
285*6236dae4SAndroid Build Coastguard Worker{
286*6236dae4SAndroid Build Coastguard Worker  return a + 2;
287*6236dae4SAndroid Build Coastguard Worker}
288*6236dae4SAndroid Build Coastguard Worker#else
289*6236dae4SAndroid Build Coastguard Worker#define magic(x) 1
290*6236dae4SAndroid Build Coastguard Worker#endif
291*6236dae4SAndroid Build Coastguard Worker
292*6236dae4SAndroid Build Coastguard Workerint content = magic(3);
293*6236dae4SAndroid Build Coastguard Worker```
294*6236dae4SAndroid Build Coastguard Worker
295*6236dae4SAndroid Build Coastguard Worker## No typedefed structs
296*6236dae4SAndroid Build Coastguard Worker
297*6236dae4SAndroid Build Coastguard WorkerUse structs by all means, but do not typedef them. Use the `struct name` way
298*6236dae4SAndroid Build Coastguard Workerof identifying them:
299*6236dae4SAndroid Build Coastguard Worker
300*6236dae4SAndroid Build Coastguard Worker```c
301*6236dae4SAndroid Build Coastguard Workerstruct something {
302*6236dae4SAndroid Build Coastguard Worker   void *valid;
303*6236dae4SAndroid Build Coastguard Worker   size_t way_to_write;
304*6236dae4SAndroid Build Coastguard Worker};
305*6236dae4SAndroid Build Coastguard Workerstruct something instance;
306*6236dae4SAndroid Build Coastguard Worker```
307*6236dae4SAndroid Build Coastguard Worker
308*6236dae4SAndroid Build Coastguard Worker**Not okay**:
309*6236dae4SAndroid Build Coastguard Worker
310*6236dae4SAndroid Build Coastguard Worker```c
311*6236dae4SAndroid Build Coastguard Workertypedef struct {
312*6236dae4SAndroid Build Coastguard Worker   void *wrong;
313*6236dae4SAndroid Build Coastguard Worker   size_t way_to_write;
314*6236dae4SAndroid Build Coastguard Worker} something;
315*6236dae4SAndroid Build Coastguard Workersomething instance;
316*6236dae4SAndroid Build Coastguard Worker```
317