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